Provo a scrivere una semplice applicazione usando OpenMP. Purtroppo ho problemi con l'accelerazione. In questa applicazione ho un ciclo while. Il corpo di questo ciclo consiste in alcune istruzioni che dovrebbero essere eseguite in sequenza e una per ciclo. Io uso #pragma omp parallel for
per rendere questo per ciclo parallelo. Questo ciclo non ha molto lavoro, ma viene chiamato molto spesso.OpenMP - crea thread solo una volta
Preparo due versioni di ciclo for ed eseguo l'applicazione su 1, 2 e 4cores.
versione 1 (4 iterazioni in ciclo for): 22 sec, 23 sec, 26 sec.
versione 2 (100000 iterazioni in ciclo for): 20 sec, 10 sec, 6 sec.
Come si può vedere, quando per ciclo non ha molto lavoro, il tempo su 2 e 4 core è superiore a quello su 1 core. Suppongo che il motivo sia che #pragma omp parallel for
crea nuovi thread in ogni iterazione del ciclo while. Quindi, vorrei chiederti: esiste la possibilità di creare thread una volta (prima del ciclo while) e assicurare che un po 'di lavoro nel ciclo while venga eseguito in sequenza?
#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;
}