は、私はこのような配列を持っている:GPU共有メモリの実用的な例
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であると仮定すると、データサイズが16のG80の場合、バンク競合は起こりません。私は紙の著者があなたの例を持っていなかったビュー。少なくとも32のデータサイズと少なくとも32の 'blockDim.x'を使って、G80でどのように銀行の競合が発生するのかを実証することは困難ではありません。 –
http://stackoverflow.com/q/7903566/681865 – talonmies
私が使用した例は、この論文で使用されている同じ例です[the paper](http://developer.download.nvidia.com/compute/cuda/ 1.1-Beta/x86_website/projects/reduction/doc/reduction.pdf)(私が使用した例は、本稿で使用した例と同じです)11ページの方法について説明しています。私の質問にちょうど追加した写真ですが、32の要素で銀行の競合がどのように発生するかを実証できますか?ありがとうございます@Robert Crovellla –