我正在探索将常见的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。任何人都有这方面的经验吗?
答案 0 :(得分:7)
如果你想要一些参考如何在GPU上运行C#,那么CUDA.Net。
答案 1 :(得分:2)
说实话,我不确定我完全理解你的目标。但是,您可能对此项目感兴趣,该项目将.Net应用程序/库转换为直接C ++,无需任何.Net框架。 http://www.codeplex.com/crossnet
答案 2 :(得分:1)
我建议使用以下过程来加速C#程序中使用CUDA的计算:
答案 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样本。