2

OpenCL C# ライブラリである Cloo を使用していますが、実行時にカーネルに使用するデバイスをどのように決定するのが最善かを考えていました。私が本当に知りたいのは、GPU 上にあるコアの数 (計算ユニット * 計算ユニットあたりのコア数) です。これを正しく行うにはどうすればよいですか?現在、計算ユニットと周波数を決定できます。

編集: すべてのデバイスでプロファイリング (速度テストの実行) を試み、結果を保存/比較することを検討しました。しかし、私の理解では、比較のためにすべてのデバイスを最適/公正に使用するプログラムを作成できないため、これも問題を引き起こします。

これは、カーネル呼び出しごとに指定する最適な数のワーカー スレッドを選択する場合にも役立ちます。どんな助けでも大歓迎です。

4

1 に答える 1

1

コア数だけで性能を判断するのは非常に難しいです。より広いコアもあれば、より高速なコアもあります。それらが同じであっても、レジスタ空間/ローカルメモリの組み合わせが異なると、推測がさらに難しくなります。

アルゴリズムごとの OS ごとのドライバーごとに各グラフィックス カードのパフォーマンスのデータベースを用意し、それらを現在の頻度で乗算するか、実際のアクセラレーション ジョブを実行中にすべてのデバイスのパフォーマンス タイマーを選択またはクエリする前に単純にベンチマークする必要があります。

GTX680 と HD7950 のコア数は似ていますが、一部のアルゴリズムでは HD7950 を優先して 200% のパフォーマンスを向上させ、他のコードではその反対です。

コア数を照会することはできません。計算ユニットの数と計算ユニットあたりのスレッドの最大数を照会できますが、それらが同じアーキテクチャでない限り、パフォーマンスには関係ありません。

ワークグループごとに最適なスレッド数を照会できますが、使用するアルゴリズムによって変わる可能性があるため、できるだけ多くの値を試す必要があります。スカラー関数のベクトル化されたバージョンについても同じです。それがCPU(または任意のvliw GPU)の場合、同時に4つまたは8つの数値を乗算できます。

ドライバーの自動コンパイラー最適化は、手動で調整された最適化と同じくらい優れている場合があります。

https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetDeviceInfo.html

于 2016-03-23T17:00:57.847 に答える