使用MPI_MAXLOC的MPI_Reduce函数时MPI程序出错

使用MPI_MAXLOC的MPI_Reduce函数时MPI程序出错,mpi,openmpi,Mpi,Openmpi,我想使用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, ch

我想使用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;       
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
//初始化MPI
int-PID,P;
MPI_Init(&argc,&argv);
MPI通信大小(MPI通信世界和P);
MPI通信等级(MPI通信世界和PID);
结构{
int值;
int-PID;
}进,出;
int值=1;
in.value=值;
in.PID=PID;

对于(int i=1;i而言,您的示例的
MPI_Reduce
中没有错误。正如@Gilles所指出的,问题在于您没有将新计算的
值分配给
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);

示例的
MPI\u Reduce
中没有错误。正如@Gilles指出的,问题是您没有将新计算的
分配给.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.value
1
,那么您希望得到什么呢?in.value是1对,然后in.value=in.value+PID和out.value=max(in.value),我想得到相应的PID值,你从来都不会
in.value=in.value=PID
!你的意思是什么?in.value=in.value+PID;它可以工作我的观点是你不会做这样的赋值。在每个列上,
in.value
1
,那么你期望什么呢?in.value是1对的,然后in.value=in.value+PID和out.value=max(in.value),我想得到相应的PID,你从来没有在.value=in.value=PID中
!你是什么意思?in.value=in.value+PID;它可以工作我的观点是你不做这样的赋值。