• [^] # Re: OpenMP et la fausse simplicité...

    Posté par (site web personnel) . En réponse au journal Pyth(on|ran) + OpenMP ?. Évalué à 3.

    int i1,i2,i3,...;
    ...
    #pragma omp parallel for
    for (i1 = 0; i1 < N1; ++i1)
     for (i2 = 0; i2 < N2; ++i2)
     for (i3 = 0; i3 < N3; ++i3)
     code(i1,i2,i3);
    
    

    Le problème ici est que le mode par défaut est shared, sauf pour l'indice de la boucle sur laquelle porte la directive et donc les variables i2 et i3 seront mises en mémoire partagées et là c'est le drame.

    Quand on fait du C++/C99 un peu propre, on préfère la forme

    #pragma omp parallel for
    for (int i1 = 0; i1 < N1; ++i1)
     for (int i2 = 0; i2 < N2; ++i2)
     for (int i3 = 0; i3 < N3; ++i3)
     code(i1,i2,i3);
    
    

    qui ne pose pas de soucis car les variables locales sont considérées comme private

    La lecture de http://en.wikipedia.org/wiki/OpenMP#Data_sharing_attribute_clauses est un bon point de départ pour comprendre ça.