【发布时间】:2019-06-24 15:05:07
【问题描述】:
我正在尝试集成曲线的功能,并将串行代码转换为并行程序,我正在使用openMP。
我已经使用 openMP parallel for 并行化了 for 循环并实现了更少的程序时间,但问题是结果不是预期的,线程中有些东西搞砸了,我想知道如何并行化N 个线程的 for 循环。
#include <stdio.h>
#include <omp.h>
#include <math.h>
double f(double x){
return sin(x)+0.5*x;
}
int main(){
int n=134217728,i;
double a=0,b=9,h,x,sum=0,integral;
double start = omp_get_wtime();
h=fabs(b-a)/n;
omp_set_dynamic(0);
omp_set_num_threads(64);
#pragma omp parallel for reduction (+:sum) shared(x)
for(i=1;i<n;i++){
x=a+i*h;
sum=sum+f(x);
}
integral=(h/2)*(f(a)+f(b)+2*sum);
double end = omp_get_wtime();
double time = end - start;
printf("Execution time: %2.3f seconds\n",time);
printf("\nThe integral is: %lf\n",integral);
}
预期的输出是 22.161130,但每次运行程序时它都会发生变化。
【问题讨论】:
-
您的并行循环累积在全局变量 sum 上并用作临时共享变量 x 因为竞争而无法工作。如果需要临时变量,请使用 reduction 并声明私有变量。另外,你真的有 64 个内核吗?
-
对总和使用原子更新。
-
用reduction和shared var x更新了代码,还是有区别
-
x 必须是私有的。