いくつかの方程式をクランチするためにGPUを利用することを検討していますが、C#からそれにアクセスする方法を理解できません。 XNAおよびDirectXフレームワークではGPUにアクセスするためにシェーダーを使用できることを知っていますが、これらのフレームワークなしでアクセスするにはどうすればよいですか?
C#からは行っていませんが、基本的にはCUDA(もちろん、ここではnVidiaカードを使用していると想定しています)SDKとCUDAツールキットを使用してプルします。
nVidiaは、CUDA対応デバイスで使用するためのBLAS実装を移植(または記述?)しています。 C#から数値を引き出す方法を理解する必要がありますが、数値計算を行う方法の例を数多く提供しています。私の賭けは、管理されていないCまたはC++で何かを記述し、それとリンクする必要があることです。
C#の使用に慣れていない場合は、 Theano を参照してください。彼らはPythonからGPUで機械学習を行うためのフレームワークを構築しているので、それはあなたのニーズに対して少々やり過ぎかもしれませんが、...それは機能し、非常にうまく機能します。
GPUがNVidiaの場合、 [〜#〜] cuda [〜#〜] を使用できます。
ここに、いくつかのC/C++コードを含むすべてのチェーンを説明する例があります。 CUDAとC#の統合
そしてここで利用可能なCUDA.NETと呼ばれるライブラリがあります: CUDA.NET
GPUがATIの場合、 ATIストリーム があります。 .NETのサポートについては、これについてはあまり明確ではありません。たぶん Open Toolkit Library は OpenCL サポートを通じてそれを持っています。
そして最後に、 " Accelerator "と呼ばれるMicrosoft Researchプロジェクトがあります。これには、任意のハードウェアで動作するマネージラッパーがあります(DirectX 9をサポートしている場合)。
Brahma (LINQ to GPU)はどうですか?
LINQが大好きです!
私は、GPUの使用に関する私の知識は、DirectX/XNA用のシェーダーを記述し、CUDA(NVidia固有)に少し手を加えるよりもむしろ理論的であると思います。ただし、OpenCL(Open Computing Language)について多くのことを聞いています。OpenCLがアルゴリズムを実行して、グラフィックカードにインテリジェントにプッシュしたり、互換性のあるGPUがない場合はCPUで実行したりできます。
GPUで実行するコードは、OpenCLのC99のサブセットで具体的に記述する必要があります(C#からの使用方法を尋ねたため、これが要件を満たしていない場合はお詫び申し上げます)。アプリケーションの残りの部分をC#で作成し、The Open Toolkitを使用してすべてをうまく連携させます。
私はNVIDIAのCUDAライブラリと.NETのP/invokeを利用してC#でそれを行いました。これには、注意深いメモリ管理とCUDAライブラリの詳細な理解が必要です。この手法は、Cで作成するカスタムGPU/CUDAカーネルと組み合わせて使用できるため、非常に強力で柔軟なアプローチです。
多大な労力を節約したい場合は、CenterSpaceソフトウェア(私が働いている会社)から NMath Premium を購入すると、NVIDIA GPUでC#から数分で大きな問題が発生する可能性があります。 NMath Premiumは、大規模なC#/。NET数学ライブラリで、GPUでLAPACKとFFTの多くを実行できますが、ハードウェアが利用できない場合や、問題のサイズがGPUへの往復を正当化しない場合は、CPUにフォールバックします。
P/Invokeやアンマネージコードをいじりたくない場合は、2つのオプションがあります。
2番目のオプションは私がお勧めすることですが、nVidia GPUのみを使用することに問題がない場合は、最初のオプションがおそらく高速です。