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