使用C#利用GPU

146

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

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

有人知道任何库或有任何示例代码吗?


当然,这里有一个使用计算机中所有GPU自动化的示例:https://github.com/tugrul512bit/Cekirdekler/wiki/Hello-World - huseyin tugrul buyukisik
13个回答

167

[本回答更新于2017年10月]

这些回答大部分已经过时,所以我想给出一个更新的总结:

  • GPU.Net(TidePowerd)- 我大约在6个月前尝试过,并成功运行,但需要花费一些功夫。可以将C#内核代码转换为cuda。不幸的是,他们的网站已经关闭了,他们的github也没有更新几年了,这可能表明该项目已经停滞了....

  • Cudafy - 开源且非常易于使用。可以将C#内核代码转换为cuda(具有序列化和缓存的功能)。可以轻松地在CPU上运行相同的内核代码(主要用于调试)。支持多个GPU。比其他人多提供了更多的示例。其他答案提到的样板代码很少,并且至少在我的情况下有助于我理解代码如何工作。只支持Cuda / Nvidia。不幸的是,他们似乎也没有更新解决方案(最新提交于2015年 - 支持cuda 7.0)。

  • Hybridizer。将C#编译为CUDA的商业解决方案。在visual studio marketplace上提供免费的社区版和在github上提供示例。

  • AleaGPU。面向消费者GPUS的免费社区版的商业解决方案。详情请参见Daniel的评论。

  • Brahma - 通过OpenCL运行LINQ表达式(因此也支持AMD)。文档/示例不多。上次更新于2011年。

  • C$ - 最近的开发已经超过10年了...

  • Microsoft Accelerator - 看起来也不像正在积极开发。

  • 其他一些库(C++ AMP, OpenTK -- 已死/Cloo) - 这些库中的许多只是绑定 - 使您能够从C#调用GPU,但是您的内核代码(实际在GPU上运行的代码)需要用C或OpenCL编写,这意味着您必须使用(并学习)另一种语言。

  • 正如我所说,相比其他所有库,我推荐Cudafy - 如果它能在OpenCL上运行,就像在Cuda上一样完美。

    2013年9月编辑 现在,Cudafy允许您编译为 CUDA和OpenCL,因此可以在所有GPU上运行相同的C#代码。这听起来很棒,但我还没有测试过OpenCL编译。


    35
    更新一个在快速发展的学科中非常有用的问题,给它点赞。 - philologon
    2
    Alea GPU http://www.quantalea.com/ 为所有 .NET 语言提供 CUDA 支持,完全跨平台,并为 .NET GPU 代码的调试和分析提供最佳开发体验。 - Daniel
    Cudafy中的OpenCL支持相当糟糕 - 当我的项目变得更大时,我甚至无法编译。因此我会坚持使用纯OpenCL并制作到C#的绑定。 - Libor
    添加了项目链接以帮助未来的访问者。 - Dan Atkinson
    4
    ILGPU(http://www.ilgpu.net):一款现代、轻量级和快速的GPU编译器,用于高性能的.Net程序。它是免费的!ILGPU发布在伊利诺伊大学/ NCSA开源许可下。ILGPU是一个免费且非赞助项目。它由专业而热情的编译器、GPU和计算机图形开发者开发。通过贡献或小额捐款来支持项目,加速开发进程并保持项目活力。 - DanOver
    显示剩余5条评论

    49

    微软研究的Accelerator是一个.NET通用并行图形处理器库。


    那是一个很棒的项目,但许可政策很差。不幸的是,它已经不再在微软网站上提供了... - ForNeVeR

    27

    我发现了Brahma... 它还有一个GPGPU提供程序,可以让方法在GPU上运行... 感谢这个问题... 今天学会了新东西。 :)


    10
    这是另外一个: CUDAfy。它听起来像GPU.Net, 只需简单的方法属性就可以使整个方法在GPU上运行。但不同于GPU.Net,CUDAfy是免费且开源的。
    GPU.Net似乎不需要任何样板代码,尽管(根据他们的文档,它是"由构建工具自动注入的"),而CUDAfy则需要。
    这里是使用CUDAfy构建应用程序的示例:这里

    9
    我可以推荐XNA Game Studio作为探索的可能途径吗?它显然是为编写游戏而设计的,但它为您提供了对图形卡的托管访问,并且比以前可用的Managed 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/ 祝你好运!

    2
    来自未来的问候。虽然当时这可能是一个不错的答案(我曾经深入研究过XNA),但可悲的是,现在XNA已经停止维护了。 - user585968
    @MickyD 天哪!当我跳进我的DeLorean并前往2018年时,我完全忘记更新这个答案了!如果你仍然对XNA感兴趣,那么它的精神继承者可能是跨平台的MonoGame:http://www.monogame.net - Dave R.
    哈哈,谢谢,我会去看看的。 - user585968

    9

    2
    我喜欢这个想法,但大约两年前他们停止回答技术支持问题,该网站已经停运了大约一年,所以我认为该项目已经死亡。不过,显然作者在SO上活跃。 - BlueRaja - Danny Pflughoeft
    Tidepower已停止GPU.NET的开发并关闭了他们的业务。 - Daniel

    8
    这是一个相当久远的问题了,而且自提出这个问题以来情况已经发生了很大变化。 使用.Net来编写GPU代码的另一种选择是Alea GPU,而且还没有在答案中提到过。它支持C#、F#和VB。

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

    在F#官方网站上,对于在GPGPU编程中使用F#,Alea是第一选项。 为了了解这个框架,建议查看其全面的示例列表

    1
    刚看到你的回答,我会删除我的帖子。此外,请参阅 Seth Juarez 的 Channel 9 访谈(链接:https://channel9.msdn.com/Blogs/Seth-Juarez/Radically-Simplified-GPU-Programming-with-C)和 SO 标签(链接:http://stackoverflow.com/questions/tagged/aleagpu)。 - lightw8
    @DavidCuccia 做得好,检查你的旧答案。还有感谢你提供的 Channel 9 链接(2016 年 12 月!) - Rsh
    我想你指的是这个Channel 9录像 - Daniel
    @Daniel 我的意思是“链接到 Channel 9 录制视频”。这样说有歧义吗?不管怎样,感谢你指出。 - Rsh
    @DavidCuccia 抱歉让你感到困惑,链接很难看到。 - Daniel

    7
    除了 Brahma 之外,看一下 C$(发音为“C Bucks”)。从他们的 CodePlex 网站
    “[C $] 的目标是创建一个统一的语言和系统,实现在现代 GPU 和 CPU 上进行无缝并行编程。”
    它基于 C#,惰性评估,并针对多个加速器模型:
    “当前拟定架构列表包括 GPU、多核 CPU、多 GPU(SLI、CrossFire)以及多 GPU + 多 CPU 混合架构。”

    7

    现在有一种新的微软解决方案 - C++ AMP(介绍在这里)。

    C#中的使用是通过P/Invoke,如在桌面应用程序中演示的这里,以及在(不要称之为)Metro应用程序中的这里

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

    编辑:显然,这项技术现在处于“维护模式”,这意味着他们正在修复错误,但不积极开发。


    2
    如果您的GPU都是同一品牌,您可能可以通过供应商获得GPGPU支持,可以使用Nvidia的CUDA或ATI的Stream。据我所知,它们提供DLL,您可以通过P/Invoke使用它们。

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