Pregunta
¿Cuál es la diferencia entre estos dos?
[A]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[B]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
Solución
No creo que hay alguna diferencia, se trata de un acceso directo para el otro. Aunque su aplicación exacto puede tratar con ellos de manera diferente.
Los constructos de trabajo compartido paralelos combinados son un acceso directo para la especificación de un constructo paralelo que contiene una construcción de trabajo compartido y no hay otras declaraciones. cláusulas permitidas son la unión de las cláusulas permitido para los constructos paralelas y de trabajo compartido.
http://www.openmp.org/mp- documentos / OpenMP3.0-SummarySpec.pdf
Las especificaciones de OpenMP son aquí:
Otros consejos
Estos son equivalentes.
#pragma omp parallel
genera un grupo de hilos, mientras que #pragma omp for
divide iteraciones del bucle entre los hilos generados. Usted puede hacer ambas cosas a la vez con la directiva #pragma omp parallel for
fundido.
Aquí es ejemplo del uso de parallel
separados y for
aquí . En resumen, se puede utilizar para la asignación dinámica de conjuntos de hilos de OpenMP-privada antes de ejecutar el ciclo for
en varios subprocesos.
Es imposible hacer lo mismo en el caso de inicialización parallel for
.
UPD: En el ejemplo de pregunta que no hay diferencia entre un solo pragma y dos pragmas. Pero en la práctica se puede hacer más conscientes con hilo de comportamiento paralelo separado y de las directivas. Algo de código, por ejemplo:
#pragma omp parallel
{
double *data = (double*)malloc(...); // this data is thread private
#pragma omp for
for(1...100) // first parallelized cycle
{
}
#pragma omp single
{} // make some single thread processing
#pragma omp for // second parallelized cycle
for(1...100)
{
}
#pragma omp single
{} // make some single thread processing again
free(data); // free thread private data
}
Aunque ambas versiones del ejemplo específico son equivalentes, como ya se mencionó en las otras respuestas, todavía hay una pequeña diferencia entre ellos. La primera versión incluye una barrera implícita innecesario, encontrado al final de la "omp para". La otra barrera implícita se puede encontrar al final de la región paralela. Añadiendo "nowait" a "omp para" haría que los dos códigos equivalente, al menos desde un punto de vista OpenMP. Menciono esto porque un compilador OpenMP podría generar código ligeramente diferente para los dos casos.
Estoy viendo totalmente diferentes tiempos de ejecución cuando tomo un bucle en g ++ 4.7.0 y utilizando
std::vector<double> x;
std::vector<double> y;
std::vector<double> prod;
for (int i = 0; i < 5000000; i++)
{
double r1 = ((double)rand() / double(RAND_MAX)) * 5;
double r2 = ((double)rand() / double(RAND_MAX)) * 5;
x.push_back(r1);
y.push_back(r2);
}
int sz = x.size();
#pragma omp parallel for
for (int i = 0; i< sz; i++)
prod[i] = x[i] * y[i];
el código de serie (sin openmp
) se ejecuta en 79 ms.
el "paralelo para" código se ejecuta en 29 ms.
Si Omito la for
y el uso #pragma omp parallel
, el tiempo de ejecución se dispara a 179ms,
que es más lento que el código de serie. (La máquina tiene concurrencia hw de 8)
los enlaces de código para libgomp
Obviamente, hay un montón de respuestas, pero éste responde muy bien (con fuente)
#pragma omp for
sólo los delegados porciones del bucle para diferentes hilos en el equipo actual. Un equipo es el grupo de hilos la ejecución del programa. Al inicio del programa, el equipo se compone sólo de una miembro individual:. El hilo principal que ejecuta el programaPara crear un nuevo equipo de hilos, es necesario especificar el paralelo palabra clave. Se puede especificar en el contexto que lo rodea:
#pragma omp parallel { #pragma omp for for(int n = 0; n < 10; ++n) printf(" %d", n); }
y
¿Cuáles son: paralelas, a favor y un equipo
La diferencia entre paralelo, paralelo para y para es la siguiente:
Un equipo es el grupo de hilos que se ejecutan actualmente. Al comienzo del programa, el equipo está formado por un solo hilo. Un constructo paralelo divide el hilo actual en una nuevo equipo de hilos para la duración del siguiente bloque / declaración, después de lo cual el equipo se fusiona de nuevo en uno. para divide el trabajo de la para el bucle entre los hilos del equipo actual.
No crea roscas, sólo se divide el trabajo entre los hilos de la actualidad la ejecución de equipo. paralelo para es una abreviatura de dos comandos a la vez: paralelo y para. Paralelo crea un nuevo equipo, y en cuanto a grietas que equipo para manejar diferentes porciones del bucle. Si su programa nunca contiene un constructo paralelo, nunca hay más de un hilo; el hilo principal que inicia el programa y lo ejecuta, como en programas no roscado.