2013-04-30 8 views
6

Così ho il seguente codice che sembra molto semplice da me:Il compilatore Intel non è in grado di vettorizzare questo ciclo semplice?

#define MODS_COUNT 5 

int start1 = <calc at runtime>; 
int start2 = <calc at runtime>; 

for (int j=0; j<MODS_COUNT; j++) // loop 5 times doing simple addition. 
    logModifiers[start1 + j] += logModsThis[start2 + j]; 

Questo ciclo fa parte di un ciclo esterno (non so se questo fa la differenza)

Il compilatore dice: message : loop was not vectorized: vectorization possible but seems inefficient.

Perché questo ciclo non può essere vettorizzato? sembra molto semplice per me. Come posso forzare la vettorizzazione e controllare le prestazioni da solo?

ho Compiler 2013 aggiornamento Intel C++ 3.

codice completa è qui, se qualcuno è interessato: http://pastebin.com/Z6H5ZejW

Edit: ho capito che il compilatore ha deciso che è inefficiente. Sto chiedendo:

Perché è inefficiente?

Come posso forzarlo in modo da poter eseguire il benchmark?

Edit2: Se lo cambio a 4 anziché a 5, viene convogliato. Cosa rende 5 inefficienti? Ho pensato che si potesse fare in 2 istruzioni, la prima fa 4 e la seconda è "normale" fa 1, invece di 5 istruzioni.

+1

E tu intendi dire che pensi che il compilatore abbia torto "sembra inefficiente"? Tenderei ad essere d'accordo sul fatto che un ciclo di 5 elementi non sarebbe probabilmente molto efficace per vettorializzare. –

+0

Il compilatore non ti dice che il ciclo non può essere vettorizzato. Personalmente penso che i compilatori che scelgono di (dis) obbedire ai programmatori come pensano (i compilatori) ritengono che sia una buona idea. –

+1

Molto probabilmente i dati non è organizzato in memoria in modo direttamente adatto per l'utilizzo istruzioni vettoriali su di esso e il compilatore ha stabilito che il costo di riorganizzare i dati è più che il tempo risparmiato operando su più di esso, allo stesso tempo . – jcoder

risposta

2

Secondo vettorizzazione in compilatori Intel:

Ci sono SIMD (Single Instruction più dati) registri che sono lunghi 128 byte. quindi se sizeof (int) è 4 allora 4 interi possono sedere in questi registri e una singola istruzione può eseguire nelle 4int s. (questo dipende anche se stesso tipo di operazione viene eseguita su queste int s, qui è vero. più sopra ogni elemento dell'array su LHS dipende da un diverso elemento di un diverso array.)

se ci sono 8 int s allora sono richieste due istruzioni (anziché 8 senza vettorizzazione).

ma se ci sono 5 (o 6 o 7) int s allora anche quello richiederà due istruzioni. che might non è migliore che senza codice di vettorizzazione.

ulteriore lettura LINK.

+0

Perché due istruzioni per un ciclo di 5 non sono migliori? non sono 2 istruzioni più veloci di 5? –

+0

@Spacemonkey ma il calcolo del 5 non richiede il registro SIMD. che potrebbe essere più pesante rispetto al fatto di averli tutti calcolati senza vettorizzazione (se 5 sono stati vettorizzati). Fare attenzione intel non dice che il tempo richiesto per eseguire vettorialmente non è '1/4' volte senza vettorizzazione. dice solo 1 istruzione. –

+0

benching che segna il tuo codice (con un loop così piccolo) sarà una sfida. Troppo alto il numero di cicli, il compilatore con linee rette lo vettorializza. troppo piccolo sarà difficile da differenziare. –

Problemi correlati