如何使用GPU进行数学计算。

37

我希望利用GPU来完成一些方程式的计算,但不知道如何从C#中访问它。我知道XNA和DirectX框架允许使用着色器来访问GPU,但如果没有这些框架,该怎么访问呢?


Nvidia、ATI、Intel还是通用? - Bobby
@Bobby:我在寻找一些通用的东西,最好是。 - Neil Knight
8
展示如何检测显卡并在其中运行代码,或者回退到CPU运行代码的答案会很有趣。 - tiagoboldt
1
@tiagoboldt - Theano有使用CPU或GPU的能力,但它不会自动检测到显卡的存在。您需要将Theano与BLAS库(例如ATLAS)链接起来,但它仍然可以使用CPU或GPU。 - Brian Vandenberg
2
不是答案,但或许有所帮助。BarsWF是一个非常快速的MD5破解器,可以利用SSE2、CUDA或ATI进行加速,并已经在MIT许可下发布(http://3.14.by/forum/viewtopic.php?f=8&t=1333&p=8907)。你可能想要看一下。 - Bobby
@tiagoboldt OpenCL 可以在 Intel、AMD 和 ARM 的 CPU、GPU(NVidia、AMD/ATI 和 Mali)以及 Cell 处理器上运行,只需一个源代码。目前有几个 C# OpenCL 库可供使用。 - 3Dave
6个回答

11

我还没有用C#完成这个任务,但基本上你需要使用CUDA(假设你正在使用nVidia卡)SDK和CUDA工具包来完成它。

nVidia已经为可在CUDA设备上使用的BLAS实现进行了移植(或编写?)。他们提供了大量如何进行数字计算的示例,尽管您将不得不想办法从C#中完成它。我敢打赌,你将不得不编写一些非托管的C或C++代码并链接它。

如果您不介意使用C#以外的语言,请查看Theano。对于您的需求来说,它可能有点过头了,因为它们正在使用Python构建一个在GPU上进行机器学习的框架,但是...它可以工作,并且工作得非常好。


7

如何看待 Brahma (LINQ to GPU)?

必须得爱 LINQ!


1
糟糕,我刚刚发现链接出了问题。感谢 @Bobby 的编辑(我还在学习 Stack Overflow)。 - George Duckett

7
如果您的GPU是NVidia,您可以使用CUDA
这里有一个例子,解释了整个过程,包括一些C/C++代码:C#与CUDA集成 还有一个名为CUDA.NET的库可在此处获得:CUDA.NET 如果您的GPU是ATI,则有ATI Stream。对于我来说,.NET支持不太清楚。也许Open Toolkit Library通过OpenCL支持它。
最后,还有一个名为 "Accelerator" 的微软研究项目,它有一个托管包装器,应该可以在任何硬件上运行(只要支持DirectX 9)。

1

如果您不想处理P/Invoke和非托管代码,有两个选择:

  1. 使用提到的CUDA.NET库。它工作得非常好,但是它针对CUDA,所以只能在nVidia显卡上运行。如果您想解决更复杂的问题,您需要学习CUDA,在C中编写自己的内核,使用nvcc进行编译,并通过此库从C#执行。
  2. 使用Microsoft Research Accelerator。这是由MS Research构建的一个很好的库,可以在任何具有大量核心(多核nVidia / ATI GPU和多核处理器)的设备上运行您的代码。它完全独立于平台。我使用过它,并对结果印象深刻。还有一个非常好的tutorial介绍如何在C#中使用Accelerator。
第二个选项是我推荐的,但如果你没有坚持使用nVidia GPU的问题 - 第一个可能会更快。

1
我已经利用NVIDIA的CUDA库和.NET的P/invoke在C#中完成了它。这需要一些仔细的内存管理和对CUDA库的详细理解。这种技术可以与您想要在C中创建的任何自定义GPU/CUDA内核结合使用,因此它是一种非常强大灵活的方法。
如果您想节省大量精力,可以购买CenterSpace软件(我所在的公司)的NMath Premium,您可以在几分钟内从C#上运行大型问题。 NMath Premium是一个庞大的C#/.NET数学库,可以在GPU上运行大部分LAPACK和FFT,但如果硬件不可用或问题规模不足以证明往返于GPU,则会回退到CPU。

1

我担心我的GPU使用知识仅限于编写DirectX / XNA着色器和稍微涉猎一下CUDA(NVidia特定)。然而,我听说过很多关于OpenCL(开放式计算语言)的东西,它允许您运行算法,OpenCL会智能地将其推送到您的图形卡上,或者在没有兼容GPU的情况下在CPU上运行。

您在GPU上运行的代码必须专门使用OpenCL的C99子集编写(如果这不符合您的要求,因为您已经询问了如何从C#中使用它,我深表歉意),但除了您的数字计算算法之外,您可以编写应用程序的其余部分,并通过使用The Open Toolkit使其全部协同工作。

http://www.opentk.com/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接