0

レイトレーシング衝突テスト カーネル (Cuda、Opencl) で GPU コンピューティング用のカスタム分岐予測アルゴリズムを試した人はいますか?

低深度(2-5)のパフォーマンスについても心配する必要がありますか?

例:

 trace for the first group of rays
     check for previous ray depth predictor, if zero, guess zero.
                                   if gt one, guess d>=1
           go one level deeper in tracing kernel.(with pseudo stack & recursivity)

                           recursively repeat

                     go out of one depth after saving guess state

                  recursively go out of depths.

これはハードウェア レベルの予測を超えることができますか? これにより、合計トレース時間を改善できますか?

この疑似コードの「if」文には、「if」を含めないでください。したがって、予測値に応じてゼロまたは実際の値を計算するだけです。

ありがとう。

4

1 に答える 1

1

これはOpenCL Optimization Manualからのものです:

制御フローではなく述語を使用します。プレディケーションにより、GPU は実行の両方のパスを並行して実行できます。これは、巧妙な制御フローによって作業を最小限に抑えようとするよりも高速になる可能性があります。これは、?: 演算子 (三項演算子とも呼ばれる) にメモリ操作が存在しない場合、この操作が単一の cmov_logical 命令に変換され、単一サイクルで実行されるためです。これの例は次のとおりです。

If (A>B) { C += D; } else { C -= D; }

これを次のように置き換えます。

int factor = (A>B) ? 1:-1; C += factor*D;

コードの最初のブロックでは、これは条件付きコードの IF/ELSE/ENDIF シーケンスに変換され、それぞれに約 8 サイクルかかります。発散する場合、このコードは ~36 クロックで実行されます。それ以外の場合は、約 28 クロックです。実行されない分岐には 4 サイクル (1 命令スロット) かかります。分岐が行われると、命令キャッシュから命令をフェッチするために 4 スロットのレイテンシが追加され、合計 16 クロックになります。実行マスクは保存され、変更され、分岐のために復元されるため、発散する場合は最大 12 クロック、そうでない場合は最大 8 クロックが追加されます。

コードの 2 番目のブロックでは、?: 演算子がベクトル単位で実行されるため、余分な CF 命令は生成されません。命令はシーケンシャルに依存するため、このコード ブロックは 12 サイクルで実行され、1.3 倍の速度が向上します。これを確認するために、最初のサイクルは (A>B) 比較であり、その結果は 2 番目のサイクル (cmov_logical factor、bool、1、-1) に入力されます。最終サイクルは、mad C、factor、D、C の MAD 命令です。条件付きコードと ALU 命令の比率が低い場合、これは制御フローを削除するのに適したパターンです。

0/1 の選択は予測に基づいているようです。これがあなたが探しているものかどうかわかりません。

ソース: http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/opencl-optimization-guide/

于 2014-08-28T20:00:34.500 に答える