相关疑难解决方法(0)

将float*转换为char*,同时在设备上的线性内存中循环2-D数组

在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];
              }
     }
}
Run Code Online (Sandbox Code Playgroud)

为什么devPtr设备内存指针被强制转换为 …

c++ pointers cuda

4
推荐指数
1
解决办法
1334
查看次数

如果给指针加 1,它真的加 1,还是加 4 或 32?

假设你有一个指针,由类似的东西产生

int a = 5;
int* pointer = &a;
Run Code Online (Sandbox Code Playgroud)

并假设您将 1 添加到指针,如

pointer = pointer + 1;
Run Code Online (Sandbox Code Playgroud)

现在假设指针的原始按位表示是

00000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

那么是新的代表00000000 00000000 00000000 00000001吗?或者00000000 00000000 00000001 00000000?或者两者都没有?

我很困惑,因为我觉得给一个数字加 1 应该在它的按位表示上加 1。但是,如果将数组的索引加 1,则新地址与旧地址相差 32 位。

c c++ pointers

1
推荐指数
1
解决办法
1721
查看次数

为什么 (int*)++ 前进 4 而 (int**)++/(int***)++ 前进 8?所有指针都应该是 4 字节还是 8 字节?

请尝试以下代码:

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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用大小 3 调用它,我得到以下输出:

0x0 0x0 0x0
0x4 0x8 0x8
0x8 0x10 0x10
Run Code Online (Sandbox Code Playgroud)

问:为什么(int*)++前进4而其他前进8?所有指针都应该是 4 字节还是 8 字节?

c pointers

1
推荐指数
1
解决办法
69
查看次数

标签 统计

pointers ×3

c ×2

c++ ×2

cuda ×1