Tengo un código C que calcula la distancia entre dos conjuntos de nodos (tres coordinan cada uno), aunque mi código ha sido lo suficientemente rápido todavía, quiero aumentarlo un poco más usando computación paralela. Ya he encontrado algo de información sobre openMP y estoy tratando de usarlo ahora, pero hay algo un poco raro. Sin omp, el tiempo de CPU de código es 20s, ¡y se agregan las dos líneas de pragma que toman 160s! ¿Cómo podría pasar?paralelo código C para cálculo de distancia
añado mi código aquí abajo
float computedist(float **vG1, float **vG2, int ncft, int ntri2, int jump, float *dist){
int k = 0, i, j;
float min = 0;
float max = 0;
float avg = 0;
float *d = malloc(3*sizeof(float));
float diff;
#pragma omp parallel
for(i=0;i<ncft;i+=jump){
#pragma omp parallel
for(j=0;j<ntri2;j++){
d[0] = vG1[i][0] - vG2[j][0];
d[1] = vG1[i][1] - vG2[j][1];
d[2] = vG1[i][2] - vG2[j][2];
diff = sqrt(pow(d[0],2) + pow(d[1],2) + pow(d[2],2));
if(j==0)
dist[k] = diff;
else
if(diff<dist[k])
dist[k] = diff;
}
avg += dist[k];
if(dist[k]>max)
max = dist[k];
k++;
}
printf("max distance: %f\n",max);
printf("average distance: %f\n",avg/(int)(ncft/jump));
free(d);
return max;
}
muchas gracias por cualquier ayuda
"¿Cómo podría suceder?" - La causa habitual es un esquema de paralelización inapropiado, ya sea a través de la ubicación de referencia o demasiada sincronización (o ambas). –
Si establece una variable de entorno OMP_NUM_THREADS en 1 y ejecuta su programa OpenMP con un solo hilo, ¿cuánto tiempo tomará? –
@AlexeyKukanov ¿está bien poner void omp_set_num_threads (int num_threads) antes del ciclo paralelo? – Nicholas