在“CUDA C编程指南5.0”中,p73(also here)表示“驻留在全局内存中或由驱动程序或运行时API中的一个内存分配例程返回的变量的任何地址始终与至少256字节“。我不知道这句话的确切含义。谁能为我展示一个例子?非常感谢。
衍生问题: 那么,如何分配基本元素(如int)或自定义元素的一维数组呢?数组的起始地址是256B的倍数,而数组中每个元素的地址不一定是256B的倍数?
答案 0 :(得分:10)
使用任何CUDA运行时设备内存分配函数(例如cudaMalloc
或cudaMallocPitch
分配的指针保证是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
字段获取设备指针对齐。
指针的对齐也是将指针绑定到纹理的必要条件。