在“CUDA C Programming Guide 5.0”中,p73(也在这里)说“驻留在全局内存中或由驱动程序或运行时 API 的内存分配例程之一返回的变量的任何地址始终与至少 256 个字节对齐”。我不知道这句话的确切含义。谁能给我举个例子?非常感谢。
一个衍生问题:那么,如何分配基本元素(如 int)或自定义元素的一维数组?数组的起始地址会是256B的倍数,而数组中每个元素的地址不一定是256B的倍数?
通过使用任何 CUDA 运行时的设备内存分配函数分配的指针,例如cudaMalloc
或cudaMallocPitch
保证是 256 字节对齐的,即地址是 256 的倍数。
考虑以下示例:
char *ptr1, *ptr2;
int bytes = 1;
cudaMalloc((void**)&ptr1,bytes);
cudaMalloc((void**)&ptr2,bytes);
假设返回的地址ptr1
是 256 的某个倍数,那么返回的地址ptr2
将是 atleast (ptr1 + 256)
。
这是分配内存的设备所施加的限制。大多数情况下,指针是出于性能目的而对齐的。(一些 NVIDIA 的家伙应该能够判断是否还有其他原因)。
指针对齐并不总是 256。在我的设备(GTX460M)上,它是512。您可以通过cudaDeviceProp::textureAlignment
字段获得设备指针对齐。
指针的对齐也是将指针绑定到纹理的要求。