gpt4 book ai didi

cuda - 2D 纹理的间距对齐

转载 作者:行者123 更新时间:2023-12-04 18:11:39 29 4
gpt4 key购买 nike

2D 纹理是 CUDA 在图像处理应用中的一个有用特性。要将音高线性内存绑定(bind)到 2D 纹理,内存必须对齐。 cudaMallocPitch是对齐内存分配的好选择。在我的设备上,cudaMallocPitch 返回的音高是 512 的倍数,即内存是 512 字节对齐的。

设备的实际对齐要求由 cudaDeviceProp::texturePitchAlignment 确定在我的设备上是 32 个字节。

我的问题是:

如果 2D 纹理的实际对齐要求是 32 字节,那么 cudaMallocPitch返回 512 字节对齐的内存?

这不是浪费内存吗?例如,如果我创建一个大小为 513 x 100 的 8 位图像,它将占用 1024 x 100 字节。

我在以下系统上得到这种行为:

1:华硕 G53JW + Windows 8 x64 + GeForce GTX 460M + CUDA 5 + Core i7 740QM + 4GB RAM

2:戴尔 Inspiron N5110 + Windows 7 x64 + GeForce GT525M + CUDA 4.2 + Corei7 2630QM + 6GB RAM

最佳答案

这是一个略微推测的答案,但请记住,分配的间距必须满足纹理的两个对齐属性,一个用于纹理指针,一个用于纹理行。我怀疑 cudaMallocPitch尊重前者,由 cudaDeviceProp::textureAlignment 定义.例如:

#include <cstdio>

int main(void)
{
const int ncases = 12;
const size_t widths[ncases] = { 5, 10, 20, 50, 70, 90, 100,
200, 500, 700, 900, 1000 };
const size_t height = 10;

float *vals[ncases];
size_t pitches[ncases];

struct cudaDeviceProp p;
cudaGetDeviceProperties(&p, 0);
fprintf(stdout, "Texture alignment = %zd bytes\n",
p.textureAlignment);
cudaSetDevice(0);
cudaFree(0); // establish context

for(int i=0; i<ncases; i++) {
cudaMallocPitch((void **)&vals[i], &pitches[i],
widths[i], height);
fprintf(stdout, "width = %zd <=> pitch = %zd \n",
widths[i], pitches[i]);
}

return 0;
}

在 GT320M 上给出以下信息:
Texture alignment = 256 bytes
width = 5 <=> pitch = 256
width = 10 <=> pitch = 256
width = 20 <=> pitch = 256
width = 50 <=> pitch = 256
width = 70 <=> pitch = 256
width = 90 <=> pitch = 256
width = 100 <=> pitch = 256
width = 200 <=> pitch = 256
width = 500 <=> pitch = 512
width = 700 <=> pitch = 768
width = 900 <=> pitch = 1024
width = 1000 <=> pitch = 1024

我猜 cudaDeviceProp::texturePitchAlignment适用于 CUDA 阵列。

关于cuda - 2D 纹理的间距对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12550927/

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