CUDA分配对齐是256字节 - 真的吗?

10
在“CUDA C Programming Guide 5.0”第73页(也可以在这里)中说,“全局内存中变量的任何地址或由驱动程序或运行时API中的内存分配例程返回的变量地址,始终对齐至少256字节”。我不知道这句话的确切含义。是否有人可以举个例子给我看看呢?非常感谢。
一个衍生问题: 那么,如果分配了一个基本元素(如int)或自定义元素的一维数组,该数组的起始地址将是256B的倍数,而数组中每个元素的地址不一定是256B的倍数呢?

3
任何cudaMalloc的起始地址都会是256的倍数。256在十六进制中用两个符号表示,它们在地址中将为零;因此您可以获得像0x0456ad00这样的地址,但不能是0x0456ad80。 - osgx
1个回答

14

使用CUDA Runtime的任何设备内存分配函数(例如cudaMalloccudaMallocPitch)分配的指针都保证是256字节对齐的,即地址是256的倍数。

考虑以下示例:

char *ptr1, *ptr2;

int bytes = 1;

cudaMalloc((void**)&ptr1,bytes);
cudaMalloc((void**)&ptr2,bytes);
假设在ptr1中返回的地址是256的倍数,则ptr2中返回的地址将至少为(ptr1 + 256)
这是在分配内存的设备上强加的限制。通常,由于性能原因,指针会对齐。(一些 NVIDIA 的人应该可以告诉是否还有其他原因)。
重要提示: 指针对齐并不总是256。在我的设备(GTX460M)上,它是512。您可以通过 cudaDeviceProp::textureAlignment 字段获取设备指针对齐方式。
指针对齐也是绑定指针到纹理的要求。

3
除了性能之外,提供指针对齐的cudaMalloc()函数还有一个好处,即方便将纹理绑定到内存而无需使用纹理偏移量。 - njuffa
我添加了一个导数问题,请帮我解决一下@sgar91。 - jsc0218
1
你确定cudaMalloc()的任何结果都不小于cudaDeviceProp::textureAlignment的对齐值吗? - einpoklum
1
@einpoklum 是的,就我所测试的情况而言,我在不同的设备上得到了相同的行为。对齐方式不少于cudaDeviceProp::textureAlignment - sgarizvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接