CUDA アプリケーションのプロファイリングを行っていますが、Visual Profiler にある「制御フローの相違」メトリックについて理解できない問題に遭遇しました。
ユーザーガイドによると:
制御フローの発散は、ワープ内のすべてのスレッドによって実行されなかったために発散を引き起こしたスレッド命令の割合を示します。
CUDA カーネルに次のコードがあります。
int var;
var = tex2D(texture, x, y); // texture fetch
if(var < 0) {
var *= -1;
results[(blockIdx.x*blockDim.x) + threadIdx.x] = var; // global memory array
}
何が起こるかというと、単一のスレッドが分岐に入るわけではありません (グローバル メモリの値を確認しました) が、プロファイラーは制御フローの分岐が 34% であると述べています。同じブランチに printf を挿入すると、stdout では何も起こらないにもかかわらず、値が 43% に跳ね上がります (奇妙なことに、実行時間も増加します)。これは、どのスレッドによっても実行されないものも含めて、メトリックがカーネルのすべての命令を考慮に入れているということですか? (事実上、ワープ発散がありません)
どちらの場合も、分岐分岐メトリックは 0% です。