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

时间:2013-03-30 21:33:57

标签: c# .net sse simd slimdx

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

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

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

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

5 个答案:

答案 0 :(得分: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等也会带来很大的性能提升。

答案 1 :(得分:4)

由于后端C ++编译器优化,微软刚刚宣布支持在.NET Native compiler生成矢量化指令,更重要的是,在最新版本的JIT中对SIMD矢量类型的原生支持(" RyuJIT& #34)。查看一些samples here

答案 2 :(得分:1)

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

Using System.Numerics.Vector for Graphics Programming

只要新的JIT编译器“RyuJIT”成为默认编辑器,就会启用此功能,预览就在这里:

RyuJIT CTP5: Getting closer to shipping, and with better SIMD support

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

答案 3 :(得分:0)

将.NET与本机代码混合使用。在这种情况下,您需要为x86提供一个版本,为x64提供另一个版本。您可以看到Mixed (Native and Managed) Assemblies [MSDN]

答案 4 :(得分:0)

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