您的问题是 MPI 无法将控制台输入提供给许多进程,而只能提供给具有 rank 的进程0
。由于 中的前三行main
:
int main(int argc, char *argv[]){
int oper;
std::cout << "Enter Size:";
std::cin >> oper; // <------- The problem is right here
Operations* operations = new Operations(oper);
int rank, size;
MPI_Init(&argc, &argv);
int tid;
MPI_Comm_rank(MPI_COMM_WORLD, &tid);
switch(tid)
{
所有进程,但排名0
块等待他们无法获得的控制台输入。您应该main
如下重写函数的开头:
int main(int argc, char *argv[]){
int oper;
MPI_Init(&argc, &argv);
int tid;
MPI_Comm_rank(MPI_COMM_WORLD, &tid);
if (tid == 0) {
std::cout << "Enter Size:";
std::cin >> oper;
}
MPI_Bcast(&oper, 1, MPI_INT, 0, MPI_COMM_WORLD);
Operations* operations = new Operations(oper);
switch(tid)
{
它的工作原理如下:仅 rank0
显示提示,然后将控制台输入读入oper
. 然后广播oper
from rank的值,0
以便所有其他进程获得正确的值,创建Operations
对象,然后分支到适当的函数。