C# System.Numerics.Vector初始化中的IndexOutOfRangeException

C# System.Numerics.Vector初始化中的IndexOutOfRangeException,c#,vector,simd,C#,Vector,Simd,Microsoft发布了一个向量库,该库应该允许.NET中的SIMD指令(请参阅) 然而,这件事似乎与对其构造函数的最基本调用有关: System.Numerics.Vector<byte> vec = new System.Numerics.Vector<byte>(new byte[] { 4, 3, 2, 1, 6, 4, 2, 4 }); System.Numerics.vec =新的System.Numerics.Vector(新字节[]{4,3,2,

Microsoft发布了一个向量库,该库应该允许.NET中的SIMD指令(请参阅)

然而,这件事似乎与对其构造函数的最基本调用有关:

System.Numerics.Vector<byte> vec
    = new System.Numerics.Vector<byte>(new byte[] { 4, 3, 2, 1, 6, 4, 2, 4 });
System.Numerics.vec
=新的System.Numerics.Vector(新字节[]{4,3,2,1,6,4,2,4});

这会抛出一个
System.IndexOutOfRangeException:“索引超出了数组的边界。”
我在这里缺少什么?如果我将所有出现的
byte
替换为
int

,这很好,我对这个C库一无所知,但x86 SSE2向量的宽度是16字节。也许一个
向量
期望至少有16个元素填充XMM寄存器。好主意——它似乎不起作用。我假设这是用户错误,可能只是这个库中的一个bug。他们的代码示例显示构造函数使用数组和索引:
var va=new Vector(lhs,I)国际海事组织更仔细地阅读这篇文章,并弄清楚这意味着什么。我猜它(至少在逻辑上)是从数组中的那个位置执行SIMD向量加载,得到16或32字节(或者AVX512为64字节)。不管怎样,也许你可以看看他们的示例代码是否可行。啊,你可能使用的是AVX2的CPU,所以它使用的是32B宽的SIMD向量。(YMM寄存器)。这不是对齐要求,只是最小尺寸。有一种方法可以显式地使用XMM vector width来处理剩余内存不足32B的情况(例如,在循环后的清理中,如果该方法比未对齐的最后32个字节(可能与较早的向量重叠)更有效的话),这是有意义的。不管怎样,我都要向他们提出诉讼。我觉得首选的行为应该是自动填充,或者更明确的例外。()