2016-02-11 6 views
5

Próbuję użyć System.Numerics.Vector<T> (documentation).Dlaczego Vector <T> .Count static?

Napisałem prosty test Jednostka:

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

Ale to dało mi błąd kompilacji:

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

Ku mojemu zaskoczeniu, Vector<T>.Count jest statyczny.

Tak próbowałem:

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

Teraz kod buduje, ale z testów jednostkowych nie:

Assert.AreEqual failed. Expected:<3>. Actual:<2>.

Co się dzieje?


Badanie znalazłem:

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

Twoje dwa fragmenty są identyczne. – BoltClock

+0

@BoltClock thanks fixed. –

+0

Cóż, odkrywasz, dlaczego klasa nie została dodana do frameworka. Otrzymana wartość jest również niesłusznie, na procesorze Haswell lub Broadwella powinna być podwójna wartość, ponieważ użyje on 256-bitowych rejestrów YMM dostarczonych przez AVX2. Pozostawia 2x perf na stole, trudno ukryć ten szczegół implementacji. AVX-512 już wkrótce :) –

Odpowiedz

4

The documentation sugeruje, że jest to zgodne z projektem:

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

Jego celem jest umożliwienie Wektoryzacja operacje przy użyciu możliwości sprzętowe, a tym samym jego pojemność jest związana do architektury twojego procesora.

+3

To stwierdzenie MSDN tylko sprawia, że ​​rzeczy są bardziej zagmatwane IMO, ponieważ frazowanie "Liczba instancji Vector" sugeruje, że Count jest w rzeczywistości członkiem instancji. – BoltClock

+1

Dzięki, że nie było oczywiste ze strony, którą czytałem "Zwraca liczbę elementów przechowywanych w wektorze." https://msdn.microsoft.com/en-us/library/dn877911(v=vs.111).aspx –

+0

@BoltClock Prawda, nie jest to tak jasne, jak być powinno. – BartoszKP

2

Wektor może być nieco mylący. Jest to ustalona kolekcja o zdefiniowanej długości. Zostało to naprawione, ponieważ jego długość wynosi zawsze == Vector<T>.Count. Więc jeśli zrobić:

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

wynik jest ...:

<12, 13> 

To jest po prostu spada wszystkie wartości ponad Vector<double>.Count co zdarza się 2. Sztuką jest to, że Vector<T>.Count mogą się różnić w oparciu o architekturę procesora .

To jest rzeczywiście dość niski poziom prymitywny, jak opis mówi:

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

Powiązane problemy