繁体   English   中英

关于对齐的3个问题

[英]3 questions about alignment

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

问题1

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

问题2

结构传递给CUDA内核的操作指出,“不需要对齐部分”。 但是如果不对齐,对该结构的访问将分为对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字节。 仅当ab恰好跨越128字节边界时,您才获得两个事务。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM