什么是银行冲突?(做Cuda/OpenCL编程)

smu*_*kes 91 cuda nvidia opencl bank-conflict

我一直在阅读CUDA和OpenCL的编程指南,我无法弄清楚银行冲突是什么.他们只是倾向于如何解决问题而不详细说明主题本身.任何人都可以帮我理解吗?如果帮助是在CUDA/OpenCL的背景下,或者只是计算机科学中的银行冲突,我没有偏好.

Gri*_*zly 101

对于nvidia(以及amd),gpus将本地内存划分为内存池.每个银行一次只能处理一个数据集,因此如果半衰期试图从/向同一个银行加载/存储数据,则必须序列化访问(这是银行冲突).对于gt200 gpus,有16个库(32个用于fermi),16个或32个用于AMD gpus的库(57xx或更高版本:32,以下所有内容:16)),它们与32位的粒度交错(所以字节0-3在银行1中的银行1,4-7,...,银行1中的64-69等等).为了更好的可视化,它基本上看起来像这样:

Bank    |      1      |      2      |      3      |...
Address |  0  1  2  3 |  4  5  6  7 |  8  9 10 11 |...
Address | 64 65 66 67 | 68 69 70 71 | 72 73 74 75 |...
...
Run Code Online (Sandbox Code Playgroud)

因此,如果半转换中的每个线程访问连续的32位值,则不存在库冲突.此规则的一个例外(每个线程必须访问其自己的存储区)是广播:如果所有线程都访问相同的地址,则该值只读取一次并广播到所有线程(对于GT200,它必须是半转换中的所有线程访问相同的地址,iirc fermi和AMD gpus可以为访问相同值的任意数量的线程执行此操作.

  • 非常感谢视觉和解释.我不知道广播,这似乎是一个重要的信息:)我将如何验证我的加载和存储不会导致共享内存中的银行冲突?我是否必须以某种方式获得汇编代码或者还有其他方法吗? (3认同)
  • 因为银行冲突的发生是一些思考,这将在运行时确定(意味着编译器不知道它,毕竟大多数地址是在运行时生成的),获得编译版本将无济于事.我通常以旧的方式做这件事,建议我拿笔和纸,开始考虑我的代码存储在哪里.毕竟,管理银行冲突发生的规则并不复杂.否则你可以使用nvidia OpenCL profiler(应该与sdk,iirc捆绑在一起).我认为它有一个warp序列化的计数器. (3认同)

bel*_*ood 13

可以并行访问的共享内存分为模块(也称为库).如果两个内存位置(地址)出现在同一个存储区中,则会发生存储库冲突,在此期间串行完成访问,从而失去并行访问的优势.


Nit*_*nal 8

简而言之,当任何存储器访问模式无法在存储器系统中可用的存储体之间分配IO时,存在冲突.以下例子阐述了这个概念: -

让我们假设我们有两维512x512整数数组,我们的DRAM或内存系统中有512个存储区.默认情况下,阵列数据的布局方式为arr [0] [0]进入bank 0,arr [0] [1]进入bank 1,arr [0] [2]进入bank 2 .... arr [0] [511]转到银行511.概括arr [x] [y]占用银行编号y.现在一些代码(如下所示)开始以列主要方式访问数据,即.在保持y不变的同时改变x,那么最终结果将是所有连续的存储器访问将到达同一个银行 - 因此银行冲突.

int arr[512][512];
  for ( j = 0; j < 512; j++ ) // outer loop
    for ( i = 0; i < 512; i++ ) // inner loop
       arr[i][j] = 2 * arr[i][j]; // column major processing
Run Code Online (Sandbox Code Playgroud)

编译器通常通过缓冲阵列或使用阵列中的素数元素来避免这些问题.


小智 7

(CUDA银行冲突)我希望这会有所帮助..这是非常好的解释......

http://www.youtube.com/watch?v=CZgM3DEBplE

  • 请注意,不鼓励使用 [仅链接答案](http://meta.stackoverflow.com/tags/link-only-answers/info),因此答案应该是搜索解决方案的终点(而不是参考文献的另一个停留点,随着时间的推移,这些参考文献往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。 (2认同)
  • 这个视频真的很有帮助!我不知道为什么投反对票!这是一个非常好的输入!+1 (2认同)