Пост о том, что такое CUDA Tile, который зарелизили в CUDA 13.3:
https://developer.nvidia.com/blog/develop-high-performance-gpu-kernels-in-cpp-with-nvidia-cuda-tile/Если кратко, то они ввели новый вид кернелов:
__tile_global__, в которых вообще не указываешь работу для отдельных потоков, а пишешь кода для обработки на уровне тайлов, а компилятор уже сам определяет, как там потоки работают между собой.
Для этого есть пространство имён
cuda::tiles.
В нём живут:
tensor_span (аналог
std::mdspan), его растаскивают на весь буфер при помощи
extents{m, n},
и обёртка
partition_view, которая нарезает буфер на те самые тайлы при помощи функции
load().
Получается, примерно, такой кернел для сложения массивов:
#include "cuda_tile.h"
__tile_global__ void vectorAdd(float* a, float* b, float* out, size_t n) {
/* set up the namespace */
namespace ct = cuda::tiles;
using namespace ct::literals;
/* attach shape to raw pointers */
auto aSpan = ct::tensor_span{a, ct::extents{n}};
auto bSpan = ct::tensor_span{b, ct::extents{n}};
auto oSpan = ct::tensor_span{out, ct::extents{n}};
/* partition each span into tiles of size 8 */
auto aView = ct::partition_view{aSpan, ct::shape{8_ic}};
auto bView = ct::partition_view{bSpan, ct::shape{8_ic}};
auto oView = ct::partition_view{oSpan, ct::shape{8_ic}};
/* load the a and b tiles from global memory */
int bx = ct::bid().x;
auto aTile = aView.load(bx); // load bx-th tile
auto bTile = bView.load(bx);
/* add the two tiles together, elementwise */
auto oTile = aTile + bTile;
/* store the result tile to the output partition. */
oView.store(oTile, bx);
}
Конкретно для такой задачи он намного сложнее обычного кода, но в нём не надо думать о переполнении памяти, гонках и так далее.
#CUDA #GPU #GPGPU