openmp c++
Iteración a través de contenedores estándar en openmp. (1)
La paralelización de bucle para iteradores stl solo funciona desde OpenMP 3.0, y solo para iteradores de acceso aleatorio (por ejemplo, vector
y deque
). Deberías poder hacer algo como esto:
#pragma omp parallel {
for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
#pragma omp single nowait {
operate(*i);
}
}
}
Sin embargo, la sobrecarga es bastante grande porque cada hilo se repite en toda la secuencia (pero solo se ejecuta la operate
en parte de ella). Su método utilizando un int i
es más eficiente.
Como alternativa, eche un vistazo a la implementación en paralelo de GCC de gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html . Ver mi comentario
EDITAR : El STL Parallism TS , que probablemente formará parte de C ++ 17, podría ser una buena opción en el futuro para realizar iteraciones sobre contenedores estándar.
Estoy tratando de usar openmp para multiprocilar un bucle a través de std :: set. Cuando escribo el siguiente código -
#pragma omp parallel for
for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) {
const A a = *i;
operate(a);
}
Me sale este error:
error: invalid type for iteration variable ''i''
error: invalid controlling predicate
error: invalid increment expression.
¿Hay alguna otra forma correcta de iterar a través de contenedores estándar usando openmp? Sé que puedo usar int i
e iterar de 0
a s.size()
y un iterador u operator[]
en el cuerpo del bucle, pero esto se ve mucho menos limpio.