0

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% です。

4

1 に答える 1

1

どのバージョンを使用していますか?古いバージョンを使用しているようですので、より新しいバージョンに更新する価値があるかもしれません(たとえば、4.2または5.0-後者は現在リリース候補です)。

CUDA 5.0 Visual Profilerに更新できる場合は、特定のカーネルを分析することで、発散に苦しんでいるカーネル内の特定の行をプロファイラーに強調表示させることができます(非合体メモリアクセスの場合も同様)。これを機能させるには、デバッグ(-G)を使用してコードをコンパイルするか、リリースコードをプロファイリングする場合は、行情報(-lineinfo)を使用してコードをコンパイルする必要があります。

于 2012-09-11T13:37:05.903 に答える