2017-04-02 8 views
-1
#include "stdafx.h" 
#include <mpi.h> 
#include <stdio.h> 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <cctype> 
#include <cstdlib> 
#include <ctime> 
#include <cctype> 
#include <cstdlib> 
#include <ctime> 
using namespace std; 

int randomize() { 
    srand(time(0)); 
    int i = 1 + rand() % 3; 
    return i; 
} 

int main(int argc, char** argv) { 
    MPI_Init(&argc, &argv); 
    int rank, size, tag = 1; 
    ofstream outfile; 
    ifstream infile; 
    bool read = true; 
    const int max = 10; 
    char message[max]; char msgS[max]; char msgR[max]; 

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

    outfile.open("in.txt"); 
    cout << "Write messages: " << rank << endl; 
    do { 
     cin.getline(message, max); 
     if (strcmp(message, "stop") == 0) 
      break; 
     outfile << message << endl; 
    } while (strcmp(message, "stop") != 0); 
    cout << "Messages written to file [in.txt]!" << endl; 
    outfile.close(); 

    infile.open("in.txt"); 
    outfile.open("out.txt"); 

    if (rank == 0 && read) { 
     int i = randomize(); 
     if (!infile.eof()) { 
      infile >> msgS; 
      MPI_Send(msgS, strlen(msgS), MPI_CHAR, (rank + i), tag, MPI_COMM_WORLD); 
      read = false; 
     } 
     else { 
      cout << "Messages written to file [out.txt]!" << endl; 
      infile.close(); 
      outfile.close(); 
      exit(0); 
     } 
    } 
    else if (rank == 1 && !read) { 
     MPI_Recv(msgR, strlen(msgS), MPI_CHAR, 0, tag, MPI_COMM_WORLD, MPI_STATUSES_IGNORE); 
     outfile << msgR << endl; 
     tag++; 
     read = true; 
    } 
    else if (rank == 2 && !read) { 
     MPI_Recv(msgR, strlen(msgS), MPI_CHAR, 0, tag, MPI_COMM_WORLD, MPI_STATUSES_IGNORE); 
     outfile << msgR << endl; 
     tag++; 
     read = true; 
    } 
    else if (rank == 3 && !read) { 
     MPI_Recv(msgR, strlen(msgS), MPI_CHAR, 0, tag, MPI_COMM_WORLD, MPI_STATUSES_IGNORE); 
     outfile << msgR << endl; 
     tag++; 
     read = true; 
    } 
    else { 
     cout << "Error!!!"; 
     exit(0); 
    } 
    MPI_Finalize(); 
    system("PAUSE"); 
    return 0; 
} 

何か問題があります。コードはMPI_Sendルーチンで停止し、私はその理由を知らない!ファイルから任意のプロセスに読み込み行を送り、受け取ったデータを別のファイルに格納したいだけです。動作していないMPIをデバッグする方法は?

+0

'randomize'が返されます3より大きい数字で、SendとRecvのブロッキングバージョンを使用しているため、 'Recv'と一致しない' Send'になります。 – niceman

+0

各ランクのif文が正当なものかどうかを確認してください。 –

+0

申し訳ありませんが間違っていた、それについて考えてみましょう – niceman

答えて

0

問題は明らかではありませんが、単純です。read変数です。

if(rank==0 && read) 

が上で実行されます。

事はあなたがすべてのプロセスが実行されるコードにtruereadを設定しているし、この場合の、このため、その後の体を、それを変更していないということですそのランク0で、読み出した第1のプロセスはtrueですが、もしこれのボディ:ので

if(rank ==1 && !read) 

も、プロセスランク1では実行されませんはfalseです。

問題は、まずifは、それがため、そのif「意図した受信機がMPI_Recvを呼び出し、受信プロセスの非がMPI_Recvに達するので、それが起こることはありませんまでそれを実行するプロセスをブロックすることを意味し、ブロッキングされMPI_Sendへの呼び出しが含まれていることです条件は常にfalseです(コードでは!readは常にfalseです)。

解決策:たくさんありますが、私はread変数を完全に削除することを提案します。

送信者プロセスも受信プロセスもブロックしないように値を設定する方法を見つけなければならない場合は、MPI_Recvもブロックされていることに注意してください。送信者がメッセージを送信するので、その送信者がMPI_Sendに届かない場合、受信者は待機するだけです。あなたの問題を解決することを意図していないながら

なく、少なくとも最後に、あなたは、send-recvと同様、非ブロッキングを見て、彼らはMPI_ISendMPI_IRecvと呼ばれ、そうでない、whatever hanging problem I findに対する解決策として、これらを使用していませんメッセージの影響を受けていない計算の場合は、メッセージの影響を受けていないメッセージが送信されている間に何らかの計算を行う場合MPI_Wait(またはその友人)

+0

私は非ブロッキング呼び出しは、特にデッドロックや不必要な同期を避けるために非常に便利だと思います。 MPIライブラリは、しばしば共通のハードウェア上で通信と計算をオーバーラップさせることができません。 –

+0

@VladimirF私は恐怖を感じていました。「私はハングしています。単に「I」を追加するだけではなく、さまざまな考え方が必要です。 'ISend/IRecv'を実行した直後に' MPI_Wait'(または友達)を呼び出してください。私は単にブロッキング関数 – niceman

関連する問題