在这个C代码示例中使用MPI_Isend是否安全?

时间:2015-12-16 18:59:52

标签: c mpi

快速提问:由于性能要求,我需要能够在我发送数据的同时进行后续计算。 所以我需要使用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 );

        }
    }

1 个答案:

答案 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);
        }
    }