我使用SlimDX用C#编写的3D图形软件在CPU上进行了大量的矢量操作。 (在这种特定情况下,无法将工作卸载到GPU)。
如何让矢量数学更快?到目前为止,我已经找到了这些方法:
还有其他选择可以在.NET中实现更快的矢量数学吗?
答案 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)