Ubuntu 我不知道';在我的并行积分计算程序中看不到任何错误,但我得到了分段错误(代码139),如何修复它?

Ubuntu 我不知道';在我的并行积分计算程序中看不到任何错误,但我得到了分段错误(代码139),如何修复它?,ubuntu,parallel-processing,segmentation-fault,mpi,integral,Ubuntu,Parallel Processing,Segmentation Fault,Mpi,Integral,我用经理-工人策略编写了一个并行计算积分的程序 我得到了错误139(分段错误),但我不明白哪里会出错 我得到了错误139(分段错误),但我不明白哪里会出错 我得到了错误139(分段错误),但我不明白哪里会出错 这是我的代码: #include <iostream> #include <cmath> #include <cstdio> #include <math.h> #include "mpi.h" using namespa

我用经理-工人策略编写了一个并行计算积分的程序

我得到了错误139(分段错误),但我不明白哪里会出错

我得到了错误139(分段错误),但我不明白哪里会出错

我得到了错误139(分段错误),但我不明白哪里会出错

这是我的代码

#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, h, 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, 1, MPI_INT, st.MPI_SOURCE,0,MPI_COMM_WORLD);
        if(n >= 0)
            n --;
        else
            s++;
    }
}
else {
    int m;
    while(1) {
        MPI_Send(&I, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
        MPI_Recv (&m, 1, MPI_INT, 0, MPI_ANY_TAG,MPI_COMM_WORLD, &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]}
           
#包括
#包括
#包括
#包括
#包括“mpi.h”
使用名称空间std;
双f(双x){
返回sqrt(2+pow(x,2))/((1+cos(2*x))*sqrt(1-x));
}
双自适应(双左、双右、双eps)
{
双中,h,Iold,Ileft,Iright,I;
h=(右-左)/2;
中间=(右+左)/2;
Iold=h*(f(左)+f(右));
Ileft=h*(f(左)+f(中))/2;
Iright=h*(f(中)+f(右))/2;
I=Ileft+Iright;
if(fabs(Iold-I)首先,确保这个程序的非MPI版本正常工作。你是对的,我没有检查MPI程序-同样的问题,我认为积分计算有错误,但我仍然无法理解我计算的错误(无限递归?尝试增加堆栈大小,看看是否有帮助。我增加了,不幸的是没有帮助