我正在开发一个执行向量缩减的内核。它基本上将向量中的所有位置相加,并将结果存储在位置0中。
我正在遵循这个方案,使用512个浮点元素的块:
代码:
//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个不同的值,但是,我没有任何冲突:
我错过了什么?
答案 0 :(得分:3)
银行冲突的计算基于每个请求的每个存储器指令。共享负载(右侧)和共享存储(左侧)作为单独的指令执行许多时钟周期。