将 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++ 方法的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将数字转换为字符串的最佳方法? [复制]

C++ 转换为 C#

如何将 C++ 结构转换为 C# 结构

c++ 结构指针转换为数组互操作 c#

将项目从 C++ 转换为 C#

在构建时将 C++ 结构转换为 C# 结构