我在代码中多次调用了MPI_Sendrecv_replace。但是这个功能表现得非常奇怪。在第一个循环(5000次迭代)中,MPI_Sendrecv_replace总共花费大约30秒。但是,在第二个循环中,该函数仅使用1秒。我很好奇这个原因,因为我想优化代码。代码运行32个处理器。该机器是一个节点,带有4个Intel(R)Xeon(R)CPU E5-4620 v2。
我的部分代码在这里:
for (ishot=1;ishot<=nshots;ishot+=SHOTINC){
...
for (nt=1;nt<=NT;nt++){
...
MPI_Sendrecv_replace(&bufferlef_to_rig[1][1],NY*fdo3,MPI_FLOAT,INDEX[1],TAG1,INDEX[2],TAG1,MPI_COMM_WORLD,&status);
...
}
for (nt=1;nt<=NT;nt++){
...
MPI_Sendrecv_replace(&bufferlef_to_rig[1][1],NY*fdo3,MPI_FLOAT,INDEX[1],TAG1,INDEX[2],TAG1,MPI_COMM_WORLD,&status);
...
}
}
我使用MPI_Wtime来计算MPI_Sendrecv_replace计算的时间。
答案 0 :(得分:0)
似乎问题是MPI_Sendrecv_replace的性能错误。当我用MPI_Sendrecv替换MPI_Sendrecv_replace时,程序运行正常并且耗时的问题消失。我在https://github.com/open-mpi/ompi/issues/93和http://www.open-mpi.org/community/lists/users/2010/01/11683.php
中找到了错误报告