Указатель на структуру, содержащую System.Numerics.Vector<double> в C#

Я пытаюсь сделать вектор с 4 двойными с библиотекой System.Numerics из-за SIMD. Итак, я сделал эту структуру:

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

    ...

}

На этом этапе я кодирую его для 128-битного SIMD-регистра. Работает нормально, но когда я хочу что-то вроде этого:

Vector4D* pntr = stackalloc Vector4D[8];

Я получаю это:

Невозможно получить адрес, получить размер или объявить указатель на управляемый тип ('Vector4D')

Любая идея, как использовать stackalloc с System.Numerics.Vector? С System.Numerics.Vector4 (с плавающей точностью) проблем с указателями нет, но мне нужна двойная точность.

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);
            }
        }
    }
...
}

Это дает вам вектор для операций SIMD, а также вы можете использовать указатель для структуры. К сожалению, это примерно на 50% медленнее, чем при использовании статического массива без SIMD.

Другие вопросы по тегам