快速矢量数学在.net -什么是选项
本文关键字:net 什么 选项 | 更新日期: 2023-09-27 18:06:53
我的3D图形软件,用c#编写,使用SlimDX,在CPU上做了很多矢量运算。(在这种特定情况下,不可能将工作卸载给GPU)。
我如何使我的向量数学更快?到目前为止,我找到了这些方法:
- 运行在Mono而不是microsoft.net上,因为他们有SIMD支持。 SlimGen,一个在运行时注入高性能数学代码的项目。不幸的是,该项目还没有处于可用状态。使用使用SSE指令的编译器在c++中编写一个DLL。与c#中的DLL互操作。
在。net中是否有其他方法来实现更快的矢量数学?
使用Microsoft Visual c++编译器编写一个DLL。使用带有SSE特性的标准c++和/或OpenMP来处理大量的数字代码,如#pragma unmanaged
。使用#pragma managed
定义一个c#可以使用的干净的c++/CLI API。
c++互操作比p/invoke快得多。c++/CLI是处理垃圾收集内存和本机函数假设(内存块不会移动)的唯一优雅方式。
你可能会发现,将一些OpenGL调用移到c++中,并直接使用c++分配的内存缓冲区来加载vbo等,也会带来很大的性能优势。
微软刚刚宣布,由于后端c++编译器优化,他们的。net原生编译器支持生成向量化指令,更重要的是,在最新版本的JIT("RyuJIT")中,原生支持SIMD矢量类型。
.NET的最新发展包括一个SIMD专用的矢量/矩阵库System.Numerics.Vector:
使用System.Numerics.Vector进行图形编程
当新的JIT编译器"RyuJIT"将是默认的,公告在这里:
RyuJIT:下一代。net JIT编译器
所以很快(希望是2015年),我们将在。net中拥有非常快速的SIMD向量,而无需任何编程开销。
如果您想用c#编写汇编代码,另一个选择是NAsmJit项目,它是AsmJit到c#的移植。我还没有更新它来反映这个项目的最新变化,但是在最后一次检查中,大部分支持都是相当可用的。
混合。net和本地代码。在这种情况下,您将需要一个x86版本和另一个x64版本。您可以看到混合(本机和托管)程序集[MSDN]