2013-07-25 8 views
41

Gibt es Gegenanzeigen dafür? Oder ist das Verhalten gut spezifiziert?Verwenden von OpenMP mit C++ 11 bereichsbasierten for-Schleifen?

#pragma omp parallel for 
for(auto x : stl_container) 
{ 
    ... 
} 

Da es scheint, dass OpenMP Spezifikation für c gilt nur ++ 98 aber ich denke, es könnte mehr Inkompatibilitäten aufgrund von C++ 11 Fäden sein, die hier nicht verwendet werden. Ich wollte trotzdem sicher sein.

+0

+ Gute Frage. Willst du das auch wissen. – lulyon

Antwort

28

Die OpenMP 4.0-Spezifikation wurde vor einigen Tagen fertiggestellt und veröffentlicht here. Er beauftragt immer noch, dass parallele Schleifen in der kanonischen Form (§2.6, S.51) sein sollen:

for (init-expr;Test expr;incr-expr)structured-Block

der Standard ermöglicht Container, die Random-Access-Iteratoren bieten in alle Ausdrücke verwendet werden, zB:

#pragma omp parallel for 
for (it = v.begin(); it < v.end(); it++) 
{ 
    ... 
} 

Wenn Sie immer noch darauf bestehen, die C++ 11 syntaktischer Zucker zur Verwendung, und wenn es eine (vergleichsweise) viel Zeit in Anspruch nimmt jedes Element stl_container zu verarbeiten, dann könnten Sie den Single-Produzent Tasking-Muster verwenden:

#pragma omp parallel 
{ 
    #pragma omp single 
    { 
     for (auto x : stl_container) 
     { 
     #pragma omp task 
     { 
      // Do something with x, e.g. 
      compute(x); 
     } 
     } 
    } 
} 

induziert Tasking gewisse Overhead, so würde es keinen Sinn machen, dieses Muster zu verwenden, wenn compute(x); sehr wenig Zeit in Anspruch nimmt.

+0

Ich denke, dass Iteratoren jetzt der Weg sind, aber wenn Sie möchten, dass Ihr Code mit gcc kompiliert wird, müssen Sie ersetzen! = Mit DarioP

+0

Nach dieser Website: http://www.cplusplus.com/reference/iterator/RandomAccessIterator/ sollte es funktionieren ... –

+0

In dieser Website legen sie kein Pragma vor dem Zyklus. Versuchen Sie einfach, es zu kompilieren :) – DarioP