关于对齐的3个问题

时间:2012-09-09 03:06:26

标签: cuda

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

问题1

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

问题2

Passing structs to CUDA kernels的OP声明“对齐部分是不必要的”。但是没有对齐,访问该结构将分为两个连续访问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 个答案:

答案 0 :(得分:1)

(1)它们被连续放置在记忆中。

(2)如果数组在全局内存中,则每个内存事务为128个字节,对齐为128个字节。仅当ab碰巧跨越128字节边界时,才会收到两笔交易。

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