Хобрук: Ваш путь к мастерству в программировании

Сумма массива MPI работает только для одного ранга

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

Мой вывод введите здесь описание изображения

где я ошибаюсь


Ответы:


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

22.09.2018
  • Да, Gather — правильный способ исправить это (и Scatter для первой части). 22.09.2018
  • Я читал о разбросе и сборе, но мой профессор отказался использовать их и сказал, что мы должны придерживаться MPI_Send и MPI_Recv. 22.09.2018
  • Я не вижу никакого риска тупиковой ситуации. Это также хрестоматийный случай для MPI_Reduce() 22.09.2018
  • Новые материалы

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..