6

我正在尝试使用System.Numerics.Vector<T>文档)。

我写了一个简单的单元测试:

var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 });
Assert.AreEqual(3, v.Count);

但它给了我一个构建错误:

无法使用实例引用访问成员“Vector.Count”;改为使用类型名称来限定它

令我惊讶的是,Vector<T>.Count是静态的。

所以我尝试了:

var v = new System.Numerics.Vector<double>(new double[] { 12, 13, 14 });
Assert.AreEqual(3, Vector<double>.Count);

现在代码构建但单元测试失败:

Assert.AreEqual 失败。预期:<3>。实际:<2>。

这是怎么回事?


调查我发现:

Assert.AreEqual(2, Vector<double>.Count);
Assert.AreEqual(4, Vector<float>.Count);
Assert.AreEqual(4, Vector<int>.Count);
Assert.AreEqual(2, Vector<long>.Count);
4

2 回答 2

4

文档表明这是设计使然:

Vector 实例的计数是固定的,但其上限取决于 CPU 寄存器。

其目的是允许使用硬件功能进行矢量化操作,因此其容量与您的 CPU 架构相关联。

于 2016-02-11T15:42:04.547 回答
2

Vector 类型可能有点混乱。它是固定的预定义长度集合。它是固定的,因为它的长度总是 == Vector<T>.Count。所以如果你这样做:

var v = new Vector<double>(new double[] { 12, 13, 14 });
Console.WriteLine(v);

结果是...:

<12, 13>

它只是丢弃所有Vector<double>.Count恰好为 2 的值。诀窍是Vector<T>.Count可能会因 CPU 架构而异。

正如描述所说,它实际上是非常低级的原语:

表示适用于并行算法的低级优化的指定数值类型的单个向量。

于 2016-02-11T16:25:42.080 回答