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可以为访问相同值的任意数量的线程执行此操作.
简而言之,当任何存储器访问模式无法在存储器系统中可用的存储体之间分配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
| 归档时间: |
|
| 查看次数: |
36378 次 |
| 最近记录: |