【问题标题】:Run C# code on GPU在 GPU 上运行 C# 代码
【发布时间】:2011-05-06 09:56:15
【问题描述】:

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

  1. 是否可以编写一段托管 C# 代码并将其编译/翻译成某种可以在 GPU 上执行的模块?还是我注定有两种实现方式,一种在 CPU 上托管,一种在 GPU 上(我知道在 GPU 上可以执行的内容会有限制)?
  2. 是否存在一个体面且成熟的 API 可以独立于各种 GPU 硬件供应商进行编程(即通用 API)?
  3. 如果想要开发在 CPU 上运行、以托管语言编写的应用程序,并且如果存在合适的 GPU 硬件还提供速度优化,是否有任何最佳实践?

我也很乐意提供指向任何类型文档的链接以及适当的学习资源。

最好, 约瑟夫

【问题讨论】:

  • 低级代码最好用低级语言编写。当有更好的选择时,没有充分的理由在 C# 中这样做。
  • 看到这个类似的问题:stackoverflow.com/questions/375011/…
  • @EdS。我来这里是因为我有兴趣让现有的代码库在 GPU 上并行运行

标签: c# gpu


【解决方案1】:

1) 不 - 不适用于 C# 的一般情况 - 显然可以为语言的某些子集创建任何东西

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

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

基本上,您无法将 CPU 和 GPU 编码视为可比的。 GPU 是一种高度专业化的并行处理工具 - 用于大量并行简单计算。

尝试在具有大量分支等的 GPU 中编写通用程序是没有效率的——甚至可能是不可能的。

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

您应该为 CPU 编写代码,但将适当的并行计算外包给 GPU。

【讨论】:

    【解决方案2】:

    1) 不,不是针对 C# 的一般情况,而是一小部分,是的。通过运行时(检查 Tidepowerd GPU.NET)或通过语言支持(LINQ 或 Code Quotations)。

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

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

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

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

    有用的开始链接:

    【讨论】:

    【解决方案3】:

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

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

    3) OpenCL 将帮助您,您也可以使用 OpenCL 为 CPU 编译,但我不确定它为 CPU 生成的代码有多大。最近我真的爱上了 OpenCL,它真的很好用。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          然而,一个巨大的优势是内核可以在 Java 或 OpenCL 中执行(在适当的 GPU/APU 设备不可用时自动回退到 Java ThreadPool 执行)。这听起来与您在问题的第 3 部分中所寻求的最接近(尽管托管语言当然不是 C#)。

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

          【讨论】:

            猜你喜欢
            • 2017-07-27
            • 2018-09-11
            • 2017-02-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多