为什么我的MPI程序不等待输入?

问题描述 投票:0回答:1

我通过 MPI 为以下简单任务编写了解决方案代码。这是声明:

  • 在偶数级进程(包括主进程)中输入一个整数 数量。
  • 在奇数阶的过程中输入一个整数,在奇数阶的过程中输入一个整数 奇数排名输入实数。
  • 在每个过程中,输出双 输入数字的值。

这是我作为解决方案编写的代码:

   #include <iostream>
   #include <mpi.h>
   using namespace std;

   int main(int argc, char** argv) {
    MPI_Init(NULL, NULL);
    setlocale(LC_ALL, "Russian");
    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    if (rank % 2 == 0) {
        int integer_num;
        cout << "Enter an integer number: ";
        cin >> integer_num;
        integer_num *= 2;
        cout << "Doubled value: " << integer_num << std::endl;
    }
    else {
        float float_num;
        cout << "Enter a float number: ";
        cin >> float_num;
        float_num *= 2.0;
        cout << "Doubled value: " << float_num << std::endl;
    }

    MPI_Finalize();
    return 0;
   }

我通过(MPI-setted VS 2022)编译它并通过

mpiexec -n 4 MPI_3
cmd 命令运行后,它给了我以下输出:

Enter an integer number:
Enter a float number:
Enter an integer number:
Enter a float number:

正如您所见,我的程序不等待输入并继续执行 4 次。我已经尝试将

cout
s 和
cin
s 替换为
printf
s 和
scanf
s,但这没有帮助。

我对 MPI 和 C++ 一点也不陌生,所以我非常需要你帮助修复我的代码。

附注有时,当我尝试通过命令行运行代码时,它根本没有输出。只有一个闪烁的光标,等待输入,没有任何反应。

c++ mpi cin cout
1个回答
0
投票

通过多个MPI进程读取标准输入流没有多大意义。例如,OpenMPI 表示

OpenMPI 将 UNIX 标准输入定向到除

/dev/null
0 级进程之外的所有进程上的
MPI_COMM_WORLD
MPI_COMM_WORLD
等级 0 进程继承了
mpirun
的标准输入。

因此,使用 OpenMPI,您的非根进程会尝试从

/dev/null
读取数字,但这是行不通的。

我在 MPI Stadnard 中找不到任何有关此问题的信息;但是,它似乎没有定义程序在从标准输入读取方面应如何表现。

这里是 MPI 论坛上的一些相关讨论:用于 stdout/stderr/stdin 的 MPI I/O 接口

根据我的经验,stdin 通常与 OpenMPI 中一样工作,即在根进程上。因此,您能做的最好的事情就是仅由根进程使用 stdin,然后将数据发送到其他进程。

© www.soinside.com 2019 - 2024. All rights reserved.