2010-11-22 22 views
6

Actualmente tengo un código (en C) con un bucle externo que es OpenMP-parallelized (opera localmente en una lista de memoria compartida). Lo estoy reescribiendo en C++, y para muchas cosas encontré la macro BOOST_FOREACH una sintaxis muy agradable como construcción de bucle para iterar sobre una lista, matriz, etc.Mixing Boost FOREACH macro y OpenMP paralelización

Mi pregunta es: ¿hay alguna manera de que ambos los use? esa sintaxis y paralelizar el bucle de estilo OpenMP?

Respuesta

2

Copia desde la terminal de la pena 1 kilowords:

$ g++ a.cpp -I/opt/boost-1.45.0/include -O -fopenmp 
a.cpp: In function ‘int main()’: 
a.cpp:12: error: for statement expected before ‘if’ 
0

Sí, debería funcionar. BOOST_FOREACH es solo una macro auxiliar para un bucle for, por lo que OpenMP debería reconocer y paralelizar ese bucle.

+1

No estoy exactamente seguro ... por lo que yo puedo ver en la cabecera, la macro BOOST_FOREACH se expande a más de un bucle, porque primero incluye una serie de 'if'-'else' ... Entonces, si pongo mis directivas OpenMP justo encima de la macro, no estarán justo encima del bucle' for'. –

0

¿Por qué no simplemente pruébalo y perfila el resultado?

Me impresionaría si OpenMP paraliza boost_foreach, ya que foreach depende en gran medida de los trucos de plantilla para deducir el tipo de contenedor. Si estuviera en su posición, volvería a escribir el foreach para usar bucles for-for normales.

+2

Demonios, hay tantas cosas equivocadas con esa respuesta ... La ciencia de la computación no es una ciencia empírica, en su mayor parte. Hasta el punto, si funciona en un sistema dado, con un compilador determinado (y un conjunto de opciones), no me garantiza que funcione en ningún otro sistema ni con ningún otro compilador. –

+0

Ciencia y ciencia, si es NUM_CORES-3 veces más rápido, aún estoy seguro de que openMP paraliza el bucle for –