C#でのGPUの使用[終了]


135

グリッドからより多くの処理能力を引き出そうとしています。

私はすべてのCPU /コアを使用していますが、C#でGPUを利用することは可能ですか?

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

回答:


156

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

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

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

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

  • ハイブリダイザ。C#をCUDAにコンパイルする商用ソリューション。Visual Studioマーケットプレイスで無料のコミュニティエディションを提供し、GitHubでサンプルを提供します。

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

  • 梵天は、 - (サポートがあまりにもAMDようにする)のOpenCLを経由してLINQの式を実行します。あまりドキュメント/例はありません。2011年の最終更新。

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

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

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

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

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


31
+1は、ある種の急速に発展している主題における有用な質問を更新するためのものです。
フィロロゴン2014

2
Alea GPU quantalea.comは、すべての.NET言語にCUDAサポートを提供し、完全にクロスプラットフォームであり、.NET GPUコードのデバッグとプロファイリングで最高の開発者エクスペリエンスを提供します。
Daniel

CudafyでのOpenCLサポートはかなり悪いです-私のプロジェクトが大きくなったときにコンパイルすることすらできませんでした。したがって、私はプレーンなOpenCLに固執し、C#へのバインディングを作成します。
Libor

Cudafyを使用したOpenCLは私には問題なく動作し、何年も使用しています
mcmillab 2015

将来の訪問者を助けるプロジェクトへのリンクを追加しました。
Dan Atkinson


25

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


10

探索の可能な道としてXNA Game Studioをお勧めできますか?それは明らかにゲームを書くために準備されていますが、グラフィックスカードへの管理されたアクセスと、以前に管理された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/

がんばって!


1
未来からのご挨拶。当時は間違いなくすばらしい答えでしたが(XNAにかなり手を出しました)、
残念なことに

@MickyDグレートスコット!私がデロリアンに飛び乗って、2018年まで旅に出たとき、私はこの回答を更新するのを忘れていました!:あなたはまだXNAに興味があるなら、精神的な後継者はおそらく、クロスプラットフォームのMonoGameあるmonogame.net
デイブR.

笑。ありがとうございました
。MickyDは

9

どの程度http://www.tidepowerd.com/ GPU.NET?


2
私はそのアイデアが好きですが、彼らは2年ほど前にテクニカルサポートの質問に回答するのをやめ、サイトは約1年間ダウンしていたので、プロジェクトは死んでいると思います。どうやら、作者はSOにいるようです。
BlueRaja-Danny Pflughoeft 2013

TidedpowerdはGPU.NETの開発を中止し、事業を閉鎖しました。
ダニエル

9

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

GPU.Netはボイラープレートコードを必要としないようですが(彼らのドキュメントによると、それは「ビルドツールによって自動的に挿入されます」)、CUDAfyは必要です。


以下は、CUDAfyでアプリケーションを構築する例です。


8

さて、これはかなり古い質問です。質問されて以来、状況は大きく変わりました。
誰もでの回答に記載していない書き込みGPUコードに.NETを使用するための別のオプションアリアGPU。C#、F#、VBをカバーしています。

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

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


1
ちょうどあなたの答えを見た、私の投稿を削除します。セス・フアレスによっても、チャンネル9のインタビューを参照してくださいこことSOタグこちら
デヴィッド・Cuccia

@DavidCucciaあなたの古い答えをチェックする上で素晴らしい仕事。また、チャネル9リンクにも感謝(2016年12月!)
Rsh


@ダニエルは「チャンネル9録音へのリンク」を意味しました。あいまいでしたか?とにかく、指摘してくれてありがとう。
Rsh

@DavidCuccia混乱して申し訳ありません。リンクがわかりにくかったです
ダニエル

7

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

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

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

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


7

新しいMicrosoftソリューションが町にあります-C ++ AMPここで紹介)。

デモとしてC#から使用することは、P /呼び出し経由となり、ここでデスクトップアプリケーションのために、そしてここで(ドント・コール・それ)のためのメトロアプリ。

編集: C ++ AMPにはオープンな仕様があることに注意してください。これは、必ずしもMSコンパイラーだけでなく、Windowsだけでもないことを意味します。

編集:どうやら、テクノロジーは現在「メンテナンスモード」にあります。つまり、バグを修正していますが、活発に開発されていません。


2

管理されたDirectXはどういうわけか、うまくいくかもしれません


2
未来からのご挨拶。当時は間違いなくすばらしい答えでしたが、残念なことに、MDXは現在は機能していないXNAに置き換えられて機能しなくなっています。
MickyD

2

GPUがすべて同じブランドの場合、NvidiaのCUDAまたはATIのStreamを通じて、ベンダーからGPGPUサポートを取得できる場合があります。AFAIK、彼らはP / Invokeを通じて使用できるDLLを提供します。


1

CenterSpaceソフトウェアのNMathライブラリには、C#プロジェクトに追加できるGPUを利用した計算があります。市販品です。


0

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

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

それは何ですか(あなたもそのwikiページから確認できます)は、ユーザーから複数のOpenCL対応デバイスとカーネル文字列を選択し、C#またはC ++配列ラッパーを作成してから、オートロードバランサーとpcから良好な効率を引き出すための(待ち時間を隠すための)パイプライン。

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

// 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の問題タブに「問題」を追加してください。マルチPCクラスター関連のクラスはまだ機能しておらず、英語に翻訳されていませんが、少なくとも1つのPCですべてのデバイスを使用できます。


-2

WPFもGPUを使用し、HLSLを使用してカスタムシェーダーを追加できます。


私の知る限り、WPFにはGP GPU計算アクセスがありません。WPF System.Windows.Mediaグラフィックスについて話すとき、それは本当のDirectXではありません。SharpDXまたはSlimDXを使用した低レベルの頂点プログラミングと比較すると、非常に遅い。
Pasi Tuomainen 2014年

WPFのGPUアクセラレーションカスタムエフェクトに関する一連の記事へのリンクを追加しました。
Mark Cidade
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.