CUDA 4.0 编程指南第 21 页上有一个示例(如下所示)来说明循环
设备内存中二维浮点数组的元素。 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
设备内存指针已转换为字符指针 char*,在global核函数?有人可以解释一下那条线吗?看起来有点奇怪。
这是由于方法指针算术在 C 中工作。当你添加一个整数时x
到一个指针p
,它并不总是添加x
字节。它添加了x
times sizeof(*p)
(p 指向的对象的大小)。
float* row = (float*)((char*)devPtr + r * pitch);
通过铸造devPtr
to a char*
,所应用的偏移量(r * pitch*
) 的数量以 1 字节为增量。 (因为一个char
是一个字节)。如果不存在强制转换,则应用于 devPtr 的偏移量将为r * pitch
times 4字节,作为float
是四个字节。
例如,如果我们有:
float* devPtr = 1000;
int r = 4;
现在,让我们忽略演员阵容:
float* result1 = (devPtr + r);
// result1 = devPtr + (r * sizeof(float)) = 1016;
现在,如果我们包括演员阵容:
float* result2 = (float*)((char*)devPtr + r);
// result2 = devPtr + (r * sizeof(char)) = 1004;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)