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

我一直在阅读CUDA和OpenCL的编程指南,我无法弄清楚银行冲突是什么。他们只是倾向于如何解决问题而不详细说明主题本身。任何人都可以帮我理解吗?如果帮助是在CUDA / OpenCL的背景下,或者只是计算机科学中的银行冲突,我没有偏好。     
已邀请:
对于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 |...
...
因此,如果半转换中的每个线程访问连续的32位值,则不存在库冲突。此规则的一个例外(每个线程必须访问自己的银行)是广播: 如果所有线程都访问相同的地址,则该值只读取一次并广播到所有线程(对于GT200,它必须是半转换中访问相同地址的所有线程,iirc fermi和AMD gpus可以为任意数量的线程访问相同的价值)。     
可以并行访问的共享内存分为模块(也称为库)。如果两个内存位置(地址)出现在同一个存储区中,则会发生存储库冲突,在此期间串行完成访问,从而失去并行访问的优势。     
简而言之,当任何存储器访问模式无法在存储器系统中可用的存储体之间分配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
编译器通常通过缓冲阵列或使用阵列中的素数元素来避免这些问题。     
(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 ...... | 希望这会有所帮助     

要回复问题请先登录注册