使用c#使用GPU

时间:2008-12-17 15:55:48

标签: c# gpu gpgpu

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

我正在使用所有cpus / core,是否有可能将GPU与C#一起使用。

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

13 个答案:

答案 0 :(得分:147)

[编辑OCT 2017,因为即使这个答案也很老了]

这些答案大多都很陈旧,所以我想我会给出每个项目所在位置的最新摘要:

  • 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++ AMPOpenTK -- dead / Cloo) - 其中许多只是绑定 - 即允许您从C#调用GPU,但是您的内核代码(实际在GPU上运行的代码需要用C或OpenCL编写,这意味着你必须使用(和学习)另一种语言。

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

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

答案 1 :(得分:46)

Microsoft Research Accelerator是一个.NET GP GPU库。

答案 2 :(得分:24)

我找到了Brahma ...它还有一个允许方法在GPU上运行的GPGPU提供程序...感谢您提出的问题......今天学到了新知识。 :)

答案 3 :(得分: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/

祝你好运!

答案 4 :(得分:9)

http://www.tidepowerd.com/ GPU.NET怎么样?

答案 5 :(得分:8)

这是一个非常古老的问题,因为有人问过,事情发生了很大的变化 使用.Net编写GPU代码的另一种选择,Alea GPU中的答案中没有人提到过。它涵盖了C#,F#和VB。

  

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

在F#官方网站上,Alea是在GPGPU编程中使用F#的first option 要了解此框架,我建议您查看其examples的完整列表。

答案 6 :(得分:7)

除了梵天,请看C$(发音为“C Bucks”)。来自他们的CodePlex site

  

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

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

  

目前的清单   预期的架构包括GPU,   多核CPU,多GPU(SLI,   CrossFire)和Multi-GPU + Multi-CPU   混合架构。

答案 7 :(得分:7)

城里有一个新的Microsoft解决方案 - C++ AMP(简介here)。

使用C#将通过P / Invoke,对于桌面应用程序进行演示here,对于(不称之为)Metro应用程序使用here

编辑:我应该注意C ++ AMP有一个open specification,这意味着它不一定只用于MS编译器,或仅用于Windows。

编辑:显然,技术is now in "maintenance mode,"意味着他们正在修复错误,但没有积极开发。

答案 8 :(得分:2)

以某种方式管理DirectX,可能会起作用

答案 9 :(得分:2)

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

如果您要应用自己需要自定义内核的algortihms:

我最近将我的一个开源项目上传到使用OpenCL的this github repository

它的作用(你也可以从它的wiki页面查看)是,从用户中选择多个支持OpenCL的设备和一个内核字符串,然后创建C#或C ++数组包装器,然后在自动加载的帮助下使用all进行计算 - 平衡器和 piper(隐藏延迟)以从电脑中获得良好的效率。

以下是其使用示例(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 ++资源。

但它并不那么成熟,所以请随意添加任何&#34;问题&#34;在github问题选项卡上。 多个PC群集相关的类不起作用,但尚未翻译成英语,但它至少可以在单个PC中使用所有设备。

答案 12 :(得分:-2)

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