同一个线程访问同一个内存库会导致冲突吗?

时间:2017-01-27 00:08:08

标签: cuda gpu-shared-memory bank-conflict

我正在开发一个执行向量缩减的内核。它基本上将向量中的所有位置相加,并将结果存储在位置0中。

我正在遵循这个方案,使用512个浮点元素的块:

reduction scheme

代码:

//scratch[] is a vector located in shared memory with all 512 elements
NUM_ELEMENTS = 512;
for( stride=NUM_ELEMENTS/2; stride>=1; stride = stride/2 ) {
  if (threadIdx.x < stride){
    scratch[threadIdx.x] += scratch[threadIdx.x + stride];
  }
  __syncthreads();
}

奇怪的是,我期待共享银行冲突,我不是。在第一次迭代中,线程0将位置0和位置256相加,它们位于同一个存储区中。线程1将位置1和位置257相加,依此类推。

所有这些操作都要求warp中的每个线程从同一个bank获得2个不同的值,但是,我没有任何冲突:

result

我错过了什么?

1 个答案:

答案 0 :(得分:3)

银行冲突的计算基于每个请求的每个存储器指令。共享负载(右侧)和共享存储(左侧)作为单独的指令执行许多时钟周期。