使用 MPI 为每个等级创建数组

Creating array for each rank using MPI

我正在练习这段代码,但我的问题是我无法确保为各个等级创建的每个 x 实际上都与正确的等级相关。

#include <iostream>
#include "mpi.h"
using namespace std;
const int N = 3;
void print(int x[N]) {
    for (int i = 0; i <N ;i++) {
        cout << x[i] << "\t";
    }
}

int main()
{
    MPI_Init(NULL, NULL);
    int rank;
    int size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    cout << " My rank is : "<<rank << endl; 

    int x[N];
    for (int i = 0; i < N;i++) {
        x[i] = 2*rank + i;
    }
    print(x);
    MPI_Finalize();
}

结果是:

 My rank is : 0
 My rank is : 2
 My rank is : 1
 My rank is : 3
6       7       8
0       1       2
2       3       4
4       5       6

查看结果,很明显 x 已经正确地为等级创建,但我预料到了这个结果。而且我不知道为什么我没有得到这个。

   My rank is : 0
   0       1       2
   My rank is : 2
   4       5       6
   My rank is : 1
   2       3       4
   My rank is : 3
   6       7       8

cout 缓冲输出,直到遇到换行符或输出结束(在程序退出时)。

在你的情况下,这里只有一个换行符:

   cout << " My rank is : "<<rank << endl; 

因此,当程序结束时,其余输出将写入控制台,这发生在排名作为 MPI_Finalize() 的一部分同步之后。这样就起到了屏障的作用,同步了输出。

尝试在 print() 末尾添加 cout << endl;:

void print(int x[N]) {
    for (int i = 0; i <N ;i++) {
        cout << x[i] << "\t";
    }
    cout << endl; // <------ here
}

然后您应该会看到预期的交错输出。

 My rank is : 0
0       1       2
 My rank is : 1
2       3       4
 My rank is : 2
4       5       6
 My rank is : 3
6       7       8

甚至

 My rank is : 3
6       7       8
 My rank is :  My rank is : 10
0       1       2

2       3       4
 My rank is : 2
4       5       6

- 不同等级的输出并不是真正同步的。

使用 MPI_Gather 并在 root 中打印数据解决了问题!