Parallèle pour la boucle dans openmp

Je suis en train de paralléliser un très simple boucle for, mais c'est ma première tentative à l'aide d'openMP dans un temps long. Je suis déconcerté par le temps d'exécution. Voici mon code:

#include <vector>
#include <algorithm>

using namespace std;

int main () 
{
    int n=400000,  m=1000;  
    double x=0,y=0;
    double s=0;
    vector< double > shifts(n,0);


    #pragma omp parallel for 
    for (int j=0; j<n; j++) {

        double r=0.0;
        for (int i=0; i < m; i++){

            double rand_g1 = cos(i/double(m));
            double rand_g2 = sin(i/double(m));     

            x += rand_g1;
            y += rand_g2;
            r += sqrt(rand_g1*rand_g1 + rand_g2*rand_g2);
        }
        shifts[j] = r / m;
    }

    cout << *std::max_element( shifts.begin(), shifts.end() ) << endl;
}

Je le compile avec

g++ -O3 testMP.cc -o testMP  -I /opt/boost_1_48_0/include

qui est, sans aucun "-fopenmp", et j'obtiens ces horaires:

real    0m18.417s
user    0m18.357s
sys     0m0.004s

lorsque j'utilise "-fopenmp",

g++ -O3 -fopenmp testMP.cc -o testMP  -I /opt/boost_1_48_0/include

Je obtenir ces chiffres pour l'époque:

real    0m6.853s
user    0m52.007s
sys     0m0.008s

qui n'a pas de sens pour moi. Comment à l'aide de huit cœurs ne peut conduire qu'à tout juste 3 fois
augmentation de la performance? Suis-je le codage de la boucle correctement?

  • Votre accès à la mémoire sont très locales. Vous êtes probablement faire des choses horribles à la mémoire cache du processeur. Il y a certains frais généraux de la direction générale de rejoindre trucs trop et vous pourriez être limité par la bande passante mémoire.
  • Ne devrait pas x, y et r privés() par OpenMP? Comme cela, vous pourriez obtenir de mauvais résultats.
  • Mieux encore, ils doivent être déclarés à l'intérieur de la boucle. Pré-déclarer les variables en début de fonction est odeur de code en C++.
  • il n'est pas "odeur de code" si vous voulez savoir si cela n'est pas aléatoire marche se termine.
  • Alors ils ne peuvent pas être privé. C'est l'odeur de code. Toujours. Déclarer des variables lorsque vous utilisez eux, pas plus tôt.
InformationsquelleAutor dsign | 2012-08-02