Memory 按相反顺序访问内存时是否触发合并?

Memory 按相反顺序访问内存时是否触发合并?,memory,cuda,coalesce,Memory,Cuda,Coalesce,假设我有几个线程,它们在地址A+0、A+4、A+8、A+12处访问内存(每个访问=下一个线程)。这种访问是联合的,对吗 但是,如果我访问相同的内存,但顺序相反,这意味着: thread 0 -> A+12 thread 1 -> A+8 thread 2 -> A+4 thread 3 -> A+0 这里是否也触发了合并?是的,对于cc 2.0和更新的GPU,只要所有请求的32位数据元素来自(请求自)全局内存中相同的128字节(和128字节对齐)区域,32位数据元素到线

假设我有几个线程,它们在地址A+0、A+4、A+8、A+12处访问内存(每个访问=下一个线程)。这种访问是联合的,对吗

但是,如果我访问相同的内存,但顺序相反,这意味着:

thread 0 -> A+12
thread 1 -> A+8
thread 2 -> A+4
thread 3 -> A+0

这里是否也触发了合并?

是的,对于cc 2.0和更新的GPU,只要所有请求的32位数据元素来自(请求自)全局内存中相同的128字节(和128字节对齐)区域,32位数据元素到线程的任何随机排列都会发生合并

GPU在内存控制器中有一个类似“交叉开关”的东西,可以根据需要分配元素。您可能会对讨论合并的内容感兴趣,并将以图形的方式说明此特定案例(见幻灯片12)

网站上还有其他你可能感兴趣的有用的网络研讨会


对于cc2.0之前的设备,但支持compute 1.0和1.1的设备不具备合并“逆序”或随机顺序的读取的能力。

同样值得注意的是,Nvidia GPU中二级缓存的主要用途是折叠读取和合并写入。所以如果有一个扭曲进入

thread 0 -> A+0
thread 1 -> A+8
thread 2 -> A+16
thread 3 -> A+24
...
thread 0 -> A+4
thread 1 -> A+12
thread 2 -> A+20
thread 3 -> A+28
...
另一条经线正在接近

thread 0 -> A+0
thread 1 -> A+8
thread 2 -> A+16
thread 3 -> A+24
...
thread 0 -> A+4
thread 1 -> A+12
thread 2 -> A+20
thread 3 -> A+28
...

这两个访问不会在SM内部合并,但通常会在二级缓存中合并,因此GPU内存只会被触摸一次。

非常感谢。记录在案的还有本次网络研讨会的视频:你对此有参考资料吗?我认为这适用于读取,但适用于写入,GPU是否会尝试将出现在不同扭曲和不同SMs中的事务对齐,以便它们在完全相同的时间发生,以便它们可以由L2组合?或者,在将数据写入全局内存之前,二级缓存是否会“保留”数据一段时间以查看是否有更多更新?@RogerDahl二级缓存是一个“写回”缓存()。它将崩溃(通常会被逐出、鞭打等)读取和合并(再次,通常)写入。您可能想了解一下。@RobertCrovella:谢谢您的链接。信息量很大。我现在明白了。