2013-07-25 9 views
41

C'è qualche controindicazione per fare questo? O il comportamento è ben specificato?Utilizzo di OpenMP con C++ 11 basato su loop per loop?

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

Perché sembra che specifica OpenMP è valido solo per C++ 98 ma immagino ci potrebbero essere più incompatibilità dovute C++ 11 fili, che qui non vengono usati. Volevo essere sicuro, ancora.

+0

+ Buona domanda. Vuoi saperlo anche tu. – lulyon

risposta

28

La specifica di OpenMP 4.0 è stata finalizzata e pubblicata diversi giorni fa here. Si mandati ancora che cicli paralleli dovrebbero essere nella forma canonica (§2.6, p.51):

for (init-expr;test expr;aum-expr)strutturato blocco

Lo standard consente di contenitori che forniscono iteratori ad accesso casuale da usare in tutte le espressioni, per esempio:

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

Se ancora insistete sul usando lo zucchero sintattico C++ 11, e se ci vuole un (relativamente) molto tempo per elaborare ogni elemento della stl_container, allora si potrebbe utilizzare il singolo produttore tasking modello:

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

Il tasking induce alcuni costi generali, quindi non avrebbe senso utilizzare questo modello se lo compute(x); richiede pochissimo tempo per il completamento.

+0

Penso che gli iteratori siano la strada da percorrere ormai, ma se vuoi che il tuo codice si compili con gcc devi sostituire! = Con DarioP

+0

Secondo questo sito: http://www.cplusplus.com/reference/iterator/RandomAccessIterator/ dovrebbe funzionare ... –

+0

In quel sito Web non mettono alcun pragma prima del ciclo. Basta provare a compilarlo :) – DarioP