cuda对齐256bytes严重吗?

Roc*_*ock 8 textures cuda

在"CUDA C编程指南5.0"中,p73(也在这里)说"驻留在全局内存中或由驱动程序或运行时API中的一个内存分配例程返回的变量的任何地址始终对齐至少256个字节".我不知道这句话的确切含义.谁能为我展示一个例子?非常感谢.

衍生问题:那么,分配基本元素(如int)或自定义元素的一维数组呢?数组的起始地址是256B的倍数,而数组中每个元素的地址不一定是256B的倍数?

sga*_*zvi 10

通过使用任何CUDA运行时的设备内存分配函数分配的指针,例如cudaMalloccudaMallocPitch保证是256字节对齐,即地址是256的倍数.

请考虑以下示例:

char *ptr1, *ptr2;

int bytes = 1;

cudaMalloc((void**)&ptr1,bytes);
cudaMalloc((void**)&ptr2,bytes);
Run Code Online (Sandbox Code Playgroud)

假设返回的地址ptr1是256的倍数,那么返回的地址ptr2至少是(ptr1 + 256).

这是由分配存储器的设备施加的限制.大多数情况下,指针由于性能目的而对齐.(一些NVIDIA人应该能够判断是否还有其他原因).

重要:

指针对齐并不总是256.在我的设备(GTX460M)上,它是512.您可以通过cudaDeviceProp::textureAlignment字段获得设备指针对齐.

指针的对齐也是将指针绑定到纹理的要求.

  • 提供方便的纹理绑定到通过cudaMalloc()分配的内存,而不需要求助于纹理偏移是除了cudaMalloc()提供的指针对齐性能之外的另一个原因. (3认同)