C++ 使用MPI_散点器后打印每个列的数组的一种好方法
我想以适当的方式打印每个列的数组。首先,这段代码的问题是输出没有排序,其次,我只想取消使用if条件来打印每个列的数据。可能吗C++ 使用MPI_散点器后打印每个列的数组的一种好方法,c++,parallel-processing,output,mpi,hpc,C++,Parallel Processing,Output,Mpi,Hpc,我想以适当的方式打印每个列的数组。首先,这段代码的问题是输出没有排序,其次,我只想取消使用if条件来打印每个列的数据。可能吗 #include <fstream> #include <iostream> #include <vector> #include "mpi.h" using namespace std; const int N = 3; int main() { MPI_Init(NULL, NU
#include <fstream>
#include <iostream>
#include <vector>
#include "mpi.h"
using namespace std;
const int N = 3;
int main()
{
MPI_Init(NULL, NULL);
int rank;
int size;
int root = 0;
vector<int> x(N);
vector<int> receive_data(N);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
const int leng = size * N;
vector<int> single_arr(leng);
for (int i = 0; i < N;i++) {
x[i] = 1000*rank + i;
}
MPI_Gather(x.data(), N, MPI_INT, single_arr.data(), N, MPI_INT, root, MPI_COMM_WORLD);
if (rank == root) {
cout << " After the gathering data inside single array at root is : " << endl;
for (int i = 0; i < single_arr.size();i++) {
cout << i << "\t" << single_arr[i] << endl;
}
}
MPI_Scatter(single_arr.data(),N, MPI_INT, receive_data.data(), N,
MPI_INT, root, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
// now checks for data of each rank:
if (rank == root) {
//cout << " After scattering the data: " << endl;
cout << " My rank is : " << rank << endl;
for (int i = 0; i < receive_data.size(); i++) {
cout << i << "\t" << receive_data[i] << endl;
cout << endl;
}
}
if (rank == 1) {
//cout << " After scattering the data: " << endl;
cout << " My rank is : " << rank<<"\t"<< endl;
for (int i = 0; i < receive_data.size(); i++) {
cout << i << "\t" << receive_data[i] << endl;
cout << endl;
}
}
MPI_Finalize();
}
但是,我希望看到这一点,而不是对每个等级使用if条件:
My rank is : 0
0 0
1 1
2 2
My rank is: 1
0 1000
1 1001
2 1002
首先,此代码的问题是输出没有排序,并且
第二,我只是想消除使用if的条件
打印每个等级的数据。可能吗
#include <fstream>
#include <iostream>
#include <vector>
#include "mpi.h"
using namespace std;
const int N = 3;
int main()
{
MPI_Init(NULL, NULL);
int rank;
int size;
int root = 0;
vector<int> x(N);
vector<int> receive_data(N);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
const int leng = size * N;
vector<int> single_arr(leng);
for (int i = 0; i < N;i++) {
x[i] = 1000*rank + i;
}
MPI_Gather(x.data(), N, MPI_INT, single_arr.data(), N, MPI_INT, root, MPI_COMM_WORLD);
if (rank == root) {
cout << " After the gathering data inside single array at root is : " << endl;
for (int i = 0; i < single_arr.size();i++) {
cout << i << "\t" << single_arr[i] << endl;
}
}
MPI_Scatter(single_arr.data(),N, MPI_INT, receive_data.data(), N,
MPI_INT, root, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
// now checks for data of each rank:
if (rank == root) {
//cout << " After scattering the data: " << endl;
cout << " My rank is : " << rank << endl;
for (int i = 0; i < receive_data.size(); i++) {
cout << i << "\t" << receive_data[i] << endl;
cout << endl;
}
}
if (rank == 1) {
//cout << " After scattering the data: " << endl;
cout << " My rank is : " << rank<<"\t"<< endl;
for (int i = 0; i < receive_data.size(); i++) {
cout << i << "\t" << receive_data[i] << endl;
cout << endl;
}
}
MPI_Finalize();
}
这不是MPI的使用方式,实际上是一般意义上的并行。进程之间将输出打印到控制台的协调将极大地降低并行版本的性能,这违背了并行的目的之一,即减少总体执行时间
大多数情况下,最好只让一个进程负责将输出打印到控制台(通常是主进程,即rank=0的进程)
引用@Gilles Gouaillardet:
最好的办法是将所有数据发送到一个级别,并将其保存
把所有东西都打印出来
但是,您可以尝试使用协调流程的方式打印您想要的输出(引用Hristo Iliev):
使用这样的屏障只在以下情况下适用于本地发布
这些进程共享同一个控制终端。否则就是
完全由MPI的I/O重定向机制决定
实施