Domanda
Sto lavorando su un po 'di codice e sto cercando di ottimizzare il più possibile, in pratica farlo funzionare sotto un certo limite di tempo.
Di seguito effettua la chiamata ...
static affinity_partitioner ap;
parallel_for(blocked_range<size_t>(0, T), LoopBody(score), ap);
... e quanto segue è quello che viene eseguito.
void operator()(const blocked_range<size_t> &r) const {
int temp;
int i;
int j;
size_t k;
size_t begin = r.begin();
size_t end = r.end();
for(k = begin; k != end; ++k) { // for each trainee
temp = 0;
for(i = 0; i < N; ++i) { // for each sample
int trr = trRating[k][i];
int ei = E[i];
for(j = 0; j < ei; ++j) { // for each expert
temp += delta(i, trr, exRating[j][i]);
}
}
myscore[k] = temp;
}
}
Sto usando TBB Intel per ottimizzare questo. Ma ho anche letto su SIMD e SSE2 e cose lungo quella natura. Quindi la mia domanda è, come faccio a memorizzare le variabili (i, j, k) nei registri in modo che possano essere accessibili velocemente dalla CPU? Penso che la risposta ha a che fare con l'attuazione SSE2 o qualche variazione di esso, ma non ho idea di come farlo. Tutte le idee?
Edit: Questo sarà eseguito su una macchina Linux, ma usando il compilatore Intel credo. Se aiuta, devo eseguire i seguenti comandi prima di fare qualsiasi cosa per assicurarsi che il compilatore opere ... source /opt/intel/Compiler/11.1/064/bin/intel64/iccvars_intel64.csh; /opt/intel/tbb/2.2/bin/intel64/tbbvars.csh fonte ... e poi per compilare lo faccio: ICC -ltbb test.cxx -o test
Se non c'è un modo facile da implementare SSE2, qualche consiglio su come ottimizzare ulteriormente il codice?
Grazie, Hristo
Soluzione
La tua domanda rappresenta una certa confusione su ciò che sta accadendo. I i, j, k variabili sono quasi certamente tenuti in registri già, supponendo che si sta compilando con le ottimizzazioni su (che si dovrebbe fare - add "-O2" al tuo invocazione ICC).
È possibile utilizzare un blocco asm
, ma un metodo più semplice considerando che si sta già utilizzando ICC è quello di utilizzare le intrinseche SSE. la documentazione di Intel per loro è qui - http: // www .intel.com / software / prodotti / compilatori / clin / docs / ug_cpp / comm1019.htm
Sembra che si può SIMD-izzare il ciclo di livello superiore, anche se sta andando a dipendere in gran parte quello che la vostra funzione è delta
.
Altri suggerimenti
Quando si desidera utilizzare il linguaggio assembly all'interno di un modulo C ++, si può semplicemente mettere all'interno di un blocco di asm
, e continuare a utilizzare i nomi delle variabili al di fuori del blocco. Le istruzioni per il montaggio si usa all'interno del blocco asm
specificheranno che registrano ecc viene operato, ma variano a seconda della piattaforma.
Se stai usando GCC, vedi http: //gcc.gnu .org / progetti / albero-SSA / vectorization.html per come aiutare il compilatore automatico vettorizzare il codice, e gli esempi.
In caso contrario, è necessario farci sapere quale piattaforma che si sta utilizzando.
Il compilatore dovrebbe fare questo per voi. Per esempio, in VC ++ si può semplicemente accendere SSE2.