16

我使用 SlimDX 用 C# 编写的 3D 图形软件在 CPU 上执行大量矢量操作。(在这种特定情况下,无法将工作卸载到 GPU)。

我怎样才能让我的向量数学更快?到目前为止,我已经找到了这些方法:

  • 在 Mono 而不是 Microsoft .NET 上运行,因为它们支持 SIMD。不是这个项目的选择。
  • SlimGen,一个在运行时注入高性能数学代码的项目。不幸的是,该项目尚未处于可用状态。
  • 使用使用 SSE 指令的编译器在 C++ 中编写 DLL。从 C# 与该 DLL 互操作。

有没有其他选项可以在 .NET 中完成更快的矢量数学?

4

5 回答 5

8

使用 Microsoft Visual C++ 的编译器编写一个 DLL。将标准 C++ 与 SSE 内在函数和/或 OpenMP 用于繁重的数字代码,使用#pragma unmanaged. 用于#pragma managed定义 C# 可以使用的干净的 C++/CLI API。

C++ 互操作比 p/invoke 快很多。C++/CLI 是处理垃圾回收内存和本机函数假设(内存块不会移动)的唯一优雅方法。

您可能会发现将一些 OpenGL 调用移动到 C++,并直接使用 C++ 分配的内存缓冲区来加载 VBO 等,也会带来很大的性能提升。

于 2013-03-30T23:48:19.703 回答
4

微软刚刚宣布支持在其.NET Native 编译器中生成矢量化指令,这要归功于后端 C++ 编译器优化,更重要的是,在其最新版本的 JIT(“RyuJIT”)中对 SIMD 向量类型的原生支持。在此处查看一些示例

于 2014-04-04T15:00:08.387 回答
2

.NET 的最新发展包括一个名为 System.Numerics.Vector 的 SIMD 专用向量/矩阵库:

使用 System.Numerics.Vector 进行图形编程

这将在新的 JIT 编译器“RyuJIT”成为默认值时启用,公告在这里:

RyuJIT:.NET 的下一代 JIT 编译器

所以很快(希望是 2015 年)我们将在 .NET 中拥有非常快速的 SIMD 向量,而无需任何编程开销。

于 2015-03-20T13:36:28.303 回答
1

如果你想用 C# 编写汇编代码,另一个选择是NAsmJit项目,它是AsmJit到 C# 的一个端口。我没有更新它以反映该项目的最新变化,但大部分支持在最后一次检查时非常有用。

于 2014-04-04T15:22:06.613 回答
0

将 .NET 与本机代码混合。在这种情况下,您将需要一个用于 x86 的版本和另一个用于 x64 的版本。您可以查看混合(本机和托管)程序集[MSDN]

于 2013-03-30T23:48:13.337 回答