.NET中的快速矢量数学 - 有哪些选择?

LTR*_*LTR 15 .net c# sse simd slimdx

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

如何让矢量数学更快?到目前为止,我发现了这些方法:

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

还有其他选项可以在.NET中实现更快的矢量数学吗?

Ben*_*igt 8

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

C++ interop比p/invoke快一点.而C++/CLI是处理垃圾收集内存和本机函数假设(内存块不会移动)的唯一优雅方式.

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


sw.*_*sw. 0

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