如何在新的.NET Framework 4.6中启用SIMD?

wh1*_*p3r 5 .net c#

我写了一个代码来测试,哪种方式更快.我在Release x64中运行代码.我有VS 2015 Pro与.NET Framework 4.6.

#if SYSTEMMATHLIB
using System.Numerics;
#else
using Engine.Mathematic;
#endif

namespace Engine.Editor
{
    public static class Program
    {
        public static void Main()
        {
            #if SYSTEMMATHLIB
            Console.WriteLine("Hardware Acceleration: " + Vector.IsHardwareAccelerated.ToString());
            #endif

            Stopwatch sw = new Stopwatch();
            sw.Start();

#if SYSTEMMATHLIB
            for (int i = 0; i < 1000000; i++)
            {
                Matrix4x4 m = Matrix4x4.CreateRotationZ(0.50f);
                m.Translation = new Vector3(5, 10, 15);

                Matrix4x4 m2 = Matrix4x4.CreateRotationX(0.50f);
                m2.Translation = new Vector3(-5, 10, -15);

                Matrix4x4 m3 = m * m2;
                Matrix4x4 inv; Matrix4x4.Invert(m3, out inv);
            }
#else
            for (int i = 0; i < 1000000; i++)
            {
                Matrix m = Matrix.RotationZ(0.50f);
                m.TranslationVector = new Vector3(5, 10, 15);

                Matrix m2 = Matrix.RotationX(0.50f);
                m2.TranslationVector = new Vector3(-5, 10, -15);

                Matrix m3 = m * m2;
                Matrix inv; Matrix.Invert(ref m3, out inv);
            }
#endif
            long mili = sw.ElapsedMilliseconds;
            sw.Stop();        

            Console.WriteLine("Total mili: " + mili.ToString());
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

好吧,如果我使用Framework 4.6(Nuget版本)中的System.Numerics运行它,则计算需要212ms.如果我将它切换到我的库,这只是简单的c#代码来计算它,它也需要大约210毫秒.那有点奇怪吧?我虽然SIMD应该更快!

顺便说一句,IsHardwareAccelerated返回"True".

那么我做错了什么?

仅供参考:没有SIMD的C++使用SIMD运行390ms和77ms.

wh1*_*p3r 2

我反编译了 System.Numerics.Vector,我意识到,SIMD 仅针对 Vector 实现,而不针对 Matrix4x4。所以汉斯·帕桑是对的。

我希望他们也能尽快添加对 SIMD Matrix 的支持。