为什么总排名是1?

时间:2016-08-12 19:12:49

标签: c++

我正在测试一个非常基本的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

运行代码

为什么在第二种方法中,排名始终打印为1?

1 个答案:

答案 0 :(得分:1)

您可能已经注意到或未注意到,rank最初为0,然后设置为1.仔细查看您的输出。如果rank为1,则不会打印01。它打印了cout << "world size" << size << " my rank " << rank;为{0}的第一行rank,然后打印出cout << rank << endl;为{1}}的第二行rank

这里的问题是这一行:

if(rank =! 0)

您没有检查rank是否不是0,而是将rank设置为!0。它被有效地视为布尔值的赋值,而0(假)的相反值是1(真)。然后if评估该分配的结果。所以该行基本上与:

相同
rank = !0; // ie. set rank = 1
if (rank)  // 1 is true

你应该拥有的是:

if (rank != 0)