Nvidia Reductionのすべての最適化を実行しようとしています。私は最初の4つの部分を実装しましたが、スライド番号22の部分#5で立ち往生しています。CUDA削減の最適化
syncthreads()がなくても、提供されたコードが動作する理由はわかりません。スレッドは、出力内の同じメモリ位置にアクセスします。
また、スライドでは、変数がvolatileに設定されていないとコードが機能しないことが示唆されています。どのように揮発性はその面で助けになるのですか?私がカーネルを呼びたくない場合、それをプログラムする最良の方法は何ですか?
私はこのコードを参考にしています。
__device__ void warpReduce(volatile int* sdata, int tid) {
sdata[tid] += sdata[tid + 32];
sdata[tid] += sdata[tid + 16];
sdata[tid] += sdata[tid + 8];
sdata[tid] += sdata[tid + 4];
sdata[tid] += sdata[tid + 2];
sdata[tid] += sdata[tid + 1];
}
for (unsigned int s=blockDim.x/2; s>32; s>>=1) {
if (tid < s)
sdata[tid] += sdata[tid + s];
__syncthreads();
}
if (tid < 32) warpReduce(sdata, tid);
ご協力いただきありがとうございます。さらに詳しい情報が必要な場合はコメントしてください。
これに追加します。 '__syncthreads()'を省くことのパフォーマンス上の利点を維持したいならば、通常はより良い性能で共有メモリワープ同期プログラミングの代わりに '__shfl *()'命令セットを使うことができます。 – Jez