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


95

我一直在阅读CUDA和OpenCL的编程指南,但无法弄清什么是银行冲突。他们只是在不详细说明主题本身的情况下潜入了如何解决问题的方法。有人可以帮我理解吗?如果帮助是在CUDA / OpenCL的背景下进行的,或者计算机科学中的一般银行冲突,我都没有选择。

Answers:


105

对于nvidia(以及相应的AMD)GPU,本地内存分为记忆库。每个存储库一次只能寻址一个数据集,因此,如果半弯尝试从同一存储库加载数据/将数据存储到同一存储库,则访问必须序列化(这是存储库冲突)。对于gt200 gpus,有16个存储区(fermi为32个存储区),AMD gpus为16个或32个存储区(57xx或更高:32,以下各项均是:16)),它们以32位的粒度进行交织(因此字节0-3位于银行1,银行2中的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 |...
...

因此,如果半扭曲中的每个线程都访问连续的32位值,则不会出现存储体冲突。广播此规则的一个例外(每个线程必须访问其自己的存储区):如果所有线程都访问相同的地址,则该值仅读取一次并广播到所有线程(对于GT200,它必须是半warp中的所有线程才能访问该线程)。相同的地址,iirc fermi和AMD gpu可以对访问相同值的任意数量的线程执行此操作)。


3
非常感谢您的视觉和解释。我不了解广播,这似乎是重要的信息:)我将如何验证我的加载和存储不会在共享内存中引起存储区冲突?我必须以某种方式获取汇编代码还是有其他方法?
走私煎饼

3
由于库冲突的发生是在运行时确定的(意味着编译器不知道,因为大多数地址都是在运行时生成的),因此获取编译版本不会有太大帮助。我通常以一种古老的淡化方式进行此操作,想到我会用笔和纸开始思考代码存储在什么地方。毕竟,管理银行冲突发生的规则并不那么复杂。否则,您可以使用nvidia OpenCL分析器(应与sdk,iirc捆绑在一起)。我认为它有一个针对翘曲序列化的计数器。
灰熊队”,2010年

1
感谢您指出翘曲序列化。计算探查器随附的自述文本文件之一表示:
smuggledPancakes

1
确认,请原谅上面的评论,由于某种原因,我无法对其进行重新编辑。无论如何,我在计算机分析器的自述文件中找到了“ warp_serialize:在地址冲突时序列化到共享或恒定内存的线程扭曲数”。仅通过查看事件探查器输出,我就可以轻松查看是否存在冲突,这真是太好了。您如何确定笔和纸上是否存在银行冲突。您是否从任何示例或教程中学习到?
走私的

1
正如我所说的那样,从地址到银行的映射相对简单,因此要弄清楚哪些访问权访问哪个银行以及是否存在银行冲突并不难。本文仅用于更多的冲突访问模式,而如果没有这些模式,我将无法做到。
灰熊队”,2010年

13

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


那么这与半扭曲想要存储或加载内存有关吗?16个线程将尝试执行内存事务,因此使用多个线程访问同一存储区会导致序列化处理?此外,如何确保您不在同一银行中存储/加载数据?
走私的煎饼

10

简而言之,当任何内存访问模式都无法在内存系统中可用的存储体之间分配IO时,存储体冲突就是一种情况。以下示例详细说明了这一概念:

让我们假设我们有二维的512x512整数数组,而我们的DRAM或内存系统中有512个存储体。默认情况下,将以arr [0] [0]进入存储区0,arr [0] [1]进入存储区1,arr [0] [2]进入存储区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

通常,编译器通过缓冲数组或使用数组中的素数来避免此类问题。


7

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

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


1
请注意,不鼓励仅链接的答案,因此,SO答案应该是搜索解决方案的终点(与引用的另一种中途停留相比,随着时间的流逝,它们往往会过时)。请考虑在此处添加独立的摘要,并保留该链接作为参考。
kleopatra 2013年

请详细说明该链接,以更好地为OP提供帮助。
Peter Foti

1
这部影片真的很有帮助!而且我不知道为什么要投反对票!这是一个很好的输入!+1
加百利

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.