在 C# 中指向包含 System.Numerics.Vector<double> 的结构的指针
Pointer to struct containing System.Numerics.Vector<double> in C#
由于 SIMD,我正在尝试使用 System.Numerics 库制作具有 4 个双打的向量。所以我做了这个结构:
public struct Vector4D
{
System.Numerics.Vector<double> vecXY, vecZW;
...
}
在这个阶段我为128位SIMD寄存器编码。
它工作正常,但是当我想要这样的东西时:
Vector4D* pntr = stackalloc Vector4D[8];
我明白了:
无法获取托管类型的地址、获取其大小或声明指向托管类型的指针 ('Vector4D')
知道如何将 stackalloc 与 System.Numerics.Vector 一起使用吗?使用 System.Numerics.Vector4(浮点精度)指针没有问题,但我需要双精度。
我解决了:
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 操作的 Vector,您还可以使用指向结构的指针。不幸的是,它比使用没有 SIMD 的静态数组慢大约 50%。
由于 SIMD,我正在尝试使用 System.Numerics 库制作具有 4 个双打的向量。所以我做了这个结构:
public struct Vector4D
{
System.Numerics.Vector<double> vecXY, vecZW;
...
}
在这个阶段我为128位SIMD寄存器编码。 它工作正常,但是当我想要这样的东西时:
Vector4D* pntr = stackalloc Vector4D[8];
我明白了:
无法获取托管类型的地址、获取其大小或声明指向托管类型的指针 ('Vector4D')
知道如何将 stackalloc 与 System.Numerics.Vector 一起使用吗?使用 System.Numerics.Vector4(浮点精度)指针没有问题,但我需要双精度。
我解决了:
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 操作的 Vector,您还可以使用指向结构的指针。不幸的是,它比使用没有 SIMD 的静态数组慢大约 50%。