4

ソケットプログラミングでは、select()機能を使用して複数のソケットを同時にチェックできます。私は、MPIライブラリにもこのような機能がありますか?MPIでソケットプログラミングのselect()と同等のものは何ですか?

次のコードの最初のforループでは、複数のノンブロッキング送受信リクエストを1つおきのノードに送信します。 2番目のforループでは、各ノードを順番に待つのではなく、最初にデータを送信するノードのデータの処理を開始する必要があります。私はそれを行う方法があることを知りたいですか?

for(id=0; id<numtasks; id++){ 
     if(id == taskid) continue; 
     if(sendCount[id] != 0) MPI_Isend(sendBuffer[id], N*sendCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]); 
     if(recvCount[id] != 0) MPI_Irecv(recvBuffer[id], N*recvCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]); 
} 

for(id=0; id<numtasks; id++){ 
     if(id == taskid) continue; 
     if(recvCount[id] != 0){ 
       MPI_Wait(&reqs[id], &status); 
       for(i=0; i<recvCount[id]; i++) 
         splitData(N, recvBuffer[id] + N*i, U[toRecv[id][i]]); 
     } 
}  

私のコードを修正しようとしましたが、実行時にまだセグメント化エラーが発生しています。エラーを理解するのを手伝ってください。

for(id=0; id<numtasks; id++){ 
     if(id == taskid) continue; 
     if(sendCount[id] != 0) MPI_Isend(sendBuffer[id], N*sendCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]); 
     if(recvCount[id] != 0) MPI_Irecv(recvBuffer[id], N*recvCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]); 
} 

reqs[taskid] = reqs[numtasks-1]; 
for(i=0; i<numtasks-1; i++){ 
     MPI_Waitany(numtasks-1, reqs, &id, &status); 
     if(id == taskid) id = numtasks-1; 
     for(i=0; i<recvCount[id]; i++) 
       splitData(N, recvBuffer[id] + N*i, U[toRecv[id][i]]); 
} 
+2

['MPI_Waitany()'](https://www.open-mpi.org/doc/v1.8/man3/MPI_Waitany.3.php)の使用はどうですか? – Gilles

+0

@Gilles編集した質問 –

+4

を確認してください申し訳ありませんが、あなたのコードスニペットは私がより具体的であるほど明確ではありません。私が言うことは、送信と受信の両方に同じ要求を使用することは災害のためのレシピであるということです。そして、 'reqs [id]'を 'MPI_REQUEST_NULL'に設定した後、' MPI_Waitany() 'ループで' id'が使用される前に 'MPI_UNDEFINED'であることを確認してください... – Gilles

答えて

3

最も近い同等のMPI_Waitsomeだろう、あなたは要求のリストを提供し、それはすぐに少なくとも一つの要求が完了すると戻ります。ただし、selectのようなタイムアウトはありません。また、MPI_Waitany,MPI_WaitallおよびMPI_Testany,MPI_Testall,MPI_Testsomeもある。

anysomeのバリエーションは、インターフェースが1つまたは複数の完了したリクエストについてあなたに知らせる方法が主に異なります。

編集:操作ごとに個別の要求、具体的には送信操作と受信操作を使用する必要があります。

+0

編集した質問を確認してください。 –

+2

元の質問では(右にスクロールしなかったため)、送信と受信のために別々のリクエストを使用する必要があります。それでもあなたが失敗したら、[mcve]を提供してください。 – Zulan

+0

はい、ありがとうございました! –

関連する問題