2012-02-12 15 views
0

私は単純な並列削減を実装しようとしています。私はCUDA sdkのコードを使用しています。私のカーネルには何とかして問題があります。なぜなら共有配列は大域配列の値とそのすべてがゼロでないからです。CUDA共有配列に値がありませんか?

extern __ shared __ float4 sdata[]; 

// each thread loadsone element from global to shared mem 

unsigned int tid = threadIdx.x; 

unsigned int i= blockIdx.x*blockDim.x+ threadIdx.x; 

sdata[tid] = dev_src[i]; 

__syncthreads(); 

// do reduction in shared mem 

for(unsigned int s=1; s < blockDim.x; s *= 2) { 

if(tid % (2*s) == 0){ 

sdata[tid] += sdata[tid + s]; 

} 

__syncthreads(); 

} 
// write result for this block to global mem 

if(tid == 0) 

out[blockIdx.x] = sdata[0]; 

EDIT ::

OK、私はそれが私が今良い形で午前にexternキーワードを削除し、共有配列に512のような一定の大きさにすることによって作業ました。誰かがなぜexternキーワードで作業していなかったのか説明できます

+0

のでdev_srcが正しい値を持っていますが、何とかdev_srcが – elasolova

+0

コメントへの更新を追加しない値になっていませんSDATAを役に立てば幸い

kernel<<<blocks,threads,512>>> // this is wrong 

間違っている、あなただけの、以下のように求めていると思います。あなたの質問を更新してください。 – Bart

答えて

2

私は以前これに直面していたように、なぜこれが起こっているのか分かります。どのようにカーネルを呼び出していますか?

kernel<<<blocks,threads,sharedMemory>>>sharedMemoryは、バイト単位の共有メモリのサイズである必要があります。したがって、512要素を宣言する場合、3番目のパラメータは512 * sizeof(float4)にする必要があります。私は

+0

この答えを明確にするため、ほとんど正しいので、__shared__変数を 'extern __shared__ 'に指定すると、実行コンフィギュレーションの3番目のパラメータを使用してカーネルの起動時に割り当てる共有メモリの量(バイト単位)を指定する必要があります<<<> >>)、プログラマが説明しています。 – harrism

関連する問題