CUDA c++指针类型转换



我正在看CUDA c++文档。但是关于指针类型转换,有些东西我没有弄明白。下面是主机和设备代码。

// Host code
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];
}
}
}

可以看到,devPtr被类型转换为char。但是我不明白为什么要转换为char而不是float类型。

这是处理一个倾斜分配(由cudaMallocPitch()创建的类型)。

一个倾斜的分配"round up"分配给特定音高的请求宽度,该音高以字节:

指定
cudaMallocPitch(&devPtr, &pitch,
^
| 
this value is indicated by the function as a row width or "pitch" in bytes

因为间距是以字节为单位指定的,所以要获得正确的指针算术:

((char*)devPtr + r * pitch);
^
|
pointer arithmetic

指针类型也必须是字节类型。该代码片段的目标是将devPtr增加r指定的行数,每行由pitch个字节组成。

我敢说,在CUDA中,没有任何东西可以保证cudaMallocPitch返回的pitch的任何特定粒度。例如,理论上它可以是奇数字节数,也可以是素数字节数。因此,将pitch值预先转换为其他类型宽度中的等效(指针算术)偏移量的技巧是不允许的。

最新更新