了解广播操作MPI

时间:2018-09-26 07:46:21

标签: c mpi

我有一个给我们的MPI程序,该程序从用户处接收一个整数和一个双倍的输入,并让进程宣布它们收到的值。

例如:

user input = 7 10.1

输出:

Process 1 got 7 and 10.100000
Process 2 got 7 and 10.100000
.
.

我知道每个过程都只需要宣布一次广播中用户输入所给出的值,但是代码似乎很复杂,我无法理解它的逻辑。

#include <stdio.h>
#include "mpi.h"

int main(int argc, char *argv[])
{
   int rank; //rank of the process
   struct {int a;double b;} value;
   MPI_Datatype mystruct;
   int blocklens[2];   //what is this?
   MPI_Aint indices[2];   //what is this?
   MPI_Datatype oldtype[2];

   MPI_Init(&argc,&argv); //initialize MPI environment
   MPI_Comm_rank(MPI_COMM_WORLD,&rank);

   blocklens[0] = 1;
   blocklens[1] = 1;

   oldtype[0] = MPI_INT;
   oldtype[1] = MPI_DOUBLE;

   MPI_Get_address(&value.a, &indices[0]);
   MPI_Get_address(&value.b, &indices[1]);

   indices[1] = indices[1] - indices[0];
   indices[0] = 0;
   MPI_Type_create_struct(2,blocklens,indices,oldtype,&mystruct);
   MPI_Type_commit(&mystruct);

   while (value.a >= 0) {
       if (rank == 0) {
           printf("Enter an integer and double: ");
           fflush(stdout);
           scanf("%d %lf",&value.a,&value.b);
       }
       MPI_Bcast(&value,1,mystruct,0,MPI_COMM_WORLD);
       printf("Process %d got %d and %lf\n",rank,value.a,value.b);
   }
   MPI_Type_free(&mystruct);
   MPI_Finalize();
   return 0;

}

如果有人发现我很难理解它,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

此代码创建了MPI派生的数据类型,因此struct value可以在单个MPI调用中广播。

这是恕我直言的一个不好的例子,因为:

  • 应该使用offsetof()宏(直接)填充位移数组(indices在这里是非常差的选择)
  • 预定义的MPI_DOUBLE_INT数据类型非常合适(不要忘记在a定义中交换bstruct value
  • 出于个人喜好,我建议您通过命令行传递值,而不要从stdin读取它们(这是非常主观的,从经验出发,您会避免意外)