C++ 使用MPI_散点器后打印每个列的数组的一种好方法

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

我想以适当的方式打印每个列的数组。首先,这段代码的问题是输出没有排序,其次,我只想取消使用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();
    }
但是,我希望看到这一点,而不是对每个等级使用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重定向机制决定 实施