为什么 Vector<T>.Count 是静态的?

Why is Vector<T>.Count static?

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

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

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

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

Member 'Vector.Count' cannot be accessed with an instance reference; qualify it with a type name instead

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

所以我尝试了:

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

现在代码生成但单元测试失败:

Assert.AreEqual failed. Expected:<3>. Actual:<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);

The documentation 表明这是设计使然:

The count of a Vector instance is fixed, but its upper limit is CPU-register dependent.

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

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 体系结构而有所不同。

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

Represents a single vector of a specified numeric type that is suitable for low-level optimization of parallel algorithms.