首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MPI_Send和MPI_Recv代替MPI_Gather

用MPI_Send和MPI_Recv代替MPI_Gather
EN

Stack Overflow用户
提问于 2021-03-11 06:43:02
回答 1查看 464关注 0票数 1

我想比较MPI_Send和MPI_recv与MPI_Gather的性能差异;所以我试图从这段没有MPI_Gather的代码中得到答案,但问题是根的缓冲区似乎没有更新。守则是:

代码语言:javascript
复制
#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();
}

其结果是:

代码语言:javascript
复制
0       3
1       4
2       0
3       0
4       0
5       0
6       0
7       0

但是,我想要这个:

代码语言:javascript
复制
0       0
1       1
2       1
3       2
4       2
5       3
6       3
7       4

有办法这样做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-11 08:30:16

问题在于:

代码语言:javascript
复制
if (rank != root) {
    MPI_Send(x.data(), N, MPI_INT, 0, 0, MPI_COMM_WORLD);
}

每个进程将向进程= 0发送x数组的N个元素,

然后处理0:

代码语言:javascript
复制
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);
    }
}

将从每个进程接收该数据,但是它将是覆盖(而不是附加)数组single_arr的值。

这就是为什么在

代码语言:javascript
复制
if (rank == root) {
        for (int i = 0; i < single_arr.size();i++) {
            cout << i << "\t" << single_arr[i] << endl;
        }
    }

您可以打印最后一个进程(即3和4)的值,然后是零。

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

代码语言:javascript
复制
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);
    }
}

[N * i]位置开始接收数据到数组[N * i][N * i + N]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66577615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档