在GPU上运行C#代码

时间:2010-11-07 21:47:31

标签: c# gpu gpu-programming

我不了解GPU编程概念和API。我有几个问题:

  1. 是否可以编写一段托管C#代码并将其编译/转换为某种模块,可以在GPU上执行?或者我注定要有两个实现,一个用于CPU管理,一个用于GPU(我知道GPU上可以执行的操作会受到限制)?
  2. 是否存在适当且成熟的API来针对各种GPU硬件供应商(即通用API)进行独立编程?
  3. 如果想要开发在CPU上运行的应用程序,用托管语言编写,并且如果存在合适的GPU硬件,还提供速度优化,是否有最佳实践?
  4. 我也很高兴能够获得具有适当学习资源的任何文档的链接。

    最佳, 约瑟夫

6 个答案:

答案 0 :(得分:22)

1)否 - 不是针对C#的一般情况 - 显然可以为该语言的某个子集创建任何内容

2)是 - 使用Direct X或Open GL的HLSL

3)通常不可能 - CPU和GPU编码根本不同

基本上你不能认为CPU和GPU编码具有可比性。 GPU是一种高度专业化的并行处理工具 - 用于大量并行简单计算。

尝试在具有大量分支等的GPU中编写一般程序只是效率不高 - 甚至可能无法实现。

他们的内存访问架构完全不同。

您应该为CPU编写代码,但要对GPU进行适当的并行计算。

答案 1 :(得分:17)

1)不,不是因为C#的一般情况,而是一小部分,是的。通过运行时(检查Tidepowerd GPU.NET)或通过语言支持(LINQ或代码引用)。

2)是的,DirectCompute(DX11计算着色器)和OpenCL都是独立于供应商的成熟API,你可以找到它们的.NET绑定。

3)不,正如詹姆斯所说,他们是不同的野兽。 GPU是针对高吞吐量数据并行应用而优化的高延迟处理器,而CPU是针对顺序通用应用而优化的低延迟处理器。

我所知道的唯一试图解决此问题的研究项目是SPAP语言。

我的建议,不要试图找到完美的通用API /运行时,因为没有。选择现有技术(DirectCompute或OpenCL),看看如何将其用于您的业务。

有用的开始链接:

答案 2 :(得分:2)

1)我不知道,但可能有一个C#库可以帮助你。

2)OpenCL。它独立于GPU,甚至可以在CPU上运行。

3)OpenCL将为您提供帮助,您也可以使用OpenCL编译CPU,但我不确定它为CPU做了多少代码。我最近真的爱上了OpenCL,它确实非常好用。

答案 3 :(得分:2)

还有brahma。它应该捕获表达式并为GPU编译它们。我没有试过自己。

而且,微软有一个名为accelerator的研究原型,其目标相似,但语法不同。

答案 4 :(得分:1)

你看过Alea GPU了吗?图书馆虽然不是完全免费的,但却拥有公平的许可证。有很棒的文档和令人印象深刻的工具链。

答案 5 :(得分:0)

对于Java,请参阅Aparapi项目(https://github.com/aparapi/aparapi)。这允许Java的子集在支持OpenCL的任何GPU上运行。内核类的字节码在运行时交叉编译为OpenCL代码。 java代码有严格的限制,可以交叉编译 - 基本上没有对象可以用作字段,本地或方法args。

然而,一个巨大的优势是内核可以在Java或OpenCL中执行(在没有适当的GPU / APU设备的情况下自动回退到Java ThreadPool执行)。这听起来像是你在问题的第3部分中最接近的东西(当然托管语言不是C#)。

我不知道C#中有类似的东西。