1

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

问题 1

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

问题2

将结构传递给 CUDA 内核的 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 来替换结构吗?

谢谢你的时间!

4

1 回答 1

1

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

(2) 如果数组在全局内存中,每个内存事务为128字节,对齐到128字节。a只有当并且b恰好跨越 128 字节边界时,您才会获得两个事务。

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

于 2012-09-09T04:52:43.163 回答