MPI Isend/Irecv性能行为

MPI Isend/Irecv性能行为,mpi,parallel-processing,distributed-computing,Mpi,Parallel Processing,Distributed Computing,我有一个名为transferint的例程,它调用MPI例程。在我的主程序中,传输被调用两次 ... // do some work transfer(1); // first transfer ... // do some work again transfer(2); // second transfer transferint函数如下所示 ... // do some work MPI_Barrier(MPI_COMM_WORLD); t0 = clock(); for(int k=0;

我有一个名为transferint的例程,它调用MPI例程。在我的主程序中,传输被调用两次

... // do some work
transfer(1); // first transfer
... // do some work again
transfer(2); // second transfer
transferint函数如下所示

... // do some work
MPI_Barrier(MPI_COMM_WORLD);
t0 = clock();
for(int k=0; k<mpisize; k++) {
    MPI_Irecv( (void*)rbuffer[k], rsize[k], MPI_BYTE, k, 0, MPI_COMM_WORLD, reqs+2*k );
    MPI_Isend( (void*)sbuffer[k], ssize[k], MPI_BYTE, k, 0, MPI_COMM_WORLD, reqs+2*k+1);
}   
MPI_Waitall(2*mpisize, reqs, status);
MPI_Barrier(MPI_COMM_WORLD);
if (mpirank==0) cerr << "Transfer took "<< (double)(clock()-t0)/CLOCKS_PER_SEC << " secs" << endl;
注意,我只测量通信时间,不包括预处理

对于transfer1,每个k的所有发送和接收缓冲区的大小都为0。所以基本上,没有交流。然而,转移花了1.95秒

对于transfer2,每个处理器必须向其他处理器发送/接收约20KB的数据。然而,整个转移只花了0.07秒

我用1024个处理器进行了多次实验,测量结果是一致的。你能解释一下这种现象吗?或者可能的错误是什么


谢谢。

您可以使用MPI性能分析工具,如或更好地了解正在发生的情况:

是所有的通讯都很慢,还是只有少数人在关卡等待? 障碍物的影响是什么? 实际答案在很大程度上取决于您的系统和MPI实现。Anycorn评论说,零大小的消息仍然需要通信,并且第一次通信可能会有额外的开销,这是调查的一个良好开端。所以你应该尝试回答的另一个问题是:

第二条零大小消息的行为如何?
此外,MPI实现可以处理大小不同、根本不同的消息,例如通过使用意外的消息缓冲区,但这同样取决于实现和系统。

MPI仍然需要使用零字节消息接收ack。First send/recv可能正忙于设置通信通道。您能在较少数量的处理器上复制此功能吗?