4daJKong
4daJKong

Reputation: 2075

Error in MPI program when using MPI_Reduce function of MPI_MAXLOC

I want to use MPI_Reduce function find largest value and its PID(rank) at the same time, but the result shows it is not true, I don't know how to fix it, result:

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

my program:

#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;       
}

I just follow the structure of in.value= value and in.PID=PID and then,every PID calculate value=value+PID so the answer is when PID=1, loc=2;when PID=2, loc=3 ...next compare all of them by max, and sent them to PID=0

Upvotes: 0

Views: 165

Answers (1)

j23
j23

Reputation: 3530

There is no error in the MPI_Reduce of your example. As @Gilles pointed out, the issue is you are not assigning the newly calculated value to in.value.

If you put the assignment statement after calculation as below, then everything work as expected.

   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 your example below, you are not assigning the calculated values to the in struct object.

    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);

Upvotes: 2

Related Questions