Ошибка в программе MPI при использовании функции MPI_Reduce MPI_MAXLOC - PullRequest
0 голосов
/ 06 марта 2020

Я хочу использовать функцию MPI_Reduce для поиска наибольшего значения и его PID (ранг) одновременно, но результат показывает, что это не так, я не знаю, как это исправить, результат:

PID:1, loc_num:2 
PID:2, loc_num:3 
PID:3, loc_num:4 
global data: 1 
coresponding PID: 0

моя программа:

#include <stdio.h>
#include <string.h>
#include <mpi.h>

int main(int argc, char *argv[])
{
    //init MPI
    int PID, P;
    MPI_Init(&argc, &argv);      
    MPI_Comm_size(MPI_COMM_WORLD, &P);
    MPI_Comm_rank(MPI_COMM_WORLD, &PID);
    struct{
        int value;
        int PID;
    } in, out;
    int value = 1;
    in.value = value;
    in.PID = PID;

   for(int i = 1; i <= P; i++){
        if (PID == i){                
            value = value + i;
            printf("PID:%d, loc_num:%d \n",PID, value);
        }

    } 
    MPI_Reduce(&in, &out, 1, MPI_2INT, MPI_MAXLOC, 0, MPI_COMM_WORLD);
    int max_PID = out.PID;
    int max_num = out.value;

    if (PID == 0){

        printf("global data: %d \n", max_num);
        printf("coresponding PID: %d \n",max_PID);
    }
    MPI_Finalize();
    return 0;       
}

Я просто следую структуре in.value= value and in.PID=PID and then,every PID calculate value=value+PID, поэтому я получаю ответ, когда PID=1, loc=2;when PID=2, loc=3 ... затем сравню их все по макс. И отправлю их на PID=0

1 Ответ

2 голосов
/ 06 марта 2020

Нет ошибки в MPI_Reduce вашего примера. Как указывало @ Gilles , проблема в том, что вы не присваиваете только что вычисленные value in.value.

Если после вычисления выложить оператор присваивания, как показано ниже, то все работает как и ожидалось.

   for(int i = 1; i <= P; i++){
        if (PID == i){
            value = value + i;
            printf("PID:%d, loc_num:%d \n",PID, value);
        }

    }
    in.value = value;
    in.PID = PID;
    MPI_Reduce(&in, &out, 1, MPI_2INT, MPI_MAXLOC, 0, MPI_COMM_WORLD);

В приведенном ниже примере вы не назначаете вычисленные значения для объекта in struct.

    in.value = value; // value is set as 1
    in.PID = PID;
    for(int i = 1; i <= P; i++){
    if (PID == i){
        value = value + i; // calculating the value but not assigning to in.value
        printf("PID:%d, loc_num:%d \n",PID, value);
       }
     }
    // uses the old value for in.value (i.e 1) for reduction
    MPI_Reduce(&in, &out, 1, MPI_2INT, MPI_MAXLOC, 0, MPI_COMM_WORLD);
...