我正试图从网格中获得更多处理能力。
我正在使用所有cpus / core,是否有可能将GPU与C#一起使用。
任何人都知道任何图书馆或获得任何示例代码?
答案 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++ AMP,OpenTK -- 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编程的推荐目的地:
祝你好运!
答案 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添加自定义着色器。