2008-10-13 83 views
3

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

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

在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上运行它。我觉得有没有简单的方法来做到这一点,但我想知道是否有办法做到这一点或达到一些相同的效果。

我想知道的一件事是捕获函数来转换表达式并使用它将其映射到C++ equivelant。任何人都有这方面的经验?

回答

7

CUDA.Net如果你想要一些参考如何C#可以在GPU上运行。

+0

GREAT链接,谢谢!!! – endian 2008-10-14 08:06:09

2

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

0

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

0

你可以做的是编写自己的IQueryable LINQ provider,就像LINQ to SQL将LINQ查询翻译成SQL一样。

但是,我用这种方法看到的一个问题是,LINQ查询通常是懒惰地评估的。为了从管道中受益,这可能不是一个可行的解决方案。

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

0

这是一个非常有趣的问题,我不知道如何做到这一点。

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

1

我建议以下进程加快一些使用CUDA的C#程序的计算:

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