c++ - 编写 C++ Dll 并将其高效地公开给 .NET(不通过 C++/CLI)

标签 c++ .net interop pinvoke marshalling

<分区>

我正在构建一个 C# 项目。该项目将通过 CUDA 使用 NVidia 的 Tesla。 CUDA C native 实现不会直接暴露给 C#,而且在我看来,可用的 C# 包装器(如 Brahma、CUDAfy、Linq to GPU)对于生产来说还不够成熟。

我决定继续在 C++ 组件中构建我的数学逻辑,该组件将访问官方支持的 CUDA 方式。 C++/CLI 不是一个选项,因为我使用英特尔 C++ 编译器来提高性能,它不支持 CLR 扩展。

我最重要的标准是性能,因此,我会尽量减少 C++(我的业务逻辑所在的位置)和 .NET(我的其余应用程序)之间的编码和复制数组。

我知道之前有人问过这个问题,但大多数情况下,C++ 库已经存在,有时,C++/CLI 是一个选项,但在这里,这两种情况都不是。

考虑到我要用 C++ 从头开始​​编写 C++ 库,我可以决定将它公开给 C# 的最佳方式。您是否有我应该遵循的任何建议或最佳实践来获得 C++ 和 .NET 之间最简单和最高性能的集成?请注意,我要交换的主要是大型数组

编辑:澄清我正在用 C++ 构建我的业务逻辑(数学),而不是一个基础设施库来促进对 GPU 的访问。

最佳答案

虽然肯定有可能胜过您认为不够成熟的现有库,但您在这里问这个问题这一事实应该让您在决定推出自己的库/实现时三思而后行!

如果要将其投入生产,稳定性和可靠性等特定性能之外的考虑因素应该是您的首要考虑因素。通常,除非您知道自己在做什么,否则重复社区或其他开发人员团队的工作可能会导致滑坡。

我知道这个答案并没有真正解决您的问题,但我认为您的问题过于宽泛,没有简单的答案。最初我打算将其作为评论发布,但觉得它太长了,不适合这种格式。

因此,最后,我建议您试用现有的库,如果您发现它们从性能的角度来看不合适,请开始提出具体问题。

更新

如果您打算在 C++ 中实现大部分逻辑,并且您希望只是将一些结果以数组的形式传回您的托管代码,那么您需要做的事情并不多。通常,数组的自动编码与您将要获得的一样高效。

我建议的一件事是尽可能多地阅读有关编码的信息并使用性能分析器,然后再决定“发挥创造力”以改进事物。

这是最后一个可能很有趣的想法,但同样,您应该在尝试使用它之前进行概要分析:您可以尝试使用内存映射文件作为数据的后备存储,并从两端打开文件。最终,这可能有用也可能没用,所以绝对购买前的个人资料 ;)

关于c++ - 编写 C++ Dll 并将其高效地公开给 .NET(不通过 C++/CLI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15281496/

相关文章:

c++ - C动态成员结构

c# - 用另一台电脑调用一台电脑(Dial up Modem)

java - 用于创建高负载 Web 服务的语言和框架?

C++/CLI - 调用 DLL 中定义的非托管函数

c++ - 如何插入 std::map

c++ - Direct2D 中的双缓冲?

c# - ASP.NET FormsAuthentication - 要解密的数据长度无效

.net - 如何禁用所有 .NET 安全策略?

C#,创建 excel 97-2003 (.xls) Interop

c++ - 使用字符数组反转字符串