首页 > 解决方案 > 为什么访问两个连续元素的线程会导致“银行冲突”?

问题描述

银行冲突

如上图红框所示,我不明白为什么一个线程连续访问两个数组的数据会导致bank冲突,但是下面的访问,如下图,不会导致冲突。

没有银行冲突

感谢您的回答!!!

标签: cudaconflict

解决方案


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 需要在第一个示例中服务两个请求。

在第二个示例中,每家银行只需要处理一个请求。


推荐阅读