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.
fonte
2013-07-25 09:04:20
+ Buona domanda. Vuoi saperlo anche tu. – lulyon