Answers:
[ 编辑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 ++ AMP,OpenTK-dead / Cloo)-其中许多只是绑定-即使您能够从C#调用GPU,但是您的内核代码(实际上在GPU上运行的代码)需要编写C或OpenCL,这意味着您必须使用(并学习)另一种语言。
正如我所说,我会推荐Cudafy于所有其他产品上-如果它可以在OpenCL以及Cuda上运行,那将是完美的。
编辑2013年9月 Cudafy现在允许您编译双方 CUDA和OpenCL,所以会在所有GPU上运行相同的C#代码。这听起来很棒,尽管我还没有测试过OpenCL编译。
我发现了Brahma ...它也有一个GPGPU提供程序,它允许方法在GPU上运行...感谢您的提问...今天学到了一些新知识。:)
我可以推荐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://www.tidepowerd.com/ GPU.NET?
如果您要应用需要自定义内核的算法,请执行以下操作:
我最近将我的一个开源项目上传到了这个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中使用所有设备。
WPF还使用GPU,您可以使用HLSL添加自定义着色器。