c ++: OpenMP-Container und STL-Container ohne wahlfreien Zugriff - eine mögliche Problemumgehung

Auf SO und dem Internet im Allgemeinen gibt es viel Verwirrung und Frustration darüber, wie man OpenMP benutzerfreundlich macht#pragma Direktiven kooperieren mit C ++ 's ebenso einfach zu bedienenden STL - Containern.

Alle reden über Workarounds für STLvector, aber wie sieht es mit nicht-wahlfreien / bidirektionalen Containern aus?map, list, set, usw. ?

Ich bin auf dieses Problem gestoßen und habe eine sehr einfache, offensichtliche Lösung gefunden. Ich präsentiere es hier für STLmap, aber es ist eindeutig verallgemeinerbar.

Serienversion:

<code>for (std::map<A,B>::iterator it = my_map.begin();
        it != my_map.end();
        ++it)       
    { /* do work with  it   */  }
</code>

Meine vorgeschlagene Lösung für die Verwendung von OpenMP mit STLmap:

<code>    //make an array of iterators.
    int loop_length = my_map.size();
    std::map<A,B>::iterator loop_array[ loop_length ];

    std::map<A,B>::iterator allocate_it = my_map.begin();
    for (int j=0; j<loop_length; ++j)
        loop_array[j] = allocate_it++;

    // now you can use OpenMP as usual:
    #pragma omp parallel for
    for (uint j=0; j<loop_length; ++j) 
       { /* do work with    loop_array[j]    */  }
</code>

Ich bin jedoch weit davon entfernt, ein Experte für OpenMP zu seinIch würde gerne wissen, ob meine vorgeschlagene Abhilfemaßnahme effizient ist und eine gute Praxis darstellt.

Bitte nehmen Sie an, dass der Programmierer für den thread-sicheren Umgang mit dem AWL-Container innerhalb der for-Schleife verantwortlich ist.

Schließlich ist meine vorgeschlagene Lösung effizienter als die folgende häufig vorgeschlagene Lösung(siehe Antwort auf diese SO-Frage), weil in meiner Lösung nicht jeder Thread den gesamten Container durchläuft?

<code>#pragma omp parallel
{
    for (std::map<A,B>::iterator it = my_map.begin();
            it != my_map.end();
            ++it) 
    #pragma single nowait
       {   /*  do work  */   }

}
</code>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage