web-dev-qa-db-ja.com

GPUでC#コードを実行する

GPUプログラミングの概念とAPIの知識がありません。いくつかの質問を聞きたいんです:

  1. マネージドC#コードの一部を記述し、それをコンパイルして、GPUで実行できるある種のモジュールに変換することは可能ですか?または、CPUで管理するための実装とGPUで実行するための実装の2つを実装する運命にありますか(GPUで実行できるものに制限があることを理解しています)?
  2. さまざまなGPUハードウェアベンダーに対して独立してプログラムするための適切で成熟したAPI(つまり、共通のAPI)はありますか?
  3. CPU上で実行され、管理された言語で記述され、適切なGPUハードウェアが存在する場合は速度の最適化も提供するアプリケーションを開発したい場合のベストプラクティスはありますか?

また、適切な学習リソースを備えたあらゆる種類のドキュメントへのリンクがあれば嬉しいです。

最高、ジョゼフ

33
jojovilco

1)いいえ-C#の一般的なケースではありません-明らかに、言語のサブセットに対して何でも作成できます

2)はい-DirectXまたはOpenGLを使用するHLSL

3)一般的には不可能-CPUとGPUのコーディングは根本的に異なります

基本的に、CPUとGPUのコーディングを同等と考えることはできません。 GPUは、高度に特殊化された並列処理ツールであり、多くの並列単純計算に使用できます。

ブランチなどがたくさんあるGPUで一般的なプログラムを作成しようとすると、効率が悪くなります。おそらく不可能ですらあります。

それらのメモリアクセスアーキテクチャは完全に異なります。

CPU用に作成する必要がありますが、適切な並列計算をGPUにファームアウトします。

22
James Gaunt

1)いいえ、C#の一般的なケースではなく、小さなサブセットです。ランタイム(Tidepowerd GPU.NETを確認)または言語サポート(LINQまたはコード引用)のいずれかを介して。

2)はい、DirectCompute(DX11 Compute Shaders)とOpenCLはどちらもベンダーに依存しない成熟したAPIであり、それらの.NETバインディングを見つけることができます。

3)いいえ、ジェームズが言ったように、彼らは別の獣です。 GPUは、高スループットのデータ並列アプリケーション用に最適化された高遅延プロセッサですが、CPUは、シーケンシャルな汎用アプリケーション用に最適化された低遅延プロセッサです。

この問題に対処しようとしている私が知っている唯一の研究プロジェクトは [〜#〜] spap [〜#〜] 言語です。

私のアドバイスですが、完璧なユニバーサルAPI /ランタイムを見つけようとしないでください。既存のテクノロジー(DirectComputeまたはOpenCL)を選択し、それをビジネスに活用する方法を確認してください。

開始するための便利なリンク:

17
Stringer

梵天 もあります。おそらく式をキャプチャし、GPU用にコンパイルします。私は自分自身を試していません。

また、Microsoftには accelerator という研究用プロトタイプがあります。これは目標は似ていますが、構文が異なります。

2
user180326

1)私が知っていることではありませんが、C#用のライブラリが役立つ可能性があります。

2)OpenCL。 GPUに依存せず、CPUでも実行できます。

3)OpenCLはそれを支援します。OpenCLを使用してCPU用にコンパイルすることもできますが、CPU用にどれだけ優れたコードが作成されるかはわかりません。私は最近OpenCLに本当に夢中になりました、それは本当に本当にうまくいきます。

2
Xorlev

Alea GP を見たことがありますか?そこの図書館は完全に無料ではありませんが、公正なライセンスを持っています。優れたドキュメントと印象的な外観のツールチェーンがあります。

1
Guy Langston

Javaについては、Aparapiプロジェクト( https://github.com/aparapi/aparapi )を参照してください。これにより、OpenCLをサポートする任意のGPUでJavaのサブセットを実行できます。カーネルクラスのバイトコードは、実行時にOpenCLコードにクロスコンパイルされます。クロスコンパイルできるJavaコードには厳しい制限があります。基本的に、フィールド、ローカル、またはメソッド引数としてオブジェクトを使用することはできません。

ただし、大きな利点は、カーネルをJavaまたはOpenCLのいずれかで実行できることです(適切なGPU/APUデバイスが使用できない場合は、Java ThreadPool実行に自動的にフォールバックします)。これは、質問のパート3で探しているものに最も近いもののように聞こえます(もちろん、管理言語はC#ではありません)。

私はC#で同様のものを知りません。

0
barneypitt