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)
{
   ...
}
¿Fue útil?

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í:

https://openmp.org/specifications/

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 programa

     

Para 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.

https://bisqwit.iki.fi/story/howto/openmp/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top