Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用MPI_发送和MPI_接收而不是MPI_收集_C++_Performance_Parallel Processing_Mpi_Hpc - Fatal编程技术网

C++ 使用MPI_发送和MPI_接收而不是MPI_收集

C++ 使用MPI_发送和MPI_接收而不是MPI_收集,c++,performance,parallel-processing,mpi,hpc,C++,Performance,Parallel Processing,Mpi,Hpc,我想比较MPI_Send和MPI_recv与MPI_Gather的性能差异;因此,我试图在没有MPI_聚集的情况下从这段代码中得到答案,但问题是root的缓冲区似乎没有更新。代码是: #include <fstream> #include <iostream> #include <vector> #include <string> #include "mpi.h" using namespace std; const int N

我想比较MPI_Send和MPI_recv与MPI_Gather的性能差异;因此,我试图在没有MPI_聚集的情况下从这段代码中得到答案,但问题是root的缓冲区似乎没有更新。代码是:

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include "mpi.h"
using namespace std;
const int N = 2;

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] = rank + i;
    }

    if (rank == 0) {
        for (int i = 0; i < N; i++) {
            single_arr[i] = x[i];
        }
    }

    if (rank != root) {
        MPI_Send(x.data(), N, MPI_INT, 0, 0, MPI_COMM_WORLD);
    }

    if (rank == root) {
        for (int i = 1; i < size; i++) {
            MPI_Recv(single_arr.data(), N, MPI_INT, rank + i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        }
    }
    if (rank == root) {
        for (int i = 0; i < single_arr.size();i++) {
            cout << i << "\t" << single_arr[i] << endl;
        }
    }
    MPI_Finalize();
}
但是,我想要这个:

0       0
1       1
2       1
3       2
4       2
5       3
6       3
7       4

有没有办法做到这一点?

问题在于:

if (rank != root) {
    MPI_Send(x.data(), N, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
每个进程将向进程发送
x
数组的N个元素=0

然后处理0:

if (rank == root) {
    for (int i = 1; i < size; i++) {
        MPI_Recv(single_arr.data(), N, MPI_INT, rank + i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }
}
打印最后一个进程(即3和4)的值,后跟零

要修复它,您必须执行以下操作:

if (rank == root) {
    for (int i = 1; i < size; i++) {
        MPI_Recv(&(single_arr.data()[N * i]), N, MPI_INT, rank + i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }
}
if(秩==根){
对于(int i=1;i
从位置
[N*i]
[N*i+N]

if (rank == root) {
        for (int i = 0; i < single_arr.size();i++) {
            cout << i << "\t" << single_arr[i] << endl;
        }
    }
if (rank == root) {
    for (int i = 1; i < size; i++) {
        MPI_Recv(&(single_arr.data()[N * i]), N, MPI_INT, rank + i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }
}