我正在阅读文档,并到达第3.2.2章。我看到了cudaMallocPitch()
的定义和解释,并且在访问某些数据成员方面有些困惑。例如:
int width = 64, height = 64;
float* devPtr;
size_t pitch;
cudaMallocPitch(&devPtr, &pitch,
width * sizeof(float), height);
MyKernel<<<100, 512>>>(devPtr, pitch, width, height);
// Device code
__global__ void MyKernel(float* devPtr,
size_t pitch, int width, int height)
{
for (int r = 0; r < height; ++r) {
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c) {
float element = row[c];
}
}
}
我不明白为什么在Mykernel((的第二行的行定义中需要char*铸件。另外,我不明白为什么DEVPTR是浮点*。不应该是float **?
我不明白为什么需要char* cast
因为pitch
是字节中的一个值,并且将指针投入到char*
中允许将音调添加为分配中行的字节偏移。如果没有铸件,则原始类型中字节数的比率是不正确的。
为什么DEVPTR是
float*
。不应该是float**
吗?
否。
倾斜内存是连续内存的单个分配,由单个指针引用,就像分配给malloc
或cudaMalloc
的正常内存一样。它唯一特别的是计算其大小,以便将存储在内存中的行数据填充到与内存控制器和GPU上的纹理地址单元最佳/兼容的长度。这就是为什么在寻址计算中需要一个音高的原因 - 音高是所需的尺寸,包括必要的填充。