Cuda 同一线程两次访问同一内存库是否会导致冲突?

Cuda 同一线程两次访问同一内存库是否会导致冲突?,cuda,gpu-shared-memory,bank-conflict,Cuda,Gpu Shared Memory,Bank Conflict,我正在研究一个做向量缩减的内核。它基本上将向量中的所有位置相加,并将结果存储在位置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 < str

我正在研究一个做向量缩减的内核。它基本上将向量中的所有位置相加,并将结果存储在位置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();
}
//scratch[]是一个向量,位于所有512个元素的共享内存中
NUM_元素=512;
对于(步长=个元素/2;步长>=1;步长=步长/2){
如果(线程IDX.x<步幅){
scratch[threadIdx.x]+=scratch[threadIdx.x+stride];
}
__同步线程();
}
奇怪的是,我期待着分享银行冲突,但我没有。在第一次迭代中,线程0将位于同一银行的位置0和位置256相加。线程1将位置1和位置257相加,依此类推

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


我遗漏了什么?

银行冲突的计算基于每个请求的每个内存指令。共享加载(右侧)和共享存储(左侧)作为分开的指令执行,相隔许多时钟周期。

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

谢谢。我明白你现在所说的,这是非常明显的。非常感谢。非常感谢。我明白你现在所说的,这是非常明显的。非常感谢。