Tengo aquí lo que entiendo es una construcción OpenMP relativamente simple. El problema es que el programa se ejecuta entre 100 y 300 veces más rápido con 1 hilo en comparación con 2 hilos. El 87% del programa se gasta en gomp_send_wait()
y otro 9.5% en gomp_send_post
.Rendimiento terrible: un problema simple de sobrecarga, ¿o hay un error en el programa?
El programa da resultados correctos, pero me pregunto si hay un error en el código que está causando algún conflicto de recursos, o si simplemente es que la sobrecarga de la creación del hilo no vale la pena por un bucle de fragmento tamaño 4. p
varía de 17 a 1000, dependiendo del tamaño de la molécula que estamos simulando.
Mis números son para el peor de los casos, cuando p es 17 y el tamaño de fragmento 4. El rendimiento es el mismo si estoy usando programación estática, dinámica o guiada. Con p=150
y el tamaño de fragmento 75
, el programa sigue siendo 75x-100x más lento que el serial.
...
double e_t_sum=0.0;
double e_in_sum=0.0;
int nthreads,tid;
#pragma omp parallel for schedule(static, 4) reduction(+ : e_t_sum, e_in_sum) shared(ee_t) private(tid, i, d_x, d_y, d_z, rr,) firstprivate(V_in, t_x, t_y, t_z) lastprivate(nthreads)
for (i = 0; i < p; i++){
if (i != c){
nthreads = omp_get_num_threads();
tid = omp_get_thread_num();
d_x = V_in[i].x - t_x;
d_y = V_in[i].y - t_y;
d_z = V_in[i].z - t_z;
rr = d_x * d_x + d_y * d_y + d_z * d_z;
if (i < c){
ee_t[i][c] = energy(rr, V_in[i].q, V_in[c].q, V_in[i].s, V_in[c].s);
e_t_sum += ee_t[i][c];
e_in_sum += ee_in[i][c];
}
else{
ee_t[c][i] = energy(rr, V_in[i].q, V_in[c].q, V_in[i].s, V_in[c].s);
e_t_sum += ee_t[c][i];
e_in_sum += ee_in[c][i];
}
// if(pid==0){printf("e_t_sum[%d]: %f\n", tid, e_t_sum[tid]);}
}
}//end parallel for
e_t += e_t_sum;
e_t -= e_in_sum;
...
¿Cuántos procesadores en el sistema que arerunning en? – Michael
8 procsos en este sistema de prueba –