2016-02-11 8 views
5

System.Numerics.Vector<T>documentation)を使用しようとしています。 ベクトルはなぜ<T> .Countスタティックですか?

は、私はシンプルなユニットテストを書いた:

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

をしかし、それは私のビルドエラーました:Vector<T>.Countが静的​​である、驚いたことに

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

を。

だから私は試してみました:

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); 
+2

あなたの2つのスニペットが同一です。 – BoltClock

+0

@BoltClockありがとうございました。 –

+0

なぜ、クラスがフレームワークに追加されなかったのかを発見しています。あなたが得る価値も悲しいことですが、HaswellまたはBroadwellプロセッサでは、AVX2が提供する256ビットのYMMレジスタを使用するため、値を倍にする必要があります。テーブルに2倍のperfを残す。実装の詳細を隠すのは難しい。 AVX-512がまもなく登場です:) –

答えて

4

The documentationが、これは設計によってであることを示唆している:

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

その目的は、ハードウェア機能を使用して操作をベクトル化できるようにすることですので、その容量が接続されていあなたのCPUのアーキテクチャに。

+3

MSDNのこのステートメントは、「ベクトルインスタンスの数」という言葉は、実際にCountがインスタンスメンバーであることを暗示しているため、IMOを混乱させるだけです。 – BoltClock

+1

私が読んでいたページからは分かりませんでした。 "ベクトルに格納されている要素の数を返します。" https://msdn.microsoft.com/en-us/library/dn877911(v=vs.111).aspx –

+0

@BoltClock真実ではないはずですが、それは明らかではありません。 – BartoszKP

2

ベクターが多少混乱するかもしれません。固定長定義コレクションです。長さが常に== 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.