前提・実現したいこと
以下のようにMPI_Iprobe
で取得したMPI_TAG
を見てデータの受け取りをするメッセージループを構築したのですが
もし想定外のMPI_TAG
が飛んできたときにswitch
文のdefault
で受け取るデータを破棄しようとしているのですけどsegmentation faultとなり処理を継続できません.
Iproveで得たデータは破棄しなければ次の処理に進めませんが
(1)このMPI_Cancelの使い方に問題があるのでしょうか?
(2)適切に受け取るデータを破棄するにはどうすればいいのでしょうか?
疑似コード
C
1time_t interval = 10;//variable 2time_t before = time(nullptr); 3while (1) 4{ 5 time_t now = time(nullptr); 6 7 while (now - before > interval) 8 { 9 int flag = 0; 10 MPI_Status ms; 11 MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &ms); 12 13 if (flag == false)break; 14 else 15 { 16 switch (ms.MPI_TAG) 17 { 18 case HOGEHOGE: 19 case PIYOPIYO: 20 { 21 MY_DATA md = { 0 }; 22 MPI_Recv(&md, 1, MPI_MY_DATA, ms.MPI_SOURCE, ms.MPI_TAG, MPI_COMM_WORLD, &ms); 23 goto COMEHERE; 24 } 25 break; 26 default: 27 { 28 MPI_Request rq; 29 MPI_Cancel(&rq); 30 printf("Connection Canceled\r\n"); 31 } 32 33 } 34 } 35 36 before = now; 37 } 38} 39 40COMEHERE:
補足情報
Windows10 Pro Hyper-V Ubuntu 20.04.1
OpenMPI ver.4.0.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/03 15:32
2020/11/04 14:09