快速提问:由于性能要求,我需要能够在我发送数据的同时进行后续计算。 所以我需要使用MPI_Isend。
这样安全吗?
//qtasks[][] is a 2d array and Im sending one row to each task
//it has numtasks rows and different count of columns for each row
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
int k;
for(t=0;t<numtasks;t++){
if(t != rank) {
_k= cqtasks[t]; //this is the number of columns (for each row)
MPI_Isend( qtasks[t],_k,MPI_DOUBLE, t, 55,MPI_COMM_WORLD, &mpireq );
MPI_Request_free( &mpireq );
}
}
答案 0 :(得分:1)
没有。另一方面,正如Jonathan Dursi所指出的那样,MPI_Request_free会释放请求,因此此调用不能确保消息实际到达目的地。
要确保邮件已到达,您需要使用MPI_Wait或MPI_Test调用(或其任何亲属 - MPI_Waitall,MPI_Waitsome,... MPI_Testall,MPI_Testsome,...)。因此,您的代码可能类似于:
//qtasks[][] is a 2d array and Im sending one row to each task
//it has numtasks rows and different count of columns for each row
MPI_Request mpireq[N];
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
int _k;
for(t=0;t<size;t++){
if(t != rank) {
_k= cqtasks[t]; //this is the number of columns (for each row)
MPI_Isend( qtasks[t],_k,MPI_DOUBLE, t, 55,MPI_COMM_WORLD, &mpireq[t] );
}
}
do_some_calculation();
for(t=0;t<size;t++){
if(t != rank) {
MPI_Wait (mpireq[t], MPI_STATUS_IGNORE);
}
}