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.
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. –
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. –
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