我在使用MPI和重定向stdout和stderr时遇到问题。
当使用多个进程启动时,如果stdout和stderr都被重定向到(两个不同的)文件中,那么每个进程都会被卡在MPI_Finalize()中,无限期地等待。但是如果只重定向stdout或stderr,那么就没有问题,程序也会正常停止。
我在visual studio 2013上使用intel MPI在Windows 7上工作。
感谢您的帮助!
下面是一个简单的代码,在我的计算机上有两个进程失败(mpiexec -np 2 mpitest.exe)
#include <iostream>
#include <string>
#include <mpi.h>
int main(int argc, char *argv[])
{
int ierr = MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
printf("[%d/%d] This is printed on screen\n", rank, size-1);
// redirect the outputs and errors if necessary
std::string log_file = "log_" + std::to_string(rank) + ".txt";
std::string error_file = "err_" + std::to_string(rank) + ".txt";
//If one of the two following line is commented, then everything works fine
freopen(log_file.c_str(), "w", stdout);
freopen(error_file.c_str(), "w", stderr);
printf("[%d/%d] This is printed on the logfile\n", rank, size - 1);
ierr = MPI_Finalize();
return 0;
}
编辑:对于有兴趣的人,我们将此错误提交给the INTEL developper forum。他们能够重现错误并正在努力解决它。在此期间,我们重定向stdout上的每个stderr消息(丑陋但有效)。