我正在寻找利用GPU来处理一些方程式,但无法弄清楚我如何从C#中访问它。我知道XNA和DirectX框架允许您使用着色器来访问GPU,但是如果没有这些框架,我将如何访问它?
我没有用C#做过,但基本上你使用的是CUDA(假设你当时正在使用nVidia卡)SDK和CUDA工具包将它拉下来。
nVidia已经移植(或编写?)BLAS实现,以便在支持CUDA的设备上使用。他们提供了很多关于如何进行数字运算的例子,尽管你必须弄清楚如何从C#中取出它。我敢打赌,你将不得不在非托管C或C ++中编写一些内容并与之链接。
如果您没有使用C#,请查看Theano。这可能对你的需求有点过分,因为他们正在构建一个框架,用于从Python上对GPU进行机器学习,但是......它的工作原理非常好。
如果你的GPU是NVidia,你可以使用CUDA。
这里有一个例子,它解释了所有的链,包括一些C / C ++代码:CUDA integration with C#
这里有一个名为CUDA.NET的库:CUDA.NET
如果您的GPU是ATI,那么就有ATI Stream。 .NET支持对我来说不太清楚。也许Open Toolkit Library有它,通过OpenCL支持。
最后,有一个名为“Accelerator”的Microsoft Research项目,它有一个托管包装器,可以在任何硬件上运行(前提是它支持DirectX 9)。
Brahma(LINQ to GPU)怎么样?
一定要爱LINQ!
我担心,除了为DirectX / XNA编写着色器以及使用CUDA(特定于NVidia)时,我对使用GPU的理解相当理论化。但是,我听说过很多关于OpenCL(开放计算语言)的内容,它允许您运行OpenCL将智能地推送到您的图形卡的算法,或者如果您没有兼容的GPU则运行在CPU上。
您在GPU上运行的代码必须专门编写在OpenCL的C99子集中(如果您不知道如何从C#中使用它,那么这不符合您的要求),但除了您的数字运算算法之外,您还可以编写您在C#中的其余应用程序,并使用The Open Toolkit完美地协同工作;
如果你不想搞乱P / Invoke的东西和非托管代码,有两种选择:
第二种选择是我建议,但如果你只坚持使用nVidia GPU没问题 - 第一种可能会更快。
我通过利用NVIDIA的CUDA库和.NET的P / invoke在C#中完成了它。这需要一些仔细的内存管理和对CUDA库的详细了解。此技术可以与您希望在C中创建的任何自定义GPU / CUDA内核结合使用,因此它是一种非常强大的灵活方法。
如果您想省下很多精力,可以从CenterSpace软件(我工作的人)购买NMath Premium,并且您可以在几分钟内在C#上运行NVIDIA GPU上的大问题。 NMath Premium一个大型的C#/。NET数学库,它可以在GPU上运行大量的LAPACK和FFT,但是如果硬件不可用或者问题大小不能证明往返GPU的话,则可以回退到CPU。