为什么rank总是1

why always rank is 1?

本文关键字:总是 rank 为什么      更新时间:2023-10-16

我正在测试一个非常基本的MPI代码:

int main(int argc, char** argv){
  MPI_Init(&argc, &argv);
  int size, rank;
  MPI_Status status;
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  if(rank == 0)
    cout << "world size" << size << " my rank " << rank;
  else
    cout << rank << endl;
  MPI_Finalize(); 
  return 1;
}

这段代码打印:

world size1324 my rank                                                                                                                                                                                      
0

当我将代码更改为以下内容时:

int main(int argc, char** argv){
  MPI_Init(&argc, &argv);
  int size, rank;
  MPI_Status status;
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  if(rank == 0)
    cout << "world size" << size << " my rank " << rank;
  if(rank =! 0)                                                                                                                                                                                           
    cout << rank << endl;
  MPI_Finalize();
  return 1;
}

输出是:

world size111                                                                                                                                                                                               
4
my rank 
01

我用-np 4

运行代码

为什么在第二种方法中,rank总是打印为1?

您可能注意到,也可能没有注意到,rank最初是0,然后被设置为1。仔细检查你的输出。如果rank是1,它不会输出01。它打印第一行cout << "world size" << size << " my rank " << rank;,其中rank为0,然后打印第二行cout << rank << endl;,其中rank为1。

这里的问题是这一行:

if(rank =! 0)

您没有检查rank是否不是0,您将rank设置为!0。它实际上被视为布尔值的赋值,0 (false)的反义词是1 (true)。然后,if计算该赋值的结果。这一行和

是一样的
rank = !0; // ie. set rank = 1
if (rank)  // 1 is true

你应该拥有的是:

if (rank != 0)