2016-05-03 14 views
4

SIMDのためSystem.Numericsライブラリで4倍の倍精度のベクトルを作成しようとしています。だから私はこの構造体を作った:System.Numerics.Vectorを含む構造体へのポインタC#の<double>

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

    ... 

} 

この段階では、私は128ビットSIMDレジスタ用にそれをコード化する。 それは正常に動作しますが、私はこのような何かしたいとき:

Vector4D* pntr = stackalloc Vector4D[8]; 

を私はこれを取得:

「(のサイズを取得、またはマネージ型へのポインタを宣言し、のアドレスを取ることができませんVector4D ')

System.Numerics.Vectorでstackallocを使用するにはどうすればよいですか? System.Numerics.Vector4(浮動小数点精度)では、ポインタに問題はありませんが、倍精度が必要です。

+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演算のためにあなた与え、また、あなたが構造体へのポインタを使用することができます。残念ながら、SIMDなしの静的配列を使用するよりも約50%遅くなります。

関連する問題