利用GPU与C#

我正试图从我的网格中获得更多的处理能力。

我正在使用所有的CPU /核心,是否有可能利用GPU与C#。

任何人都知道任何图书馆或有任何示例代码?

[ 即使这个答案变得相当古老编辑OCT 2017年 ]

这些答案中的大部分都是相当老的,所以我想我会给出一个我认为每个项目在哪里的更新总结:

  • GPU.Net (TidePowerd) – 我在6个月前试过了,虽然花费了一点工作,但确实能够工作。 在编译时将C#内核代码转换为cuda。 不幸的是,他们的网站已经closures了,他们的github还没有更新几年,这可能表明该项目已经死了….

  • Cudafy – 开源,非常容易使用。 在运行时将C#内核代码转换为cuda(具有序列化和cachingfunction)。 可以轻松地在CPU上运行相同的内核代码(主要用于debugging)。 支持多个GPU。 比这里更多的例子可用。 由其他答案引用的样板代码是最小的,在我的情况下,至less帮助我了解代码的工作原理。 只有Cuda / Nvidia。 不幸的是,他们好像也没有更新他们的解决scheme(2015年的最新版本 – 支持cuda 7.0)。

  • 杂交物 。 将C#编译成CUDA的商业解决scheme。 在视觉工作室市场上提供免费社区版,并在github 上提供样本。

  • AleaGPU商业解决scheme,为消费者提供免费的社区版GPUS。 详情请参阅Daniel的评论。

  • Brahma – 通过OpenCL运行LINQexpression式(也支持AMD)。 没有太多的文档/例子。 在2011年最后更新。

  • 加元 – 最后的发展是十多年前…

  • 微软加速器 – 同样看起来不像它正在积极开发。

  • 一些其他的( C ++ AMP , OpenTK-dead / Cloo ) – 其中很多只是绑定 – 也就是说你可以从C#调用GPU,但是你的内核代码(实际在GPU上运行的代码)需要写入C或OpenCL,这意味着你必须使用(和学习)另一种语言。

正如我所说,我会build议Cudafy所有其他人 – 如果它可以在OpenCL和Cuda上运行,它将是完美的。

编辑2013年 9 Cudafy现在允许您编译CUDA和OpenCL,所以将在所有GPU上运行相同的C#代码。 这听起来很棒,虽然我还没有testing过OpenCL编译。

微软研究加速器是一个.NET GP GPU库。

我发现梵天 …它也有一个GPGPU供应商,允许方法在GPU上运行…感谢您的问题…今天学到了新的东西。 🙂

我可以推荐XNA Game Studio作为探索的可能途径吗? 它显然是为编写游戏做好准备的,但是可以让你更好地访问你的graphics卡,以及更好地访问function枚举函数和着色器开发,比之前在Managed DirectX中可用。 还有将WinForms和XNA结合到混合应用程序中的方法:

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

你必须付出一些努力来学习着色器编程(XNA支持HLSL),但这可能比学习像nVidia的CUDA这样的供应商特定的解决scheme更简单。 优点是你可以在100%的pipe理环境中编程。 以下是一些HLSL链接:

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

GPGPU站点也是通用GPU编程的推荐目的地:

http://gpgpu.org/

祝你好运!

那么http://www.tidepowerd.com/ GPU.NET呢?

这是另一个: CUDAfy 。 这听起来像GPU.Net,因为方法属性可以使整个方法在GPU上运行。 但与GPU.Net不同的是,CUDAfy是免费且开源的。

虽然GPU.Net似乎不需要样板代码(根据他们的文档,它是由“构build工具自动注入”的) ,而CUDAfy则是。


以下是使用CUDAfy构build应用程序的示例。

那么这是一个相当古老的问题,因为有人问我事情已经发生了很大的变化。
使用.Net编写GPU代码的另一种select,在Alea GPU中没有人提到答案。 它涵盖了C#,F#和VB。

专业的用于.NET和Mono的GPU软件开发环境。 真正跨平台

在F#官方网站上,Alea是在GPGPU编程中使用F#的第一个选项 。
为了了解这个框架,我build议看看它的全面的例子 。

除Brahma之外,看看C $ (发音“C雄鹿”)。 从他们的CodePlex 站点 :

[C $]的目标是为现代GPU和CPU上的无缝并行编程创build统一的语言和系统。

它基于C#,懒惰地评估,并针对多个加速器模型:

目前的架构列表包括GPU,多核CPU,多GPU(SLI,CrossFire)和多GPU +多CPU混合架构。

这里有一个新的微软解决scheme – C ++ AMP (介绍这里 )。

从C#使用将通过P / Invoke, 这里演示了桌面应用程序, 在这里 (不要打电话)地铁应用程序。

编辑:我应该注意到,C ++ AMP有一个开放的规范 ,这意味着它不一定只适用于MS编译器,或者仅适用于Windows。

如果您的GPU品牌完全相同,则可以通过Nvidia的CUDA或ATI的Stream来获得供应商的GPGPU支持。 AFAIK,他们提供的DLL,你可以通过P / Invoke使用。

以某种方式pipe理DirectX,可能工作

CenterSpace软件在其可以添加到C#项目的NMath库中具有GPU驱动的计算function。 这是一个商业产品。

如果你打算申请你自己的algortihms需要定制的内核:

我最近上传了一个我的开源项目到这个使用OpenCL的github仓库 。

它的function(可以从它的维基页面上查看)是,从用户中select多个具有OpenCLfunction的设备和一个内核string,并创buildC#或C ++数组包装,然后使用全部计算,借助自动负载平衡器和stream水线(隐藏延迟),以获得高效率的电脑。

以下是其使用示例(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问题标签上添加任何“问题”。 多电脑群集相关的类不工作,并没有翻译成英文,但它可以使用所有设备在单个电脑至less。

WPF也使用GPU,您可以使用HLSL添加自定义着色器。

  • 基于GPU的WPF系列效果系列 (Greg Schechter博客)