【问题标题】:Turning C# methods into C++ methods将 C# 方法转换为 C++ 方法
【发布时间】:2010-09-16 21:23:18
【问题描述】:

我正在探索将常见 C# 代码构造映射到 C++ CUDA 代码以在 GPU 上运行的各种选项。系统结构如下(箭头代表方法调用):

C# 程序 -> C# GPU 库 -> C++ CUDA 实现库

GPU 库中的方法可能如下所示:

public static void Map<T>(this ICollection<T> c, Func<T,T> f)
{
   //Call 'f' on each element of 'c'
}

这是 ICollection 类型的扩展方法,它在每个元素上运行一个函数。但是,我想做的是调用 C++ 库并让它在 GPU 上运行方法。这将要求函数以某种方式翻译成 C++ 代码。这可能吗?

详细地说,如果我的库的用户执行一个方法(在 C# 中),其中包含一些任意代码,我想将此代码转换为 C++ 等效项,以便我可以在 CUDA 上运行它。我觉得没有简单的方法可以做到这一点,但我想知道是否有任何方法可以做到这一点或达到一些相同的效果。

我想知道的一件事是捕获要在表达式中翻译的函数,并使用它来将其映射到 C++ 等效项。有人有这方面的经验吗?

【问题讨论】:

    标签: c# c++ interop cuda gpgpu


    【解决方案1】:

    如果您想了解如何在 GPU 上运行 C#,请参阅 CUDA.Net

    【讨论】:

    • 我想你会发现你不能像你说的那样在 GPU 上运行 C#,而是可以从 C# 启动 CUDA 内核。
    【解决方案2】:

    说实话,我不确定我是否完全理解您的意思。但是,您可能对这个项目感兴趣,该项目将 .Net 应用程序/库转换为直接的 C++,无需任何 .Net 框架。 http://www.codeplex.com/crossnet

    【讨论】:

      【解决方案3】:

      我建议使用以下过程来加速您在 C# 程序中使用 CUDA 的一些计算:

      • 首先,创建一个 unmanaged C++ 库,您可以为要加速的函数 P/Invoke。这将或多或少地限制了您可以在 CUDA 中轻松使用的数据类型。
      • 将非托管库与 C# 应用程序集成。如果你做的事情正确,你应该已经注意到某种加速。如果没有,您可能应该放弃。
      • 替换库中的 C++ 函数(不更改其接口)以使用 CUDA 内核在 GPU 上执行计算。

      【讨论】:

        【解决方案4】:

        有趣的问题。我不是 C# 方面的专家,但我认为 ICollection 是 objects 的容器。例如,如果 c 的每个元素都是一个像素,那么您必须进行大量编组才能将其转换为 CUDA 可以使用的字节缓冲区或浮点数缓冲区。我怀疑这会使一切都减慢到足以抵消在 gpu 上做任何事情的优势。

        【讨论】:

          【解决方案5】:

          您可以编写自己的IQueryable LINQ provider,就像LINQ to SQL 将LINQ 查询转换为SQL 一样。

          但是,我看到这种方法的一个问题是 LINQ 查询通常是延迟评估的。为了从流水线中受益,这可能不是一个可行的解决方案。

          还可能值得研究如何为 C# 和 CUDA 实现 Google 的 MapReduce API,然后使用类似于 PyCuda 的方法将逻辑传送到 GPU。在这种情况下,查看已经存在的MapReduce implementation in CUDA 可能也很有用。

          【讨论】:

            【解决方案6】:

            这是一个非常有趣的问题,我不知道该怎么做。

            然而,Brahma library 似乎做了一些非常相似的事情。您可以使用 LINQ 定义函数,然后将其编译为 GLSL 着色器以在 GPU 上高效运行。看看他们的code,尤其是Game of Life 示例。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-05-17
              • 2020-10-03
              • 1970-01-01
              • 2016-04-25
              • 1970-01-01
              • 2012-08-03
              • 2021-07-04
              相关资源
              最近更新 更多