问题描述
如上图红框所示,我不明白为什么一个线程连续访问两个数组会引起bank冲突,但是如下图的访问不会引起冲突。
感谢您的回答!!!
解决方法
https://developer.nvidia.com/blog/using-shared-memory-cuda-cc/
共享内存库冲突
为了实现并发访问的高内存带宽,共享内存被划分为可以同时访问的相同大小的内存模块(组)。因此,可以同时为跨越 b 个不同存储器组的任何 n 个地址的存储器加载或存储提供服务,产生的有效带宽是单个存储器组带宽的 b 倍。
然而,如果多个线程请求的地址映射到同一个内存组,访问将被序列化。硬件根据需要将冲突的内存请求拆分为多个单独的无冲突请求,从而将有效带宽减少与冲突内存请求数量相等的因子。一个例外是 warp 中的所有线程寻址相同的共享内存地址,从而导致广播。计算能力 2.0 及更高版本的设备具有多播共享内存访问的额外能力,这意味着一个经线中任意数量的线程对同一位置的多次访问是同时提供的。
让我们假设您的并行缩减示例有 8 个大小为 4 字节的内存组。元素 i 由银行 i % 8 提供服务。
然后,在第一个示例中,银行 0、2、4、6 需要处理两个请求。
在第二个例子中,每家银行只需要处理一个请求。