sto vedendo rigido differenti tempi di esecuzione quando prendo un ciclo for in g ++ 4.7.0 e utilizzando
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];
il codice seriale (senza openmp
) corre in 79 ms. il codice "parallelo per" viene eseguito in 29 ms. Se Tralascio il for
e utilizzare #pragma omp parallel
, il runtime spara fino a 179ms, che è più lento rispetto al codice seriale. (La macchina ha concorrenza hw di 8)
i link di codice per libgomp
Nel mio codice sto usando questa stessa struttura. Tuttavia quando uso la clausola 'schedule (static, chunk)' per direttiva, ho un problema. Il codice funziona bene, ma quando sto invocando questo codice da un programma MPI, viene eseguito in un ciclo infinito. Il contatore di cicli è zero in tutte le iterazioni di questo ciclo. Ho il contatore del ciclo definito come privato nella direttiva '#pragma omp parallel'. Non ho idea del motivo per cui fallisce solo quando MPI sta invocando il codice. Sono abbastanza sicuro che ogni processo MPI è in esecuzione su un processore diverso del cluster, se questo è importante. Non ho idea se il programma sta causando il problema. –
La stessa cosa funziona bene quando uso la direttiva '#pragma omp parallel for'. Ci dovrebbe essere qualche differenza. Aggiornamento –
: A quanto pare, sto osservando questo problema solo quando utilizzo la clausola schedule, quindi suppongo che non dipenda dal fatto che io usi il parallelo combinato per o due direttive diverse. –