Сумма массива MPI, полученная только для одного ранга - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь найти сумму массива элементов длиной 100 с использованием MPI, в соответствии с ограничениями только использования MPI_Send и MPI_receive, код, который я написал, находит сумму каждого процессора, но во время повторной отправки восновной процессор (ранг = 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;
}

мой вывод enter image description here

где amя иду не так

1 Ответ

0 голосов
/ 22 сентября 2018

Потому что вы получаете результат только от одного процесса.Чтобы получить все результаты, перебирайте ранги процессов:

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(), если разрешено.

...