Frage

Ich bin auf einem Stück Code arbeiten, und ich versuche, es zu optimieren, so viel wie möglich, erhalten Sie im Grunde ist es unter einer bestimmten Frist ausgeführt werden.

Im Folgenden macht den Aufruf ...

static affinity_partitioner ap;
parallel_for(blocked_range<size_t>(0, T), LoopBody(score), ap);

... und das folgende ist, was ausgeführt wird.

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;
    }
}

Ich bin mit Intel TBB diese zu optimieren. Aber ich habe auch entlang dieser Art über SIMD und SSE2 und Dinge gelesen. Also meine Frage ist, wie lagere ich die Variablen (i, j, k) in den Registern, so dass sie schneller durch die CPU zugegriffen werden kann? Ich denke, die Antwort hat mit der Umsetzung SSE2 oder eine Variation davon zu tun, aber ich habe keine Ahnung, wie das zu tun. Irgendwelche Ideen?

Edit: Dies wird auf einer Linux-Box ausgeführt werden, aber unter Verwendung von Intels Compiler glaube ich. Wenn es hilft, muss ich die folgenden Befehle ausführen, bevor ich etwas tun, dass der Compiler funktioniert ... source /opt/intel/Compiler/11.1/064/bin/intel64/iccvars_intel64.csh zu machen; Quelle /opt/intel/tbb/2.2/bin/intel64/tbbvars.csh ... und dann zu kompilieren ich tun: icc -ltbb test.cxx -o test

Wenn es keine einfache Möglichkeit, SSE2 zu implementieren, irgendwelche Ratschläge, wie man weiter optimieren Sie den Code ein?

Danke, Hristo

War es hilfreich?

Lösung

Ihre Frage stellt einige Verwirrung darüber, was los ist. Die i, j, k Variablen werden mit ziemlicher Sicherheit bereits in Registern gehalten, vorausgesetzt, Sie sind mit Optimierungen kompilieren auf (was Sie tun sollten - add „-O2“ zu Ihrem icc Aufruf).

Sie können einen asm Block verwenden, aber eine einfachere Methode unter Berücksichtigung Sie bereits ICC verwendet, ist das SSE-Spezifika zu verwenden. Intels Dokumentation für sie ist hier - http: // www .intel.com / software / products / Compiler / Clin / docs / ug_cpp / comm1019.htm

Es sieht aus wie können Sie die Top-Level-Schleife SIMD-ize, obwohl es abhängig geht zu stark ab, was Ihre delta Funktion ist.

Andere Tipps

Wenn Sie Assemblersprache innerhalb eines C ++ Modul verwenden möchten, können Sie innerhalb eines asm Block nur ihn, und setzen Sie Ihre Variablennamen verwenden, um von außerhalb des Blocks. Die Montageanleitung im asm Block verwenden angeben, welche Register etc. betrieben wird, aber sie werden je nach Plattform variieren.

Wenn Sie mit GCC finden Sie unter http: //gcc.gnu .org / projects / Baum-ssa / vectorization.html , wie der Compiler automatisch vektorisiert Code zu helfen, und Beispiele.

Ansonsten müssen Sie lassen Sie uns wissen, welche Plattform Sie verwenden.

Der Compiler sollte für Sie tun dies werden. Zum Beispiel in VC ++ können Sie einfach auf SSE2 drehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top