【问题标题】:MPI Isend/Irecv performance behaviorMPI Isend/Irecv 性能行为
【发布时间】:2012-03-31 10:12:03
【问题描述】:

我有一个名为 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),对于每个k,所有发送和接收缓冲区的大小都为0。所以本质上,没有任何沟通。然而,传输需要 1.95 秒。

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

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

谢谢。

【问题讨论】:

  • MPI 仍然需要接收带有零字节消息的 ack。第一次发送/接收可能正忙于设置通讯频道。
  • 你能在较少数量的处理器上重现这个吗?

标签: mpi parallel-processing distributed-computing


【解决方案1】:

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

  • 是所有通信都很慢,还是只有少数通信在屏障处等待?
  • 屏障的影响是什么?

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

  • 第二个零大小消息的行为如何?

此外,MPI 实现可以处理不同大小的消息,这些消息根本不同,例如通过使用意外的消息缓冲区,但这又取决于实现和系统。

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 2012-11-05
    • 2017-04-24
    • 1970-01-01
    • 2014-03-20
    • 2013-08-20
    • 2013-02-08
    • 2018-09-20
    相关资源
    最近更新 更多