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

jquia 发布于 2018-05-14 c# 最后更新 2018-05-14 13:53 119 浏览

我正在探索将常见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<>类型的扩展方法。但是,我想要做的是调用C++库并使其在GPU上运行这些方法。这需要将函数以某种方式转换为C++代码。这可能吗? 详细说明一下,如果我的库的用户执行一个包含一些任意代码的方法(用C#),我想将这些代码翻译成C++ equivelant,以便我可以在CUDA上运行它。我有这样的感觉,即没有简单的方法来做到这一点,但我想知道是否有办法做到这一点或达到一些相同的效果。 我想知道的一件事是捕获函数以在Expression中进行转换,并使用它将其映射到C++ equivelant。任何人都有这方面的经验?
已邀请:

zrerum

赞同来自:

CUDA.Net如果您想要参考C#如何在GPU上运行,请参阅PLACEHOLDER_FOR_CODE_0。

paut

赞同来自:

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

tquod

赞同来自:

有趣的问题。我在C#上并不是很专业,但我认为ICollection是一个对象的容器。如果c的每个元素都是像素,则必须进行大量编组才能将其转换为CUDA可以使用的字节或浮点缓冲区。我怀疑这会让所有的东西放慢速度,否定在GPU上做任何事情的优势。

rqui

赞同来自:

你可以做的是写一个自己的IQueryable LINQ provider,就像LINQ to SQL将LINQ查询翻译成SQL一样。 然而,我用这种方法看到的一个问题是,LINQ查询通常是懒惰地评估的。为了从管道中受益,这可能不是一个可行的解决方案。 还可能值得研究如何为C#和CUDA实现Google的MapReduce API,然后使用类似于PyCuda的方法将逻辑发送到GPU。在这种情况下,查看已有的MapReduce implementation in CUDA可能也很有用。

sit_id

赞同来自:

这是一个非常有趣的问题,我不知道如何做到这一点。 但是,Brahma library似乎做了非常类似的事情。您可以使用LINQ定义函数,然后将其编译为GLSL着色器以在GPU上高效运行。看看他们的code,特别是Game of Life样本。

mnatus

赞同来自:

我会推荐以下过程来使用C#程序中的CUDA加速一些计算:

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