Question

Je travaille sur un peu de code et je suis en train d'optimiser autant que possible, obtenir essentiellement fonctionner dans un certain délai.

Ce qui suit fait l'appel ...

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

... et ce qui suit est ce qui est exécuté.

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

J'utilise TBB Intel pour optimiser cela. Mais j'ai aussi lu sur SIMD et SSE2 et les choses ainsi que la nature. Donc, ma question est, comment puis-je stocker les variables (i, j, k) dans des registres afin qu'ils puissent être accessibles plus rapidement par la CPU? Je pense que la réponse a à voir avec la mise en œuvre SSE2 ou une variante de celui-ci, mais je ne sais pas comment faire. Toutes les idées?

Edit: Ce sera exécuté sur une machine Linux, mais en utilisant le compilateur Intel je crois. Si elle aide, je dois exécuter les commandes suivantes avant que je ne importe quoi pour vous assurer que le fonctionnement du compilateur ... source /opt/intel/Compiler/11.1/064/bin/intel64/iccvars_intel64.csh; la source /opt/intel/tbb/2.2/bin/intel64/tbbvars.csh ... puis de compiler je: icc -ltbb test.cxx -o test

S'il n'y a aucun moyen facile à mettre en œuvre SSE2, des conseils sur la façon d'optimiser le code?

Merci, Hristo

Était-ce utile?

La solution

Votre question représente une certaine confusion sur ce qui se passe. Les i, j, k variables sont presque certainement lieu dans les registres déjà, en supposant que vous compilez avec des optimisations sur (que vous devriez faire - ajouter « -O2 » à votre appel CPI).

Vous pouvez utiliser un bloc asm, mais une méthode plus facile étant donné que vous utilisez déjà la CPI est d'utiliser les intrinsics SSE. la documentation d'Intel pour eux est ici - http: // www .intel.com / logiciels / produits / compilateurs / clin / docs / ug_cpp / comm1019.htm

Il semble que vous pouvez SIMD-iser la boucle de niveau supérieur, mais il va dépendre en grande partie de ce que votre fonction est delta.

Autres conseils

Si vous voulez utiliser un langage assemblage dans un module C ++, vous pouvez simplement le mettre dans un bloc asm, et continuer à utiliser vos noms de variables à l'extérieur du bloc. Les instructions de montage que vous utilisez dans le bloc asm préciseront quel registre etc. est exploité, mais ils varient selon la plate-forme.

Si vous utilisez GCC, consultez http: //gcc.gnu .org / projets / arbre-ssa / vectorization.html pour savoir comment aider l'auto-vectoriser votre code compilateur et des exemples.

Dans le cas contraire, vous devez nous faire savoir ce que la plate-forme que vous utilisez.

Le compilateur devrait faire pour vous. Par exemple, dans VC ++, vous pouvez simplement activer SSE2.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top