【发布时间】:2021-12-30 02:38:53
【问题描述】:
__global__ void Matrixcopy(float *odata, const float *idata)
{
// threadblock size = (TILE_DIM, BLOCK_ROWS) = (32, 8)
// each block copies a 32 * 32 tile
int x = blockIdx.x * TILE_DIM + threadIdx.x;
int y = blockIdx.y * TILE_DIM + threadIdx.y;
int width = gridDim.x * TILE_DIM;
for (int j = 0; j < TILE_DIM; j+= BLOCK_ROWS)
odata[(y+j)*width + x] = idata[(y+j)*width + x];
}
我对多维度数组的合并访问的概念感到很困惑。合并的全局内存访问的定义是
顺序内存访问是相邻的
根据文献Learn CUDA Programming。
对于一维数组,很容易理解线程被索引为threadIdx.x + blockDim.x * blockIdx.x,它可以很容易地映射到真正的一维数组:warp 中的相邻线程访问一维数组的相邻物理地址。
然而对于 2-dim 数组或矩阵和 2-dim 线程块,如上面的代码,我不确定我是否理解正确:warp 中的相邻线程位于同一行,即相同的 y值,不同的 x 值。如果 y = 0,则连续线程为 x = [1, 2, 3, 4, 5, 6...],并且它们访问连续地址 [1, 2, 3, 4, 5, 6...] 如果j = 0。所以这段代码是合并访问的。我理解正确吗?而这只是一个简单的cuda代码,如果我们有一个复杂的cuda内核,如何快速判断一个访问是否被合并?
【问题讨论】: