Tôi có mã C tính toán khoảng cách giữa hai bộ nút (ba tọa độ mỗi), mặc dù mã của tôi đã đủ nhanh nhưng tôi muốn tăng thêm một chút bằng cách sử dụng tính toán song song. Tôi đã tìm thấy một số thông tin về openMP và tôi đang cố gắng sử dụng nó ngay bây giờ, nhưng có một chút gì đó kỳ lạ. Nếu không có omp mã cpu thời gian là 20s, thêm hai dòng pragma phải mất 160s! Làm thế nào nó có thể xảy ra?mã C song song cho tính toán khoảng cách
tôi thêm mã của tôi xuống đây
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;
}
Cảm ơn bạn rất nhiều vì đã giúp đỡ bất kỳ
"Làm thế nào nó có thể xảy ra?" - nguyên nhân thông thường là lược đồ song song không phù hợp, hoặc thông qua địa phương tham chiếu hoặc đồng bộ hóa quá nhiều (hoặc cả hai). –
Nếu bạn đặt biến môi trường OMP_NUM_THREADS thành 1 và chạy chương trình OpenMP của bạn bằng một chuỗi duy nhất, mất bao nhiêu thời gian? –
@AlexeyKukanov là nó ok đặt void omp_set_num_threads (int num_threads) trước khi vòng lặp song song? – Nicholas