我有一个名为 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个处理器多次运行实验并且测量结果一致。你能解释一下这种现象或可能出现的问题吗?
感谢。