estoy viendo totalmente diferentes tiempos de ejecución cuando tomo un bucle en g ++ 4.7.0 y el uso de
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 código "paralelo para" se ejecuta en 29 ms. Si omito for
y uso #pragma omp parallel
, el tiempo de ejecución se dispara hasta 179 ms, , 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
En mi código estoy usando esta misma estructura. Sin embargo, cuando uso la cláusula 'schedule (static, chunk)' en la directiva, aparece un problema. El código funciona bien, pero cuando invoco este código desde un programa MPI, se ejecuta en un bucle infinito. El contador de bucle es cero en todas las iteraciones de este bucle. Tengo el contador de bucle definido como privado en la directiva '#pragma omp parallel'. No tengo idea de por qué solo falla cuando MPI invoca el código. De alguna manera estoy seguro de que cada proceso de MPI se ejecuta en un procesador diferente del clúster si eso es importante. No tengo idea de si el horario está causando el problema. –
Lo mismo funciona bien cuando uso la directiva '#pragma omp parallel for'. Debería haber alguna diferencia. –
Actualización: Como resultado, estoy observando este problema solo cuando uso la cláusula schedule así que supongo que no depende de si uso el paralelo combinado para o dos directivas diferentes. –