将C#方法转换为C++方法
本文关键字:方法 C++ 转换 | 更新日期: 2023-09-27 17:48:54
我正在探索将常见的C#代码结构映射到用于在GPU上运行的C++CUDA代码的各种选项。系统的结构如下(箭头表示方法调用):
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++等价物。有人有这方面的经验吗?
如果你想参考C#如何在GPU上运行,这里有CUDA.Net。
老实说,我不确定我是否完全理解你的意思。但是,你可能对这个项目感兴趣,它将.Net应用程序/库转换为直接的C++,不需要任何.Net框架。http://www.codeplex.com/crossnet
我建议使用以下过程来加速C#程序中使用CUDA的一些计算:
- 首先,创建一个非托管C++库,为要加速的函数调用该库。这将或多或少地限制您在CUDA中可以轻松使用的数据类型
- 将非托管库与C#应用程序集成。如果你做的事情是正确的,你应该已经注意到某种速度的加快。如果没有,你可能应该放弃
- 替换库中的C++函数(不更改其接口),以便使用CUDA内核在GPU上执行计算
有趣的问题。我不是很擅长C#,但我认为ICollection是对象的容器。如果c的每个元素都是一个像素,那么就必须进行大量的编组,才能将其转换为CUDA可以使用的字节或浮点缓冲区。我怀疑这会让一切变得足够慢,从而否定在gpu上做任何事情的优势。
您可以编写自己的IQueryable
LINQ提供程序,就像LINQ to SQL将LINQ查询转换为SQL一样。
然而,我在这种方法中看到的一个问题是,LINQ查询通常是延迟求值的。为了从流水线中获益,这可能不是一个可行的解决方案。
同样值得研究的是,如何为C#和CUDA实现Google的MapReduce API,然后使用类似于PyCuda的方法将逻辑发送到GPU。在这种情况下,看看CUDA中已经存在的MapReduce实现可能也很有用。
这是一个非常有趣的问题,我不知道该怎么做。
然而,梵天图书馆似乎做了一些非常相似的事情。可以使用LINQ定义函数,然后将这些函数编译为GLSL着色器,以便在GPU上高效运行。看看他们的代码,特别是"生命的游戏"示例。