使用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中打印数据解决了问题!

最新更新