如果通过freopen重定向stdout和stderr,MPI_Finalize()将无法完成

时间:2016-03-25 15:34:15

标签: c++ parallel-processing mpi io-redirection

我在使用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消息(丑陋但有效)。

0 个答案:

没有答案