web-dev-qa-db-ja.com

c#でGPUを利用する

私はグリッドからより多くの処理能力を得ようとしています。

私はすべてのcpus/coresを使用していますが、C#でGPUを利用できますか。

誰もがライブラリを知っているか、サンプルコードを手に入れましたか?

129
csharpdevguy568

[この回答でさえかなり古くなるので、OCT 2017を編集してください]

これらの答えのほとんどはかなり古いので、各プロジェクトがどこにあると思うかについて、最新の要約を提供すると思いました。

  • GPU.Net (TidePowerd)-6か月ほど前にこれを試してみましたが、少し手間がかかりましたが機能しました。コンパイル時にC#カーネルコードをcudaに変換します。残念ながら彼らのウェブサイトはダウンしており、彼らのgithubは数年更新されていません。これはプロジェクトが死んだことを示しているかもしれません。

  • Cudafy -オープンソースで非常に使いやすい。実行時にC#カーネルコードをcudaに変換します(シリアル化およびキャッシュする機能があります)。 CPUで同じカーネルコードを簡単に実行できます(主にデバッグ用)。複数のGPUをサポートします。ここに他の例よりも多くの例があります。他の回答で参照される定型コードは最小限であり、私の場合は、少なくともコードの仕組みを理解するのに役立ちました。ただし、Cuda/Nvidiaのみ。残念ながら、彼らも数年間ソリューションを更新しなかったようです(2015年の最新のコミット-cuda 7.0のサポート)。

  • ハイブリダイザー 。 C#をCUDAにコンパイルする商用ソリューション。 visual studio marketplace で無料のコミュニティエディションを提供し、 github でサンプルを提供します。

  • AleaGP コンシューマGPUS向けの無料コミュニティエディションを備えた商用ソリューション。詳細については、ダニエルのコメントを参照してください。

  • Brahma -OpenCLを介してLINQ式を実行します(AMDもサポートします)。多くのドキュメント/例。 2011年の最終更新。

  • C $ -最後の開発は10年以上前でした...

  • Microsoft Accelerator -同様に、もはや積極的に開発されているようには見えません。

  • 他のいくつか( C++ AMPOpenTK-dead / Cloo )-これらの多くは単なるバインディングです-つまり、GPUを呼び出すことができますC#。ただし、カーネルコード(GPUで実際に実行されるコード)はCまたはOpenCLで記述する必要があります。つまり、別の言語を使用(および学習)する必要があります。

私が言ったように、私は他のすべてよりもCudafyをお勧めします-OpenCLとCudaで実行できれば、Cudafyは完璧です。

EDIT SEP 2013Cudafyでbothのコンパイルが可能になりましたCUDAとOpenCLは、すべてのGPUで同じC#コードを実行するため、OpenCLのコンパイルはまだテストしていませんが、これは素晴らしいですね。

152
mcmillab

Microsoft Research Accelerator は.NET GP GPUライブラリでした。

46
Mark Cidade

私は Brahma ...を見つけました。GPU上でメソッドを実行できるGPGPUプロバイダーもあります...質問をありがとう...今日新しいことを学びました。 :)

24
Vyas Bharghava

XNA Game Studioを探索の可能な手段として推奨できますか?それは明らかにゲームを書くために準備されていますが、グラフィックカードへの管理されたアクセスを提供し、以前のManaged DirectXなどで利用できた機能列挙関数とシェーダー開発へのより良いアクセスを提供します。 WinFormsとXNAをハイブリッドアプリケーションに結合する方法もあります。

http://www.ziggyware.com/news.php?readmore=866

シェーダープログラミング(XNAはHLSLをサポートします)の学習に多少の努力を払う必要がありますが、これはnVidiaのCUDAなどのベンダー固有のソリューションを学習するよりも簡単なアプローチかもしれません。利点は、100%管理された環境でプログラミングできることです。 HLSLのリンクを次に示します。

http://www.ziggyware.com/weblinks.php?cat_id=9

GPGPUサイトは、汎用GPUプログラミングの推奨先でもあります。

http://gpgpu.org/

幸運を祈ります!

10
Dave R.

http://www.tidepowerd.com/ GPU.NETはどうですか?

9
pointernil

もう1つあります: CUDAfy 。メソッド属性のような単純なものがメソッド全体をGPUで実行できるという点で、GPU.Netのように聞こえます。しかし、GPU.Netとは異なり、CUDAfyは無料でオープンソースです。

GPU.Netは定型コードを必要としないように見えますが、(ドキュメントによると、「ビルドツールによって自動的に挿入」)、CUDAfyは必要です。


ここ は、CUDAfyを使用してアプリケーションを構築する例です。

さて、これはかなり古い質問であり、質問されて以来、物事は大きく変化しました。
。Netを使用してGPUコードを記述する別のオプション。これは Alea GP の回答で言及されていません。 C#、F#、VBをカバーしています。

.NETおよびMono向けのプロフェッショナルGPUソフトウェア開発環境。真のクロスプラットフォーム

F#公式サイトでは、AleaはGPGPUプログラミングでF#を使用するための 最初のオプション です。
このフレームワークを理解するには、 examples の包括的なリストを確認することをお勧めします。

8
Rsh

Brahmaに加えて、 C $ (「C Bucks」と発音)をご覧ください。 CodePlexから サイト

[C $]の目的は、最新のGPUとCPUでシームレスな並列プログラミングを行うための統一された言語とシステムを作成することです。

C#に基づいており、遅延評価され、複数のアクセラレータモデルを対象としています。

現在、対象アーキテクチャのリストには、GPU、マルチコアCPU、マルチGPU(SLI、CrossFire)、およびマルチGPU +マルチCPUハイブリッドアーキテクチャが含まれています。

7
David Cuccia

町に新しいMicrosoftソリューションがあります- C++ AMP (intro here )。

C#からの使用は、デモのようにP/Invokeを介して行われます here デスクトップアプリの場合 here (don't-call-it)Metroアプリの場合.

編集:C++ AMPには open specification があることに注意する必要があります。これは、必ずしもMSコンパイラ専用ではないこと、またはWindows専用です。

編集:どうやら、技術 現在は「メンテナンスモード」になっています バグを修正しているが、積極的に開発されていないことを意味します。

7
David Cuccia

GPUがすべて同じブランドである場合、NvidiaのCUDAまたはATIのストリームのいずれかを使用して、ベンダーからGPGPUサポートを取得できる場合があります。知る限り、それらはDLLを提供します。DLLはP/Invokeで使用できます。

2
Coderer

マネージドDirectXが何らかの形で機能する可能性があります

2
Greg Dean

CenterSpace Softwareには、C#プロジェクトに追加できる NMath ライブラリにGPUを使用した計算があります。それは商用製品です。

1
Pasi Tuomainen

カスタムカーネルを必要とする独自のアルゴリズムを適用する場合:

私は最近、OpenCLを使用する このgithubリポジトリ に私のオープンソースプロジェクトをアップロードしました。

Wikiページからも確認できますが、複数のOpenCL対応デバイスとカーネル文字列をユーザーから選択し、C#またはC++配列ラッパーを作成してから、自動ロードバランサーとパイプライン(レイテンシーを隠すため)を使用して、PCの効率を高めます。

その使用例は次のとおりです(すべてのデバイスにパーティション化された1024のワークアイテムで、それぞれ同じコードを実行しますが、異なるデータとthreadIdを使用します)。

// select all GPUs and all CPUs in same pc
ClNumberCruncher gpuCpu = new ClNumberCruncher(AcceleratorType.GPU | AcceleratorType.CPU, @"
    __kernel void distributeTanh(__global float * data,__global int * data2)
    {
         int threadId=get_global_id(0);
         data[threadId]=tanh(data[threadId]);
         data2[threadId]=threadId;
    }    
");

// a wrapper that can hold C# or C++ arrays
ClArray<float> data = new ClArray<float>(1024);
ClArray<int> data2 = new int[1024];

// load-balances "distributeTanh" on all devices more fairly 
// at each repeatation of this line with same compute-id(1 here)
data.nextParam(data2).compute(gpuCpu, 1, "distributeTanh", 1024);
// threadId in kernel receives unique continuous id value for all work
// either it is in cpu or gpu doesn't matter
// compute method also has parameters to enable pipelining to 
// elliminate buffer copy latencies or compute latencies

すべてが使用されなくなると、デストラクタとともにすべてのC++リソースが解放されます。

しかし、それほど成熟していないので、GitHubの問題タブに「問題」を追加してください。 Multi-pc-clusterに関連するクラスは機能せず、英語にまだ翻訳されていませんが、少なくとも単一のpcですべてのデバイスを使用できます。