2010-03-25 17 views
18

Estoy tratando de usar openmp para multiprocesar un bucle a través de std :: set. Cuando escribo el siguiente código -Iteración a través de contenedores estándar en openmp

#pragma omp parallel for 
    for (std::set<A>::const_iterator i = s.begin(); i != s.end(); ++i) { 
      const A a = *i; 
      operate(a); 
    } 

consigo 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 std usando OpenMP? Sé que puedo utilizar int i e iterar 0-s.size() y un iterador o operator[] en el cuerpo del bucle, pero esto se ve mucho menos limpio.

+1

¿Qué compilador? GCC tiene una implementación paralela (http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html) de 'std :: for_each' que debería ser el truco para usted. Tal vez también puede ver la fuente allí? Ver también http://algo2.iti.kit.edu/singler/mcstl/. – stephan

Respuesta

21

La paralelización de bucles para los iteradores stl solo funciona desde OpenMP 3.0, y solo para los iteradores de acceso aleatorio (por ejemplo, vector y deque). Usted debe ser capaz de 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); 
     } 
    } 
} 

de arriba es bastante grande, porque aunque cada iteración de hilo más de la secuencia completa (pero sólo ejecuta operate en algunas de ellas). Su método usando un int i es más eficiente.

Como alternativa, eche un vistazo a la implementación paralela de GCC de std::for_each. Ver mi comentario

EDITAR: El STL Parallism TS, que lo más probable es que sea parte de C++ 17, podría ser una buena opción en el futuro para iterar sobre contenedores estándar.

+0

Gracias! MCSTL es eso lo que necesito. –

+0

'std :: set' no tiene el' operador [] 'y msvc solo es compatible con openmp 2.0:/ – quimnuss

+1

@quimnuss: el [Paralelo STL] (https://parallelstl.codeplex.com/) para msvc puede ser útil . [Parallelism TS] (https://isocpp.org/files/papers/P0024R2.html) probablemente formará parte de C++ 17, por lo que debería ser razonablemente a prueba de futuro (pero aún podría tener errores y no ser característica completo, no he seguido la implementación de MS muy de cerca). – stephan

Cuestiones relacionadas