问题描述
我编写了一个程序,用于使用Manager-workers策略并行计算积分。
这是我的代码:
#include <iostream>
#include <cmath>
#include <cstdio>
#include <math.h>
#include "mpi.h"
using namespace std;
double f(double x){
return sqrt(2+pow(x,2))/((1+cos(2*x))*sqrt(1-x));
}
double adaptIsol(double left,double right,double eps)
{
double mid,h,Iold,Ileft,Iright,I;
h = (right - left)/2;
mid =(right + left)/2;
Iold = h * (f(left) + f(right));
Ileft = h * (f(left) + f(mid))/2;
Iright =h * (f(mid) + f(right))/2;
I = Ileft + Iright;
if(fabs(Iold - I) < eps)
return I;
else
{
Ileft = adaptIsol(left,mid,eps/2);
Iright = adaptIsol(mid,right,eps/2);
cout<<Ileft+Iright<<endl;
return Ileft + Iright;
}
}
int main(int argc,char *argv[])
{
int rank,size,n = 100000,s = 0;
double a = 0,b = 1.0,eps = 0.0001,I = 0.0,t;
MPI_Status st;
//start working with MPI
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
h = (b - a)/n;
n --;
if(rank == 0) {//manager proc
while(s != (size -1)){
double Islave;
MPI_Recv(&Islave,1,MPI_DOUBLE,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&st);
I += Islave;
MPI_Send(&n,MPI_INT,st.MPI_SOURCE,MPI_COMM_WORLD);
if(n >= 0)
n --;
else
s++;
}
}
else {
int m;
while(1) {
MPI_Send(&I,MPI_COMM_WORLD);
MPI_Recv (&m,&st);
if(m >= 0){
I = adaptIsol(a + h * m,a + h * (m + 1),eps * h / (b - a));
}
else break;
}
}
if(rank == 0) cout <<"Integral value: " << I <<endl;
MPI_Finalize();
return EXIT_SUCCESS;
[enter image description here][1]}
请帮助我找到错误。 [1]:https://i.stack.imgur.com/olSIu.png
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)