Cuda 关于对齐的3个问题

Cuda 关于对齐的3个问题,cuda,Cuda,讨论仅限于计算能力2.x 问题1 curandState的大小为48字节(由sizeof()度量)。分配CurandState数组时,是否以某种方式填充每个元素(例如,填充到64字节)?或者它们只是连续地放在内存中 问题2 OP of声明“对齐部分是不必要的”。但是,如果没有对齐,进入该结构的通道将分为两个连续的通道a和b。对吧? 问题3 struct { double x, y, z; }Position 假设每个线程正在访问上面的结构: int globalThreadID=blo

讨论仅限于计算能力2.x

问题1

curandState的大小为48字节(由sizeof()度量)。分配CurandState数组时,是否以某种方式填充每个元素(例如,填充到64字节)?或者它们只是连续地放在内存中

问题2

OP of声明“对齐部分是不必要的”。但是,如果没有对齐,进入该结构的通道将分为两个连续的通道a和b。对吧?

问题3

struct
{
    double x, y, z;
}Position
假设每个线程正在访问上面的结构:

int globalThreadID=blockIdx.x*blockDim.x+threadIdx.x;
Position positionRegister=positionGlobal[globalThreadID];
为了优化内存访问,我应该简单地使用三个单独的双变量x、y、z来替换结构吗

谢谢你的时间

(1)它们在内存中连续放置

(2) 如果阵列位于全局内存中,则每个内存事务为128字节,与128字节对齐。只有当
a
b
恰好跨越128字节的边界时,您才能获得两个事务

(3) 使用数组结构而不是结构数组通常可以提高性能。这意味着你将所有的
x
打包成一个数组,然后
y
依此类推。当您查看扭曲中的所有32条线程到达需要的点时(例如,
x
)会发生什么时,这是有意义的。通过将所有值打包在一起,warp中的所有线程都可以使用尽可能少的事务进行服务。由于全局内存事务是128字节,这意味着如果值是32位字,则单个事务可以服务于所有线程。您给出的代码示例可能会导致编译器将值保留在寄存器中,直到需要它们为止。

(1)它们被连续地放置在内存中

(2) 如果阵列位于全局内存中,则每个内存事务为128字节,与128字节对齐。只有当
a
b
恰好跨越128字节的边界时,您才能获得两个事务

(3) 使用数组结构而不是结构数组通常可以提高性能。这意味着你将所有的
x
打包成一个数组,然后
y
依此类推。当您查看扭曲中的所有32条线程到达需要的点时(例如,
x
)会发生什么时,这是有意义的。通过将所有值打包在一起,warp中的所有线程都可以使用尽可能少的事务进行服务。由于全局内存事务是128字节,这意味着如果值是32位字,则单个事务可以服务于所有线程。您给出的代码示例可能会导致编译器将值保留在寄存器中,直到需要它们为止