【发布时间】: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