假设我有几个线程,他们访问地址A + 0,A + 4,A + 8,A + 12(每个访问=下一个线程)的内存。这种访问是合并的,对吗?
但是,如果我以相反的顺序访问相同的内存,则意味着:
thread 0 -> A+12
thread 1 -> A+8
thread 2 -> A+4
thread 3 -> A+0
这里的合并也会被触发吗?
答案 0 :(得分:8)
是的,对于cc 2.0和更新的GPU,只要所有请求的32位数据元素来自(请求)相同的128字节,就会对32位数据元素随机排列到线程进行合并(全局存储器中的128字节对齐区域。
GPU在内存控制器中有类似“纵横开关”的东西,可根据需要分配元素。您可能对讨论合并的this GPU webinar感兴趣,并将以图形方式说明此特定情况(在幻灯片12中)。
NVIDIA webinar page还有其他您可能感兴趣的有用网络研讨会。
对于pre-cc2.0设备the specifics vary by compute capability,但计算1.0和1.1的设备不具备合并“逆序”或随机顺序的读取的能力。
答案 1 :(得分:2)
值得注意的是,Nvidia GPU中L2缓存的主要目的是折叠读取和合并写入。因此,如果一个warp正在访问
thread 0 -> A+0
thread 1 -> A+8
thread 2 -> A+16
thread 3 -> A+24
...
另一个warp正在访问
thread 0 -> A+4
thread 1 -> A+12
thread 2 -> A+20
thread 3 -> A+28
...
这两个访问不会在SM内部合并,但通常会在L2缓存中合并,因此GPU内存只会被触摸一次。