2016-05-03 6 views
4

Я пытаюсь сделать вектор с 4 двойными с помощью библиотеки System.Numerics из-за SIMD. Поэтому я создал эту структуру:Указатель на структуру, содержащую System.Numerics.Vector <double> в C#

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

    ... 

} 

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

Vector4D* pntr = stackalloc Vector4D[8]; 

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

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

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

+0

См. Http://stackoverflow.com/questions/1631754/c-using-a-generic-to-create-a-pointer-array. Вы не можете использовать адрес общего типа. – Rotem

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

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