私はコードがまだ十分速いのに2つのノードセット間の距離を計算するCコードを持っていますが、パラレルコンピューティング。私はすでにopenMPに関するいくつかの情報を見つけましたが、私は今それを使用しようとしていますが、ちょっと変わったことがあります。 ompがなければ、コードcpuの時間は20秒で、160秒かかる2つのプラグマ行が追加されます!それはどうしたらできますか?距離計算用の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;
}
ダウンここに私のコードを追加するには、あなたが外側のループと内部ループの両方に#pragma omp parallel
を追加するときは、同期の多くを使用して任意のヘルプ
「どうしたらできますか?」 - 通常の原因は、参照の局所性またはあまりにも多くの同期化(またはその両方)によって、不適切な並列化スキームです。 –
環境変数OMP_NUM_THREADSを1に設定し、OpenMPプログラムを1つのスレッドで実行すると、どれくらい時間がかかりますか? –
@AlexeyKukanov並列ループの前にvoid omp_set_num_threads(int num_threads)を入れても大丈夫ですか? – Nicholas