使用 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 中打印数据解决了问题!
我正在练习这段代码,但我的问题是我无法确保为各个等级创建的每个 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 中打印数据解决了问题!