3

我正在探索将常见 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++ 等价物。有人有这方面的经验吗?

4

6 回答 6

7

如果您想了解如何在 GPU 上运行 C#,可以参考CUDA.Net 。

于 2008-10-13T13:51:35.947 回答
2

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

于 2008-10-13T13:57:13.613 回答
1

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

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

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

于 2008-11-25T22:38:55.677 回答
0

您可以做的是编写自己的IQueryableLINQ 提供程序,就像LINQ to SQL将 LINQ 查询转换为 SQL 一样。

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

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

于 2008-11-25T22:50:19.350 回答
0

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

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

于 2009-07-09T13:47:23.180 回答