我将2D矩阵平铺为固定大小BLOCK_DIM 16*16
的块。然后我发现dimGrid
是(来自互联网):
dim3 dimGrid((NColumns - 1)/16 + 1, (NRows - 1)/16 + 1).
这不是逆转了吗?难道不是第一个Nrows吗?
答案 0 :(得分:1)
如果我正在编写代码,我可能会按照您展示的方式编写代码。
我想到了这样的x,y笛卡尔空间:
Y
^
|
|
+------->X
即,“X”轴是“水平”轴,“Y”轴是垂直轴。它没有理由这样 - 它只是一个心理模型。但我认为这很常见。
现在,如果x,y空间用于表示2D图像,那么当我从右向左移动时(即沿水平轴),我在图像中从一列移动到另一列。当我上下移动时(即沿着垂直轴)我在图像中从一行移动到另一行。
因此,对于此心理模型,Y坐标表示行,X坐标表示图像的列。因此,X坐标的最大(逻辑)值等于图像中的列数,Y坐标的最大值等于图像中的行数。对于建议的dimGrid
变量定义:
dim3 dimGrid((NColumns - 1)/16 + 1, (NRows - 1)/16 + 1).
由于首先显示x
网格维度,因此我们看到此“心理模型”与dimGrid
的定义一致。
这种用法通常也意味着对于CUDA中的图像处理算法,X中的相邻线程将具有“自然”计算的2D索引:
int idx = threadIdx.x + blockDim.x*blockIdx.x;
int idy = threadIdx.y + blockDim.y*blockIdx.y;
或:
int col = threadIdx.x + blockDim.x*blockIdx.x;
int row = threadIdx.y + blockDim.y*blockIdx.y;
使得它们在图像中具有相邻的X值或相邻的“列”。在C风格的行主存储中,在X中(在网格中)具有相邻线程访问图像中的相邻列通常是在内核中实现合并访问的良好方法。