将C#方法转换为C++方法
Turning C# methods into C++ methods
我正在探索将常见的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上高效运行。看看他们的代码,特别是"生命的游戏"示例。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法