Ho un codice C che calcola la distanza tra due gruppi di nodi (tre coordinate ciascuno), anche se il mio codice è stato abbastanza veloce ancora, voglio potenziarlo un po 'di più usando calcolo parallelo. Ho già trovato alcune informazioni su openMP e sto cercando di usarlo in questo momento, ma c'è qualcosa di strano. Senza omp il codice cpu time è 20s, aggiungendo le due linee pragma ci vogliono 160! Come potrebbe accadere?codice C parallelo per calcolo distanza
aggiungo il mio codice qui
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;
}
Grazie mille per tutto l'aiuto
"Come potrebbe accadere?" - La causa usuale è uno schema di parallelizzazione inappropriato, sia attraverso la localizzazione di riferimento o troppa sincronizzazione (o entrambi). –
Se si imposta una variabile di ambiente OMP_NUM_THREADS su 1 e si esegue il programma OpenMP con un singolo thread, quanto tempo ci vorrà? –
@AlexeyKukanov è ok mettendo vuoto omp_set_num_threads (int num_threads) prima del ciclo parallelo? – Nicholas