我一直在阅读了CUDA和OpenCL编程指南,我想不通银行的冲突是什么。他们只是排序探讨了如何解决问题没有详细说明关于这个问题的本身。任何人都可以帮我明白了吗?我没有偏好,如果帮助是在CUDA / OpenCL的或一般只是银行的冲突在计算机科学的背景下。

有帮助吗?

解决方案

有关NVIDIA(和AMD也如此)的GPU本地存储器被分成memorybanks。每家银行只能在一个时间地址一个数据集,所以如果halfwarp试图加载/存储数据从/到访问必须序列同一银行(这是银行的冲突)。对于GT200的GPU有16个存储体(32banks对于费米),16家或32个银行AMD的GPU(57XX或更高:32,一切下面:16)),其交错的32位的granuity(所以字节0-3是在银行1,4-7银行2,...,64-69银行1等)。为了更好地可视化,它基本上是这样的:

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 |...
...

因此,如果在一个halfwarp每个线程访问连续的32位值没有组冲突。这条规则(每个线程必须访问自己的银行)的一个例外是广播: 如果所有线程访问相同的地址,该值是只读一次,并广播到所有线程(对于GT200它必须在halfwarp所有线程访问相同的地址,IIRC费米和AMD的GPU可以访问任何数量的线程做到这一点相同的值)。

其他提示

这可以并行访问的共享存储器被划分成模块(也称为银行)。如果两个存储位置(地址)都发生在同一家银行,那么你得到的银行冲突的,在此期间访问顺序做,失去的并行访问的优势。

在简单的话,存储体冲突时是任何存储器访问模式不能跨越在存储器系统可用的存储区分配IO的情况。下面的实施例阐述的概念: -

让我们假设我们有一个整数的二维数组512×512,我们的DRAM或存储系统中有512家银行。默认情况下,阵列中的数据将是布局的方式,ARR [0] [0]变为存储体0,ARR [0] [1]变为银行1,ARR [0] [2]到银行2 ....常用3 [0] [511]进到银行511。为了概括ARR [X] [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

这样的问题,通常,由编译器避免通过缓冲阵列或使用数组中的元素的素数。

(CUDA银行冲突) 我希望这个能帮上忙.. 这是非常好的交代......

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

http://en.wikipedia.org/wiki/Memory_bank 结果 和 http://mprc.pku.cn/mentors /training/ISCAreading/1989/p380-weiss/p380-weiss.pdf

从这个页面,你可以找到有关存储库的细节。 但它是从什么是@Grizzly说有点不同。 在此页中,该行是这样的

银行1 2 3

地址| 0,3,6 ... | | 1,4,7 ... | | 2,5,8 ... |

希望这将有助于

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top