将 C# 方法转换为 C++ 方法
Posted
技术标签:
【中文标题】将 C# 方法转换为 C++ 方法【英文标题】:Turning C# methods into C++ methods 【发布时间】:2010-09-16 21:23:18 【问题描述】:我正在探索将常见 C# 代码构造映射到 C++ CUDA 代码以在 GPU 上运行的各种选项。系统结构如下(箭头代表方法调用):
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++ 等效项。有人有这方面的经验吗?
【问题讨论】:
【参考方案1】:如果您想了解如何在 GPU 上运行 C#,请参阅 CUDA.Net。
【讨论】:
我想你会发现你不能像你说的那样在 GPU 上运行 C#,而是可以从 C# 启动 CUDA 内核。【参考方案2】:说实话,我不确定我是否完全理解您的意思。但是,您可能对这个项目感兴趣,该项目将 .Net 应用程序/库转换为直接的 C++,无需任何 .Net 框架。 http://www.codeplex.com/crossnet
【讨论】:
【参考方案3】:我建议使用以下过程来加速您在 C# 程序中使用 CUDA 的一些计算:
首先,创建一个 unmanaged C++ 库,您可以为要加速的函数 P/Invoke。这将或多或少地限制了您可以在 CUDA 中轻松使用的数据类型。 将非托管库与 C# 应用程序集成。如果你做的事情正确,你应该已经注意到某种加速。如果没有,您可能应该放弃。 替换库中的 C++ 函数(不更改其接口)以使用 CUDA 内核在 GPU 上执行计算。【讨论】:
【参考方案4】:有趣的问题。我不是 C# 方面的专家,但我认为 ICollection 是 objects 的容器。例如,如果 c 的每个元素都是一个像素,那么您必须进行大量编组才能将其转换为 CUDA 可以使用的字节缓冲区或浮点数缓冲区。我怀疑这会使一切都减慢到足以抵消在 gpu 上做任何事情的优势。
【讨论】:
【参考方案5】:您可以编写自己的IQueryable
LINQ provider,就像LINQ to SQL 将LINQ 查询转换为SQL 一样。
但是,我看到这种方法的一个问题是 LINQ 查询通常是延迟评估的。为了从流水线中受益,这可能不是一个可行的解决方案。
还可能值得研究如何为 C# 和 CUDA 实现 Google 的 MapReduce API,然后使用类似于 PyCuda 的方法将逻辑传送到 GPU。在这种情况下,查看已经存在的MapReduce implementation in CUDA 可能也很有用。
【讨论】:
【参考方案6】:这是一个非常有趣的问题,我不知道该怎么做。
然而,Brahma library 似乎做了一些非常相似的事情。您可以使用 LINQ 定义函数,然后将其编译为 GLSL 着色器以在 GPU 上高效运行。看看他们的code,尤其是Game of Life 示例。
【讨论】:
以上是关于将 C# 方法转换为 C++ 方法的主要内容,如果未能解决你的问题,请参考以下文章