2016-02-11 9 views
5

Sto tentando di utilizzare System.Numerics.Vector<T> (documentation).Perché il vettore è <T> .Count statico?

ho scritto un semplice test di unità:

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

ma mi ha dato un errore di generazione:

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

Con mia grande sorpresa, Vector<T>.Count è statico.

Così ho provato:

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

Ora il codice costruisce ma il test di unità fallisce:

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

Cosa sta succedendo?


Investigating ho trovato:

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

I suoi due frammenti sono identici. – BoltClock

+0

@BoltClock grazie risolto. –

+0

Bene, stai scoprendo perché la classe non è stata aggiunta al framework. Anche il valore che si ottiene è tristemente sbagliato, in un processore Haswell o Broadwell dovrebbe essere il doppio del valore dato che utilizzerà i registri YMM a 256 bit forniti da AVX2. Lascia 2x perf sul tavolo, difficile da nascondere i dettagli di implementazione. AVX-512 è in arrivo :) –

risposta

4

The documentation suggerisce che questo è di progettazione:

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

Il suo scopo è quello di consentire le operazioni di vettorizzazione utilizzando i componenti hardware, e quindi la sua capacità è legata per l'architettura della tua CPU.

+3

Questa istruzione da MSDN rende le cose più confuse IMO, poiché il fraseggio "Il conteggio di un'istanza Vector" implica che Count è in realtà un membro di istanza. – BoltClock

+1

Grazie non era ovvio dalla pagina che stavo leggendo "Restituisce il numero di elementi memorizzati nel vettore". https://msdn.microsoft.com/en-us/library/dn877911(v=vs.111).aspx –

+0

@BoltClock Vero, non è chiaro come dovrebbe essere. – BartoszKP

2

Il vettore può essere un tipo un po 'confuso. È una raccolta di lunghezza predefinita fissa. È stato risolto perché la sua lunghezza è sempre == Vector<T>.Count. Quindi, se si fa:

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

risultato è ...:

<12, 13> 

E 'solo gocce di tutti i valori sopra Vector<double>.Count che risulta essere 2. Il trucco è che Vector<T>.Count possono variare sulla base di architettura della CPU .

In realtà è piuttosto basso livello primitivo, come descrizione dice:

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

Problemi correlati