2017-05-24 36 views
0

我包含一个带有函数linspace的静态头文件utils.h。我的main.cpp文件如下:分段错误OpenMPI

#include <iostream> 
#include <utils.h> 
#include <mpi.h> 

using namespace std; 

int main(int argc, const char * argv[]) { 

    float start = 0., end = 1.; 
    unsigned long int num = 100; 

    double *linspaced; 

    float delta = (end - start)/num; 
    int size, rank; 


    MPI_Init(NULL, NULL); 

    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Status status; 

    // These have to be converted into unsigned long ints 
    int casesPerNode = num/size; 
    int remainderCases = num % size; 


    if(rank==0){ 
     linspaced = new double[num]; 

     if(remainderCases!=0){ 
      linspace(&linspaced[(size-1)*casesPerNode], end - delta*remainderCases, end, remainderCases); 

     } else { 
      linspace(&linspaced[(size-1)*casesPerNode], end - delta*casesPerNode, end, casesPerNode); 

     } 

    } 

    MPI_Bcast(&linspaced, num, MPI_DOUBLE, 0, MPI_COMM_WORLD); 

    if(rank != 0) { 




     // Sending job to master node. 
     // The node is already overloaded with coordinating. 
     // Additional task now is also to take on remainder cases. 


     // cout << "Rank " << rank << endl; 
     float start_in = start + casesPerNode*delta*(rank-1); 
     float end_in = start + casesPerNode*delta*(rank) - delta; 

     linspace(&linspaced[(rank-1)*casesPerNode], start_in, end_in, casesPerNode); 


    } 


    MPI_Finalize(); 


    for(int i=0; i< num; i++){ 
     cout << *(linspaced + i) << endl; 
    } 


    return 0; 

} 

和我utils.h文件是:

void linspace(double *ret, double start_in, double end_in, unsigned long int num_in) 
{ 
    /* This function generates equally spaced elements and returns 
    an array with the results */ 


    assert(num_in!=0); 


    cout << "\tReceived start :" << start_in << "\tEnd :" << end_in << "\tNum_in :" << num_in << endl; 

    double delta_in = (end_in - start_in)/(num_in - 1); 

    if(num_in == 1){ 
     *(ret) = start_in; 
    } 

    *(ret) = start_in; 
    for(int i=1; i < num_in-1; i++) { 
     *(ret + i) = *(ret + i - 1) + delta_in; 
    } 
    *(ret + (num_in - 1)) = end_in; 

    /* 
    cout << "Finished executing linspace " << endl; 
    for(int i = 0; i<num_in; i++){ 
    cout << "Address : " << &ret << "\tElement " << i << " : " << *(ret + i) << endl; 
    } 
    */ 
} 

我无法诊断为什么会生成以下错误。

*** Process received signal *** 
*** Process received signal *** 
Signal: Segmentation fault: 11 (11) 
Signal code: Address not mapped (1) 
Failing at address: 0x7fb442529b98 
[ 0] 0 libsystem_platform.dylib   0x00007fffd6902b3a _sigtramp + 26 
[ 1] 0 ???         0x0000000000000000 0x0 + 0 
[ 2] 0 test        0x0000000101227fda main + 602 
[ 3] 0 libdyld.dylib      0x00007fffd66f3235 start + 1 
*** End of error message *** 
    Received start :0.5 End :0.74 Num_in :25 
*** Process received signal *** 
Signal: Segmentation fault: 11 (11) 
Signal code: Address not mapped (1) 
Failing at address: 0x7fb442529ad0 
[ 0] 0 libsystem_platform.dylib   0x00007fffd6902b3a _sigtramp + 26 
[ 1] 0 ???         0x0000000000000000 0x0 + 0 
[ 2] 0 test        0x000000010c87bfda main + 602 
[ 3] 0 libdyld.dylib      0x00007fffd66f3235 start + 1 
*** End of error message *** 
Signal: Segmentation fault: 11 (11) 
Signal code: Address not mapped (1) 
Failing at address: 0x7fb442529c60 
[ 0] 0 libsystem_platform.dylib   0x00007fffd6902b3a _sigtramp + 26 
[ 1] 0 ???         0x0000000000000000 0x0 + 0 
[ 2] 0 test        0x0000000104764fda main + 602 
[ 3] 0 libdyld.dylib      0x00007fffd66f3235 start + 1 
*** End of error message *** 
-------------------------------------------------------------------------- 
mpirun noticed that process rank 3 with PID 0 on node wlan-145-94-163-183 exited on signal 11 (Segmentation fault: 11). 
-------------------------------------------------------------------------- 

我该如何着手解决这个问题?

谢谢!

PS:我对OpenMPI非常陌生,感谢您的耐心。

+0

某处有问题,你的想法,如果你写'如果(XYZ){*(RET)= start_in;}'之后'*(RET) = start_in;' –

+0

@MarkSetchell纠正它。 – pds

回答

2

两个错误:

  1. linspaced只在等级0分配,但随后在MPI_Bcast调用所有的行列中。

  2. linspaced是一个指针。将&linspaced传递给MPI_Bcast会导致指向正在传递的指针,这不是您想要的。

代码应该是这样的:

linspaced = new double[num]; // <--- outside the conditional 

if(rank==0){ 

    if(remainderCases!=0){ 
     linspace(&linspaced[(size-1)*casesPerNode], end - delta*remainderCases, end, remainderCases); 

    } else { 
     linspace(&linspaced[(size-1)*casesPerNode], end - delta*casesPerNode, end, casesPerNode); 

    } 

} 

MPI_Bcast(linspaced, num, MPI_DOUBLE, 0, MPI_COMM_WORLD); 
//  ^-- no & here 
+0

谢谢!这解决了它。 – pds