如果同一块中的所有线程访问相同的地址,即用于旧功能的数组 [0],存在存储库冲突,但对于最新功能(即 GPU V100 为 7.0 或 A100 为 8.0)仍然存在此冲突?
问问题
35 次
1 回答
1
在这个 Nvidia 博客中,https://developer.nvidia.com/blog/using-shared-memory-cuda-cc/计算能力 2.0 据说具有多播(和广播)功能,可将地址冲突转换为单个内存请求。并非所有的银行冲突都是相同的地址,而是不同地址的模计算结果相同。
在您的示例中,访问同一地址的所有线程都将进行广播操作。要发生真正的银行冲突,您需要访问多个地址,如 0、stride、stride x 2、stride x3 等,这样就没有多播,而是在同一个(共享)内存银行上进行序列化。
如果共享内存有 32 个 bank,那么对于同时访问的 32 位对齐的 nth、n+32nd、n+64th、...地址,就会发生 bank 冲突。除非他们发明了双流水线共享内存库。
于 2022-02-05T08:32:39.833 回答