0

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

输入/输出配管

我使用管道通过标准输入将字符串传递给名为 GULP 的外部程序,并接收 GULP 的标准输出作为我的程序的输入。这在一个处理器上运行良好,但在两个或更多处理器上存在问题(假设它只有 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
}
4

0 回答 0