使用OpenMP C++并行计算程序的积分

Parallelize program to count integral using OpenMP C++

本文关键字:计算程序 并行 OpenMP C++ 使用      更新时间:2023-10-16

我正在尝试计算积分

#include <iostream>
#include <omp.h>
using namespace std;
double my_exp(double x) {
  double res = 1., term = 1.;
  for(int n=1; n<=1000; n++) {
    term *= x / n;
    res += term;
  }
  return res;
}
double f(double x) {
  return x*my_exp(x);
}

int main() {
  double a=0., b=1., result = 0.;
  int nsteps = 1000000;
  double h = (b - a)/nsteps;

  for(int i=1; i<nsteps; i++) result += f(a + i*h);
  result = (result + .5*(f(a) + f(b)))*h;
  cout.precision(15);
  cout << "Result: " << result << endl;
  return 0;
}

该程序对积分进行计数并返回结果Result: 1.00000000000035 。但执行的时间很长。我应该并行我的程序,我想我应该添加#pragma omp parallel for,但它不起作用

更改主功能

#pragma omp parallel 
  {
  double localresult = 0.0;
#pragma omp for
  for(int i=1; i<nsteps; i++) 
      localresult +=  f(a + i*h);
#pragma omp critical
  {
      result += localresult;
  }
  }
  result = (result + .5*(f(a) + f(b)))*h;

编辑:按照muXXmit2X的思路,更简单的解决方案是

#pragma omp parallel for reduction(+:result)
for(int i=1; i<nsteps; i++) result += f(a + i*h);
result = (result + .5*(f(a) + f(b)))*h;