指向包含C#中System.Numerics.Vector <double>的struct的指针

时间:2016-05-03 10:47:18

标签: c# pointers simd stackalloc system.numerics

由于SIMD,我正在尝试使用System.Numerics库制作带有4个双打的向量。所以我做了这个结构:

public struct Vector4D
{
    System.Numerics.Vector<double> vecXY, vecZW;

    ...

}

在此阶段,我将其编码为128位SIMD寄存器。 它工作正常,但当我想要这样的东西时:

Vector4D* pntr = stackalloc Vector4D[8];

我明白了:

无法获取地址,获取大小或声明指向托管类型的指针('Vector4D')

知道如何在System.Numerics.Vector中使用stackalloc吗?使用System.Numerics.Vector4(浮点精度),指针没有问题,但我需要双精度。

1 个答案:

答案 0 :(得分:1)

我解决了它:

public struct Vector4D
{
    public double X, Y, Z, W;

    private unsafe Vector<double> vectorXY
    {
        get
        {
            fixed (Vector4D* ptr = &this)
            {
                return SharpDX.Utilities.Read<Vector<double>>((IntPtr)ptr);
            }
        }
        set
        {
            fixed (Vector4D* ptr = &this)
            {
                SharpDX.Utilities.Write<Vector<double>>((IntPtr)ptr, ref value);
            }
        }
    }

    private unsafe Vector<double> vectorZW
    {
        get
        {
            fixed (Vector4D* ptr = &this)
            {
                return SharpDX.Utilities.Read<Vector<double>>((IntPtr)((double*)ptr) + 2);
            }
        }
        set
        {
            fixed (Vector4D* ptr = &this)
            {
                SharpDX.Utilities.Write<Vector<double>>((IntPtr)((double*)ptr) + 2, ref value);
            }
        }
    }
...
}

这为您提供了Vector for SIMD操作,您也可以使用指向struct的指针。不幸的是,它比使用没有SIMD的静态数组慢了约50%。