通过c#使用GPU


135

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

我正在使用所有的cpus /核心,是否可以将GPU与C#结合使用。

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

Answers:


156

[ 编辑OCT 2017,因为这个答案已经很老了 ]

这些答案大多数都已经过时了,所以我想就我认为每个项目的位置提供最新的摘要:

  • GPU.Net(TidePowerd)-我在大约6个月前尝试了此方法,尽管花了一些时间,但它确实能正常工作。在编译时将C#内核代码转换为cuda。不幸的是,他们的网站已经关闭,并且github已有几年没有更新了,这可能表明该项目已经死了。

  • Cudafy-开源,非常易于使用。在运行时将C#内核代码转换为cuda(具有序列化和缓存功能)。可以轻松地在CPU上运行相同的内核代码(主要用于调试)。支持多个GPU。这里有比其他示例更多的示例。其他答案所引用的样板代码极少,在我看来,至少有助于理解代码的工作原理。虽然只有Cuda / Nvidia。不幸的是,他们似乎也没有更新他们的解决方案几年了(2015年的最新承诺-支持CUDA 7.0)。

  • 杂交器。将C#编译为CUDA的商业解决方案。在Visual Studio市场上提供免费的社区版本,并在github 上提供示例。

  • AleaGPU商业解决方案,带有针对消费类GPU的免费社区版本。有关详细信息,请参见Daniel的评论。

  • Brahma-通过OpenCL运行LINQ表达式(因此也支持AMD)。没有太多的文档/示例。2011年的最新更新。

  • C $ -最近的发展是在10年前...

  • Microsoft Accelerator-同样,它似乎不再在积极开发中。

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

正如我所说,我会推荐Cudafy于所有其他产品上-如果它可以在OpenCL以及Cuda上运行,那将是完美的。

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


31
+1,用于更新一种快速发展的主题中的有用问题。
philologon

2
Alea GPU Quantumale.com为所有.NET语言提供CUDA支持,是完全跨平台的,并为.NET GPU代码的调试和分析提供了最佳的开发人员体验。
丹尼尔(Daniel)

Cudafy对OpenCL的支持非常糟糕-当我的项目变大时,我什至从未设法进行编译。因此,我将坚持使用简单的OpenCL并绑定到C#。
Libor 2015年

使用Cudafy的OpenCL对我来说效果很好,已经使用了很多年了
mcmillab

添加了项目链接以帮助将来的访问者。
Dan Atkinson



10

我可以推荐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/

祝你好运!


1
来自未来的问候。尽管当时可以说是一个很好的答案(我对XNA颇有涉猎),但遗憾的是XNA现在已经不复存在
-MickyD

@MickyD伟大的斯科特!当我跳入DeLorean并前进到2018年时,我完全忘了更新此答案!如果你在XNA仍然有兴趣,精神继任者可能是跨平台的MonoGame:monogame.net
戴维R.

大声笑。谢谢,我会检查一下
MickyD


9

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

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


是使用CUDAfy构建应用程序的示例。


8

好吧,这是一个非常老的问题,而且自从有人问起以来,情况已经发生了很大变化。
使用.Net编写GPU代码的另一种选择,在Alea GPU的答案中没有人提到。它涵盖了C#,F#和VB。

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

在F#官方网站上,Alea是在GPGPU编程中使用F#的首选
为了了解这个框架,我建议看一下它的综合清单。示例


1
刚看到您的答案,就会删除我的帖子。另请参见第9频道采访由Seth华雷斯这里和SO标签这里
大卫Cuccia

@DavidCuccia在检查您的旧答案方面做得很好。同时也感谢频道9的链接(2016年12月!)
Rsh


@Daniel我的意思是“链接到第9频道的录音”。那是模棱两可的吗?无论如何,感谢您指出。
Rsh 2013年

@DavidCuccia很抱歉造成混淆,链接很难看到
Daniel

7

除了梵天,还要看看C $(发音为“ C Bucks”)。从他们的CodePlex 网站

[C $]的目的是创建一种统一的语言和系统,以在现代GPU和CPU上进行无缝并行编程。

它基于C#,延迟评估,并且针对多个加速器模型:

当前,预期架构的列表包括GPU,多核CPU,多GPU(SLI,CrossFire)以及多GPU +多CPU混合架构。


7

城镇中有一个新的Microsoft解决方案-C ++ AMP此处介绍)。

C#中的使用将通过P / Invoke进行,如此针对台式机应用程序和此处(请勿致电)Metro应用程序所演示的。

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

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


2

托管DirectX可能会起作用


2
来自未来的问候。尽管当时可以说是一个很好的答案,但遗憾的是MDX现在已经被XNA取代了,而XNA也已经失效了。
MickyD

2

如果您的GPU都是同一品牌,则可以通过Nvidia的CUDA或ATI的Stream从供应商那里获得GPGPU支持。AFAIK,它们提供了DLL,您可以通过P / Invoke使用这些DLL。


1

CenterSpace Software在其NMath库中具有GPU驱动的计算,您可以将其添加到C#项目中。这是一种商业产品。


0

如果您要应用需要自定义内核的算法,请执行以下操作:

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

它的功能(您也可以从其Wiki页面检查)是,从用户中选择多个支持OpenCL的设备和一个内核字符串,然后创建C#或C ++数组包装器,然后在自动负载平衡器和流水线器(以隐藏延迟)从PC中获得良好的效率。

这是其用法的一个示例(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的问题标签上随意添加任何“问题”。多PC群集相关的类尚无法使用,并且尚未翻译为英文,但它至少可以在单PC中使用所有设备。


-2

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


据我所知,WPF没有GP GPU计算访问权限。当谈论WPF System.Windows.Media图形时,它不是真正的DirectX。与使用SharpDX或SlimDX进行较低级别的顶点编程相比,它非常慢。
Pasi Tuomainen 2014年

我添加了指向一系列有关WPF中GPU加速自定义效果的文章的链接。
Mark Cidade 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.