Linux管道替换stdio - 与MPI的问题

时间:2013-07-22 21:03:30

标签: c++ file-io pipe mpi

这个问题是在解决以下讨论的问题后的下一步:

Piping for input/output

我使用管道通过stdin将字符串传递给名为GULP的外部程序,并接收GULP的stdout作为我程序的输入。这在一个处理器上工作正常,但在两个或更多处理器上存在问题(假设它只有2个内核)。程序GULP使用一个临时文件,似乎两个处理器同时启动GULP,然后GULP尝试同时对同一个文件执行多个操作(可能是同时写入)。 GULP报告“错误打开文件”。

我在运行Ubuntu的多个内核的笔记本电脑上测试此代码,但该代码适用于分布式内存HPC(我正在使用OpenMPI)。假设为了这个讨论,我不能修改GULP。

我希望有一些直接的方法让GULP创建两个独立的临时文件并继续正常运行。我要求的太多了吗?

希望这个伪代码有用(假定有2个处理器):

int main()
{
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(…);
    MPI_Comm_size(…);
    int loopmin, loopmax;//distributes the loop among each processor

    for (int i = loopmin; i < loopmax; i++)
    {
        Launch_GULP(…);//launches external program
    }

    return 0;
}

Launch_GULP(…)
{
    int fd_p2c[2], fd_c2p[2];
    pipe(fd_p2c);
    pipe(fd_c2p);
    childpid = fork();

    //the rest follows as in accepted answer in above link
    //so i'll highlight the interesting stuff

    if (childpid < 0)
    {
        perror("bad");
        exit(-1);
    }
    else if (childpid == 0)
    {
        //call dup2, etc
        execl( …call the program… );
    }
    else
    {
        //the interesting stuff
        close(fd_p2c[0]);
        close(fd_c2p[1]);

        write(fd_p2c[1],…);
        close(fd_p2c[1]);

        while(1)
        {
            bytes_read = read(fd_c2p[0],…);//read GULP output

            if (bytes_read <= 0)
                break;

            //pass info to read buffer & append null terminator
        }
        close(fd_c2p[0]);

        if(kill(childpid,SIGTERM) != 0)
        {
            perror("Failed to kill child… tragic");
            exit(1);
        }
        waitpid(childpid, NULL, 0);
    }
    //end piping… GULP has reported an error via stdout
    //that error is stored in the buffer string
    //consequently an error is triggered in my code and the program exits
}

0 个答案:

没有答案