您的问题是 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. 然后广播operfrom rank的值,0以便所有其他进程获得正确的值,创建Operations对象,然后分支到适当的函数。