MPI Isend / Irecv性能行为

时间:2012-03-14 21:36:35

标签: mpi parallel-processing distributed-computing

我有一个名为 transfer(int)的例程,它调用MPI例程。在我的主程序中,transfer()被调用两次。

... // do some work
transfer(1); // first transfer
... // do some work again
transfer(2); // second transfer

transfer(int)函数如下所示

... // 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;

请注意,我只测量通讯时间,不包括预处理。


对于 transfer(1),所有发送和接收缓冲区的大小均为0 k 。基本上,没有沟通。然而,转会花了1.95秒。

对于 transfer(2),每个处理器必须向/从每个其他处理器发送/接收大约20KB。然而,整个转会只用了0.07秒。

我用1024个处理器多次运行实验并且测量结果一致。你能解释一下这种现象或可能出现的问题吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用MPI性能分析工具(例如VampirScalasca)来更好地了解正在发生的事情:

  • 所有通讯都是缓慢的还是只有其余部分在屏障处等待?
  • 障碍的影响是什么?

实际答案在很大程度上取决于您的系统和MPI实施。 Anycorn评论零大小的消息仍然需要通信,第一次通信可能有额外的开销是一个良好的调查开始。所以你应该尝试回答的另一个问题是:

  • 第二个零大小的消息如何表现?

MPI实现也可以处理根本不同的不同大小的消息,例如,通过使用意外的消息缓冲区,但这又是实现和系统相关的。