0

如果同一块中的所有线程访问相同的地址,即用于旧功能的数组 [0],存在存储库冲突,但对于最新功能(即 GPU V100 为 7.0 或 A100 为 8.0)仍然存在此冲突?

4

1 回答 1

1

在这个 Nvidia 博客中,https://developer.nvidia.com/blog/using-shared-memory-cuda-cc/计算能力 2.0 据说具有多播(和广播)功能,可将地址冲突转换为单个内存请求。并非所有的银行冲突都是相同的地址,而是不同地址的模计算结果相同。

在您的示例中,访问同一地址的所有线程都将进行广播操作。要发生真正的银行冲突,您需要访问多个地址,如 0、stride、stride x 2、stride x3 等,这样就没有多播,而是在同一个(共享)内存银行上进行序列化。

Volta 架构仍然存在共享银行冲突https://www.google.com/url?sa=t&source=web&rct=j&url=https://on-demand.gputechconf.com/gtc/2018/presentation/s81006-volta-architecture -and-performance-optimization.pdf&ved=2ahUKEwiUgtuAk-j1AhVnSfEDHXSuDO8QFnoECAMQAQ&usg=AOvVaw1B_nCTzH7Vsuud2gKvObnJ

如果共享内存有 32 个 bank,那么对于同时访问的 32 位对齐的 nth、n+32nd、n+64th、...地址,就会发生 bank 冲突。除非他们发明了双流水线共享内存库。

于 2022-02-05T08:32:39.833 回答