我刚开始参加MPI。对于我正在做的家庭作业,我需要通过将作业分配给不同的过程来生成我们指定的输入的总和。当我得到整数结果时,我的程序工作正常。例如20/20 = 1或20/10 = 2.但是当我得到小数点20/9 = 2.222时,我遇到麻烦并得到错误的结果。我不太确定如何解决这个问题。这是我的散射和生成总和的代码。
其中readNumber =读入的值(例如20)storage =包含值的数组 (1,2,3,4 .... 20)
/*Scatter*/
MPI_Scatter(storage, readNumber/size, MPI_INT,
recStorage, readNumber/size, MPI_INT, 0, MPI_COMM_WORLD);
total=0;
printf("%d \n",readNumber/size);
for(i=0;i<readNumber/size;i++){
total=total+recStorage[i];
}
printf("rank= %d total= %d \n ",rank,total);
/*Reduce*/
MPI_Reduce( &total, >otal, send_count, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
if(rank == 0){
printf("total = %d \n ",gtotal);
}
答案 0 :(得分:2)
如果你想得到浮点数结果,你应该在散射和减少中使用MPI_FLOAT作为类型参数。
编辑:如果你想获得浮点结果,也不要在printf中使用%d。
第二编辑:澄清答案后。您不能对发送和接收的元素使用非整数数量的元素。看看here。
THIRD_EDIT:您可以处理向每个处理器发送不相等数量的元素。看看MPI_Scatterv
答案 1 :(得分:0)
我认为您的问题在于您尝试向每个流程发送相同大小的工作,即使流程数不是工作量的除数。我的意思是,如果你想要对2000个元素数组的元素求和,那么4个处理器中的每一个都会得到500个元素,每个9个处理器都会得到,......错误地挂在...整数除法2000/9 = 222
但是9*222==1998
并且如果你不注意,你的数组中的2个元素将不会被添加到总和中。您必须安排将这些元素分配给流程。
由于这是你的作业,我会把细节留给你。