0

我从 MPI 开始。对于我正在做的作业,我需要通过将作业分配给不同的进程来生成我们指定的输入总和。当我得到整数结果时,我的程序运行良好。例如 20/20 = 1 或 20/10 = 2。但是当我得到小数点 20/9 =2.222 时,我会遇到麻烦并得到错误的结果。我不太确定如何解决这个问题。这是我的分散和产生总和的代码。

其中 readNumber = 读入的值(例如 20)存储 = 具有值的数组(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);
    }
4

2 回答 2

2

如果你想获得浮点结果,你应该在 scatter 和 reduce 中使用 MPI_FLOAT 作为类型参数。

编辑:另外,如果您想获得浮点结果,请不要在 printf 中使用 %d 。

第二次编辑:在澄清答案后。您不能将非整数元素用于已发送和已接收元素。看看这里

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

于 2012-04-10T07:49:39.707 回答
0

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

既然这是你的作业,我会把细节留给你。

于 2012-04-10T08:18:00.270 回答