我测试了两种不同的方法来在 CUDA 内核中复制 2D 数组。
第一个启动 TILE_DIM x TILE_DIM 线程块。每个块复制数组的一个图块,为每个元素分配一个线程:
__global__ void simple_copy(float *outdata, const float *indata){
int x = blockIdx.x * TILE_DIM + threadIdx.x;
int y = blockIdx.y * TILE_DIM + threadIdx.y;
int width = gridDim.x * TILE_DIM;
outdata[y*width + x] = indata[y*width + x];
}
Run Code Online (Sandbox Code Playgroud)
第二个摘自NVIDIA 博客。它与之前的内核类似,但每个块使用 TILE_DIM x BLOCK_ROWS 线程。每个线程循环遍历矩阵的多个元素:
__global__ void fast_copy(float *outdata, const float *indata)
{
int x = blockIdx.x * TILE_DIM + threadIdx.x;
int y = blockIdx.y * TILE_DIM + threadIdx.y;
int …Run Code Online (Sandbox Code Playgroud) cuda ×1