浮点数的MPI_Scatter分配 - MPI,C

时间:2012-04-10 07:28:21

标签: c mpi

我刚开始参加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, &gtotal, send_count, MPI_INT, MPI_SUM, 0,   MPI_COMM_WORLD);


    if(rank == 0){
      printf("total = %d \n ",gtotal);
    }

2 个答案:

答案 0 :(得分:2)

如果你想得到浮点数结果,你应该在散射和减少中使用MPI_FLOAT作为类型参数。

编辑:如果你想获得浮点结果,也不要在printf中使用%d。

第二编辑:澄清答案后。您不能对发送和接收的元素使用非整数数量的元素。看看here

THIRD_EDIT:您可以处理向每个处理器发送不相等数量的元素。看看MPI_Scatterv

答案 1 :(得分:0)

我认为您的问题在于您尝试向每个流程发送相同大小的工作,即使流程数不是工作量的除数。我的意思是,如果你想要对2000个元素数组的元素求和,那么4个处理器中的每一个都会得到500个元素,每个9个处理器都会得到,......错误地挂在...整数除法2000/9 = 222但是9*222==1998并且如果你不注意,你的数组中的2个元素将不会被添加到总和中。您必须安排将这些元素分配给流程。

由于这是你的作业,我会把细节留给你。