gpt4 book ai didi

c - 为什么在查找倾斜内存地址的行时需要 char* 强制转换?

转载 作者:行者123 更新时间:2023-11-30 16:17:17 24 4
gpt4 key购买 nike

我正在阅读文档,并阅读了第 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() 第二行的 row 定义中需要 char* 转换。另外,我不明白为什么 devPtr 是 float* 。它不应该是一个 float **吗?

最佳答案

I don't understand why the char* cast is required

因为 pitch 是一个以字节为单位的值,将指针强制转换为 char* 允许将间距添加为分配中行的字节偏移量。如果没有进行强制转换,则偏移量将与原始类型中的字节数之比不正确。

Why devPtr is a float*. Shouldn't it be a float**?

没有。

倾斜内存是连续内存的单个分配,由单个指针引用,就像使用 malloccudaMalloc 分配的普通内存一样。它唯一的特别之处在于它的大小是经过计算的,以便存储在内存中的行数据可以填充到与 GPU 上的内存 Controller 和纹理寻址单元最佳/兼容的长度。这就是寻址计算中需要节距的原因——节距是所请求的大小,包括必要的填充。

关于c - 为什么在查找倾斜内存地址的行时需要 char* 强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56295415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com