在使用cuda进行编程时,协同和Bank冲突有什么区别?
仅仅是因为协同发生在全局内存而Bank冲突发生在共享内存吗?
如果我有一块支持>1.2的GPU,我需要担心协同吗?它会自己处理协同吗?
在使用cuda进行编程时,协同和Bank冲突有什么区别?
仅仅是因为协同发生在全局内存而Bank冲突发生在共享内存吗?
如果我有一块支持>1.2的GPU,我需要担心协同吗?它会自己处理协同吗?
是的,合并读/写适用于全局读取,并且银行冲突适用于共享内存读/写。
不同的计算能力设备在这里有不同的行为,但是1.2 GPU仍然需要注意确保您正在合并读取和写入 - 只是有一些优化使事情更容易。
您应该阅读CUDA最佳实践指南。这涵盖了这两个问题的许多细节。
A >1.2 GPU会尽其所能地针对强制操作(coalescing)进行最佳优化,即将相同大小的内存访问分组,使其适合256字节的同一内存原子,并将它们作为1次内存写入写出。GPU将负责重新排序访问并将其对齐到正确的内存边界。(在早期的GPU中,warp内的内存事务必须对齐到内存原子并按正确的顺序排列。)
然而,为了实现最佳性能,仍需要确保具有这些强制操作机会。如果warp内的所有线程都有完全不同的内存事务,则强制器无法执行任何操作,因此,仍需注意内核的内存本地性行为。