加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:16:30 所属栏目:百科 来源:网络整理
导读:我想要算上积分 #include iostream#include omp.husing 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(
我想要算上积分

#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;
}

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

解决方法

改变你的主要功能

#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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读