我通过 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++ 一点也不陌生,所以我非常需要你帮助修复我的代码。
附注有时,当我尝试通过命令行运行代码时,它根本没有输出。只有一个闪烁的光标,等待输入,没有任何反应。
通过多个MPI进程读取标准输入流没有多大意义。例如,OpenMPI 表示:
OpenMPI 将 UNIX 标准输入定向到除
0 级进程之外的所有进程上的/dev/null
。MPI_COMM_WORLD
等级 0 进程继承了MPI_COMM_WORLD
的标准输入。mpirun
因此,使用 OpenMPI,您的非根进程会尝试从
/dev/null
读取数字,但这是行不通的。
我在 MPI Stadnard 中找不到任何有关此问题的信息;但是,它似乎没有定义程序在从标准输入读取方面应如何表现。
这里是 MPI 论坛上的一些相关讨论:用于 stdout/stderr/stdin 的 MPI I/O 接口。
根据我的经验,stdin 通常与 OpenMPI 中一样工作,即在根进程上。因此,您能做的最好的事情就是仅由根进程使用 stdin,然后将数据发送到其他进程。