【问题标题】:MPI sum of array receive working for only one rank数组接收的 MPI 和仅适用于一级
【发布时间】:2019-02-26 14:27:02
【问题描述】:

我正在尝试使用 MPI 查找长度为 100 个元素的数组的总和,在仅使用 MPI_Send 和 MPI_receive 的限制下,我编写的代码找到每个处理器的总和,但在重新发送到主处理器(rank=0)我的代码只从一个处理器接收

我的代码

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include "mpi.h"
#include "math.h"

int val = 1;
int main(int argc, char* argv[]) {

    int my_rank;
    int p;
    int ierr;
    int i;
    int a[100];
    int q=0;
    for (i = 0; i <100; i++)
    {
        a[i] = i+1;
    }
    int send,recv;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &p);
    int part = 100 /(p-1);
    if (my_rank == 0)
    {
        for (i = 1; i < p; i++)
        {
            send = part * (i-1);
            MPI_Send(&send, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
        }

    }
    else
    {
        MPI_Recv(&recv, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
        for (i = recv; i < recv + part; i++)
        {
            val = val+a[i];

        }
        printf("%d\n", val);
        MPI_Send(&val, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
    }
    if (my_rank == 0)
    {
        MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
        printf("%d", val);
        q = q + val;

    }
    MPI_Finalize();
    if (my_rank == 0)
    {
        printf("The output is %d\n", q);
    }
    return 0;
}

我的输出

我哪里错了

【问题讨论】:

    标签: c mpi distributed-computing


    【解决方案1】:

    因为您只收到一个进程的结果。要接收所有结果,请遍历进程等级:

    if (my_rank == 0)
    {
        for (rank = 1; rank < proc_cnt; rank++)
        {
            MPI_Recv(&val, 1, MPI_INT, rank, 0, MPI_COMM_WORLD, &status);
            printf("value of rank %d is %d", rank, val);
            q = q + val;
        }
    
    }
    

    通常,这是一种不好的做法,可能会导致死锁。如果允许,请使用mpi_gather()

    【讨论】:

    • 是的,Gather 是解决这个问题的正确方法(第一部分是 Scatter)。
    • 我读到了 scatter 和 gather,但我的教授拒绝使用这些,并说我们应该坚持使用 MPI_Send 和 MPI_Recv
    • 我没有看到任何死锁的风险。这也是MPI_Reduce()的教科书案例
    猜你喜欢
    • 2015-03-08
    • 2018-05-02
    • 2020-12-17
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 2015-02-11
    • 2019-05-04
    • 2011-08-19
    相关资源
    最近更新 更多