比方说,我有几个线程,它们在地址A + 0,A + 4,A + 8,A + 12(每个接入=下一个线程)访问内存。 这样的访问被合并,对不对?
但是,如果我有机会获得同样的内存,但以相反的顺序,这意味着:
thread 0 -> A+12
thread 1 -> A+8
thread 2 -> A+4
thread 3 -> A+0
被合并在这里也引发?
比方说,我有几个线程,它们在地址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具有类似在存储器控制器根据需要,将分配元件“纵横开关”。 你可能有兴趣在此GPU网络研讨会其论述了聚结,并且将图示地说明此特定情况下(在滑动件12)。
在NVIDIA研讨会页面具有其他有用的网络研讨会,你可能感兴趣的为好。
对于CC2.0预设备的具体计算能力而变化 ,但计算1.0和1.1能力的设备不具有这种能力聚结读取处于“逆序”或随机顺序。
另外值得一提的是,L2缓存的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
...
这两个访问不会聚结SM里面,但一般会在L2缓存合并,使GPU内存仅会被感动。