2017-05-24 8 views
0

スタティックヘッダーファイルutils.hには、機能linspaceが含まれています。セグメンテーションフォールト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ファイルは、次のとおりです:次のように私のmain.cppにファイルがある

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

何かがあなたの思考と間違っている{*(RET)= start_in;}' '*(RET)が続きます= start_in; ' –

+0

@ MarkSetchellが修正しました。 – pds

答えて

2

2つのエラー:

  1. linspacedのみランク0に割り当てられているが、その後すべてのランクによってMPI_Bcast呼び出しで使用されています。

  2. linspacedはポインタです。 &linspacedMPI_Bcastに渡すと、ポインタのポインタが渡されますが、ポインタは渡されません。

コードは次のようになります。あなたが `場合(XYZ)書く場合

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

関連する問題