C-为什么要查找倾斜内存地址的行需要一个字符*



我正在阅读文档,并到达第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**吗?

否。

倾斜内存是连续内存的单个分配,由单个指针引用,就像分配给malloccudaMalloc的正常内存一样。它唯一特别的是计算其大小,以便将存储在内存中的行数据填充到与内存控制器和GPU上的纹理地址单元最佳/兼容的长度。这就是为什么在寻址计算中需要一个音高的原因 - 音高是所需的尺寸,包括必要的填充。

最新更新