在CUDA 4.0编程指南的第21页上,有一个示例(如下所示)来说明在设备存储器中循环2D浮点数组的元素.2D的尺寸是宽度*高度
// 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设备内存指针被强制转换为 …
假设你有一个指针,由类似的东西产生
int a = 5;
int* pointer = &a;
并假设您将 1 添加到指针,如
pointer = pointer + 1;
现在假设指针的原始按位表示是
00000000 00000000 00000000 00000000
那么是新的代表00000000 00000000 00000000 00000001吗?或者00000000 00000000 00000001 00000000?或者两者都没有?
我很困惑,因为我觉得给一个数字加 1 应该在它的按位表示上加 1。但是,如果将数组的索引加 1,则新地址与旧地址相差 32 位。
请尝试以下代码:
void intArrayAsPointerPrinter(int iSize){
    int * p = 0;
    int ** q = 0;
    int *** r = 0;
    for(int i = 0; i < iSize; i++) {
        printf("%p %p %p\n", p,q,r);
        p++;
        q++;
        r++;
    }
}
使用大小 3 调用它,我得到以下输出:
0x0 0x0 0x0
0x4 0x8 0x8
0x8 0x10 0x10
问:为什么(int*)++前进4而其他前进8?所有指针都应该是 4 字节还是 8 字节?