【发布时间】:2021-06-11 03:51:11
【问题描述】:
我只想通过 OpenMP 的汇总来评估函数的集成,方法是使用一个数组来保存每个步骤中计算的每个值 > 取所有值的总和;并在没有数组的情况下取和。
代码是:
double f(double x)
{
return sin(x)*sin(x)/(x*x+1);
}
方法一
long i = 0;
const long NUM_STEP = 100000;
double sum[NUM_STEP];
double from = 0.0, to = 1.0;
double step = (to - from)/NUM_STEP;
double result = 0;
#pragma omp parallel for shared(sum) num_threads(4)
for(i=0; i<NUM_STEP; i++)
sum[i] = step*f(from+i*step);
for(i=0; i<NUM_STEP; i++)
result += sum[i];
printf("%lf", result);
方法 2
long i = 0;
const long NUM_STEP = 100000;
double from = 0.0, to = 1.0;
double step = (to - from)/NUM_STEP;
double result = 0;
#pragma omp parallel for shared(result) num_threads(4)
for(i=0; i<NUM_STEP; i++)
result += step*f(from+i*step);
printf("%lf", result);
但结果相差太大。方法 1 给出了一个稳定的值,但方法 2 给出了一个可变值。这是一个例子:
方法一:0.178446
方法二:0.158738
METHOD 1 的值为真(由另一个工具检查)。
【问题讨论】:
标签: c multithreading parallel-processing openmp race-condition