.NET 中的快速向量数学 - 都有哪些选项?
Posted
技术标签:
【中文标题】.NET 中的快速向量数学 - 都有哪些选项?【英文标题】:Fast Vector Math in .NET - What are the options?.NET 中的快速向量数学 - 有哪些选项? 【发布时间】:2013-03-30 21:33:56 【问题描述】:我的 3D 图形软件,使用 SlimDX 用 C# 编写,在 CPU 上执行大量矢量操作。 (在这种特定情况下,无法将工作卸载到 GPU)。
我怎样才能使我的向量数学更快?到目前为止,我已经找到了这些方法:
在 Mono 而不是 Microsoft .NET 上运行,因为它们支持 SIMD。不适用于此项目。 SlimGen,一个在运行时注入高性能数学代码的项目。不幸的是,该项目尚未处于可用状态。 使用使用 SSE 指令的编译器以 C++ 编写 DLL。通过 C# 与该 DLL 进行互操作。是否有任何其他选项可以在 .NET 中实现更快的矢量数学?
【问题讨论】:
这是怎么回事?你们这些人有时很莫名其妙。 多线程(或 Open MP)可能很有用。我不知道您是否可以在 .NET 上使用 Open MP,但如果您可以将 p/invoke 函数调用的总量保持在较低水平,我还是建议您使用本机 dll。 我知道回复晚了,但你可能想看看 Yeppp! SIMD 库 【参考方案1】:使用 Microsoft Visual C++ 的编译器编写一个 DLL。将标准 C++ 与 SSE 内在函数和/或 OpenMP 用于重数字代码,#pragma unmanaged
。使用 #pragma managed
定义 C# 可以使用的干净 C++/CLI API。
C++ 互操作比 p/invoke 快很多。 C++/CLI 是处理垃圾回收内存和本地函数假设(内存块不会移动)的唯一优雅方式。
您可能会发现,将一些 OpenGL 调用移至 C++,并直接使用 C++ 分配的内存缓冲区来加载 VBO 等,也会带来很大的性能提升。
【讨论】:
【参考方案2】:Microsoft 刚刚宣布支持在其.NET Native compiler 中生成矢量化指令,这要归功于后端 C++ 编译器优化,更重要的是在其最新版本的 JIT(“RyuJIT”)中对 SIMD 向量类型的原生支持。见一些samples here。
【讨论】:
【参考方案3】:.NET 的最新开发包括一个名为 System.Numerics.Vector 的 SIMD 专用矢量/矩阵库:
Using System.Numerics.Vector for Graphics Programming
这将在新的 JIT 编译器“RyuJIT”成为默认值时启用,公告在这里:
RyuJIT: The next-generation JIT compiler for .NET
很快(希望是 2015 年)我们将在 .NET 中拥有非常快速的 SIMD 向量,而无需任何编程开销。
【讨论】:
【参考方案4】:如果您想用 C# 编写汇编代码,另一个选择是 NAsmJit 项目,它是 AsmJit 到 C# 的一个端口。我没有更新它以反映该项目的最新变化,但大部分支持在上次检查时非常有用。
【讨论】:
【参考方案5】:将 .NET 与本机代码混合使用。在这种情况下,您将需要一个用于 x86 的版本和另一个用于 x64 的版本。可以看Mixed (Native and Managed) Assemblies[MSDN]
【讨论】:
以上是关于.NET 中的快速向量数学 - 都有哪些选项?的主要内容,如果未能解决你的问题,请参考以下文章