使用MPI_MAXLOC的MPI_Reduce函数时MPI程序出错
我想使用MPI_Reduce函数同时查找最大值及其PID(秩),但结果显示它不是真的,我不知道如何修复它,结果:使用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
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;它可以工作我的观点是你不做这样的赋值。