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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top