我不了解GPU编程概念和API。我有几个问题:
我也很高兴能够获得具有适当学习资源的任何文档的链接。
最佳, 约瑟夫
答案 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#中有类似的东西。