将C#方法转换为C ++方法

时间:2008-10-13 13:40:31

标签: c# c++ interop cuda gpgpu

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

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

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

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

这是ICollection的扩展方法&lt;&gt;在每个元素上运行函数的类型。但是,我希望它能够调用C ++库并使其在GPU上运行方法。这将要求函数以某种方式转换为C ++代码。这可能吗?

详细说明,如果我的库的用户执行了一个带有一些任意代码的方法(在C#中),我想将这段代码翻译成C ++ equivelant,以便我可以在CUDA上运行它。我觉得没有简单的方法可以做到这一点,但我想知道是否有任何方法可以做到这一点或达到一些相同的效果。

我想知道的一件事是捕获要在Expression中翻译的函数,并使用它将其映射到C ++ equivelant。任何人都有这方面的经验吗?

6 个答案:

答案 0 :(得分:7)

如果你想要一些参考如何在GPU上运行C#,那么CUDA.Net

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

然而,我在这种方法中看到的一个问题是LINQ查询通常是懒惰地评估的。为了从流水线技术中受益,这可能不是一个可行的解决方案。

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

也可能有用

答案 5 :(得分:0)

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

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