我有一個C代碼,計算兩組節點之間的距離(每個三個座標),即使我的代碼已經足夠快了,但我想提高它多一點使用並行計算。我已經發現了一些關於openMP的信息,我現在正在嘗試使用它,但是有些奇怪。沒有omp代碼cpu時間是20s,添加兩個編譯指示行需要160s!怎麼會發生?並行C代碼距離計算
我附上我的代碼到這裏
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;
}
非常感謝你的幫助
「它怎麼會發生?」 - 通常的原因是不適當的並行化方案,無論是通過參考的地點還是太多的同步(或兩者)。 – 2012-01-30 09:11:46
如果將環境變量OMP_NUM_THREADS設置爲1,並且使用單個線程運行OpenMP程序,那麼需要多少時間? – 2012-01-30 10:57:14
@AlexeyKukanov可以在並行循環之前放置void omp_set_num_threads(int num_threads)嗎? – Nicholas 2012-01-30 10:59:33