cuda校准256字节真的?

cuda校准256字节真的?,cuda,textures,Cuda,Textures,在“CUDA C编程指南5.0”中,p73()表示“驻留在全局内存中的变量的任何地址,或由一个内存分配例程从驱动程序或运行时API返回的变量的任何地址,始终与至少256字节对齐”。我不知道这句话的确切意思。谁能给我举个例子吗?非常感谢 衍生问题: 那么,分配基本元素(如int)的一维数组或自定义元素怎么样?数组的起始地址是256B的倍数,而数组中每个元素的地址不一定是256B的倍数 使用CUDA运行时的任何设备内存分配函数(例如cudamaloc或cudamalocpatch)分配的指针保证是2

在“CUDA C编程指南5.0”中,p73()表示“驻留在全局内存中的变量的任何地址,或由一个内存分配例程从驱动程序或运行时API返回的变量的任何地址,始终与至少256字节对齐”。我不知道这句话的确切意思。谁能给我举个例子吗?非常感谢

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

使用CUDA运行时的任何设备内存分配函数(例如
cudamaloc
cudamalocpatch
)分配的指针保证是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
字段获得设备指针对齐


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

任何cudaMalloc的起始地址都是256的倍数。256是十六进制的两个符号,在addrexx中为零;因此,您可以获得类似0x0456ad00的地址,而不是0x0456ad80。提供纹理到通过Cudamaloc()分配的内存的方便绑定,而无需使用纹理偏移量,这是Cudamaloc()提供的指针对齐性能之外的另一个原因。我添加了一个衍生问题。请帮我弄清楚@sgar91。你确定
cudamaloc()
的任何结果的对齐度不低于
cudaDeviceProp::textureAllignment
?@einpoklum是的,据我测试,我在不同的设备上得到了相同的行为。对齐不小于
cudaDeviceProp::textureAlignment