ここで私のコードはブロック内で最大50の値の配列を見つけるために減らそうとしています。私は配列を64にパディングしました。CUDA、減算を使用して最大値を見つける、エラー
私は正しいmaxValの印刷がありますが、スレッドの32-49では完全に乱数です。私が間違っていることは分かりません。
btw。私はアンロールですべての行を同期させる必要はないと思ったが、明らかに私はしなければならない。それについての示唆?
ご協力いただきありがとうございます。
//block size = 50
__syncthreads();
if (tid<32){
cptmp[tid]=(cptmp[tid]< cptmp[tid+32]) ? cptmp[tid+32] : cptmp[tid];__syncthreads();
cptmp[tid]=(cptmp[tid]< cptmp[tid+16]) ? cptmp[tid+16] : cptmp[tid];__syncthreads();
cptmp[tid]=(cptmp[tid]< cptmp[tid+8]) ? cptmp[tid+8] : cptmp[tid]; __syncthreads();
cptmp[tid]=(cptmp[tid]< cptmp[tid+4]) ? cptmp[tid+4] : cptmp[tid]; __syncthreads();
cptmp[tid]=(cptmp[tid]< cptmp[tid+2]) ? cptmp[tid+2] : cptmp[tid]; __syncthreads();
cptmp[tid]=(cptmp[tid]< cptmp[tid+1]) ? cptmp[tid+1] : cptmp[tid]; __syncthreads();
}
__syncthreads();
//if (tid==0) {
maxVal=cptmp[0];
if(bix==0 && biy==0) cuPrintf(" max:%f x:%d y:%d\n", maxVal, blockIdx.x, blockIdx.y);
//}
あなたのスレッド/ブロック/グリッド構造と、 'tid'の計算方法を記述することなく、何が起きているのか把握することは難しいです。 –
ブロックの寸法が50なので、tid = threadIdx.xは0-49です。グリッドサイズは(40、大きな数値)です。各ブロックは、64のサイズで共有されているcptmp配列内の最大値を見つける。maxValも共有される。 – Kiarash