【发布时间】:2017-08-28 23:39:29
【问题描述】:
我有一个这样的数组:
data[16] = {10,1,8,-1,0,-2,3,5,-2,-3,2,7,0,11,0,2}
我想在 G80 GPU 上使用共享内存计算此数组的缩减量。
NVIDIA 文档中引用的内核是这样的:
__global__ void reduce1(int *g_idata, int *g_odata) {
extern __shared__ int sdata[];
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
sdata[tid] = g_idata[i];
__syncthreads();
// here the reduction :
for (unsigned int s=1; s < blockDim.x; s *= 2) {
int index = 2 * s * tid;
if (index < blockDim.x) {
sdata[index] += sdata[index + s];
}
__syncthreads();
}
论文作者说这种方法存在银行冲突的问题。我试图理解,但我不知道为什么?我知道银行冲突和广播访问的定义,但仍然无法理解。
【问题讨论】:
-
假设您的
blockDim.x也是 16,在 G80 上,数据大小为 16 不会有任何银行冲突。我很确定论文的作者没有你的例子在视图中。数据大小至少为 32,blockDim.x至少为 32,不难证明 G80 上的银行冲突是如何产生的。 -
我使用的例子和本文使用的例子相同the paper(我使用的例子和本文使用的例子相同)我说的是在第 11 页(您可以在我刚刚在我的问题中添加的图片中看到它。请您演示一下 32 个元素是如何产生银行冲突的?非常感谢@Robert Crovellla
标签: cuda gpu-shared-memory bank-conflict