这里讲讲二维数据和内存模型
1. 二维参数设置
前面已经说过,CUDA支持多维的Grid和Block,以方便处理多维数据,那么在调用Kernel时函数也会有所不同。假定需要处理一张76x62像素的图片,采用16x16的Block,则参数设置如下:
#define TILE_WIDTH 16
dim3 dimBlock(TILE_WIDTH, TILE_WIDTH, 1);
dim3 dimGrid(75 / TILE_WIDTH + 1, 61 / TILE_WIDTH + 1, 1);
这样就能确保Thread覆盖到了每一个像素,如下图所示:
其中1区域的Block每一个Thread都对应有像素,而2、3、4则不然。这会产生影响,后面再讨论。
2. 二维数组定位
在实际使用中,我们常常用行主导的一维数组代替二维数组,即,twoDim[2, 3] = oneDim[2 * numCol + 3]。
用一个矩阵相乘的例子能很好的说明:
__global__
void matMulti(float *A, float *B, float *C, int n)
{
// use 2D Idx
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
// C = A * B
if (row < n && col < n)
{