Intento escribir aplicaciones simples usando OpenMP. Desafortunadamente tengo un problema con la aceleración. En esta aplicación tengo un ciclo while. El cuerpo de este ciclo consta de algunas instrucciones que deben hacerse secuencialmente y uno para el ciclo. Yo uso #pragma omp parallel for
para hacer esto para loop paralelo. Este ciclo no tiene mucho trabajo, pero se llama con mucha frecuencia.OpenMP - crear hilos solo una vez
Preparo dos versiones de for loop, y ejecuto la aplicación en 1, 2 y 4 cores.
versión 1 (4 iteraciones en el ciclo for): 22sec, 23sec, 26sec.
versión 2 (100000 iteraciones en for loop): 20sec, 10sec, 6sec.
Como puede ver, cuando para el bucle no tiene mucho trabajo, el tiempo en 2 y 4 núcleos es mayor que en 1core. Supongo que la razón es que #pragma omp parallel for
crea nuevos subprocesos en cada iteración del ciclo while. Entonces, me gustaría preguntarle: ¿hay alguna posibilidad de crear subprocesos una vez (antes de while loop), y asegurar que algún trabajo en while loop se realice secuencialmente?
#include <omp.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char* argv[])
{
double sum = 0;
while (true)
{
// ...
// some work which should be done sequentially
// ...
#pragma omp parallel for num_threads(atoi(argv[1])) reduction(+:sum)
for(int j=0; j<4; ++j) // version 2: for(int j=0; j<100000; ++j)
{
double x = pow(j, 3.0);
x = sqrt(x);
x = sin(x);
x = cos(x);
x = tan(x);
sum += x;
double y = pow(j, 3.0);
y = sqrt(y);
y = sin(y);
y = cos(y);
y = tan(y);
sum += y;
double z = pow(j, 3.0);
z = sqrt(z);
z = sin(z);
z = cos(z);
z = tan(z);
sum += z;
}
if (sum > 100000000)
{
break;
}
}
return 0;
}