1

我正在构建一个 C# 项目。该项目将通过 CUDA 使用 NVidia 的 Tesla。CUDA C 原生实现没有直接暴露给 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 的访问。

4

1 回答 1

1

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

如果要将其投入生产,则除了特定性能(例如稳定性和可靠性)之外的考虑应该是您的主要关注点。通常,除非您知道自己在做什么,否则重复社区或其他开发团队的工作可能是一个滑坡。

我知道这个答案并不能真正解决您的问题,但是在我看来,您的问题过于宽泛,没有简单的答案。最初我打算将此作为评论发布,但我认为它太长了,无法适应格式。

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

更新

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

我建议的一件事是,在决定获得“创造性”以改进事情之前,尽可能多地阅读有关编组的信息并使用性能分析器。

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

于 2013-03-07T21:00:28.760 回答