ソケットプログラミングでは、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]]);
}
['MPI_Waitany()'](https://www.open-mpi.org/doc/v1.8/man3/MPI_Waitany.3.php)の使用はどうですか? – Gilles
@Gilles編集した質問 –
を確認してください申し訳ありませんが、あなたのコードスニペットは私がより具体的であるほど明確ではありません。私が言うことは、送信と受信の両方に同じ要求を使用することは災害のためのレシピであるということです。そして、 'reqs [id]'を 'MPI_REQUEST_NULL'に設定した後、' MPI_Waitany() 'ループで' id'が使用される前に 'MPI_UNDEFINED'であることを確認してください... – Gilles