我有一个给我们的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;
}
如果有人发现我很难理解它,我将不胜感激。
答案 0 :(得分:0)
此代码创建了MPI派生的数据类型,因此struct value
可以在单个MPI调用中广播。
这是恕我直言的一个不好的例子,因为:
offsetof()
宏(直接)填充位移数组(indices
在这里是非常差的选择)MPI_DOUBLE_INT
数据类型非常合适(不要忘记在a
定义中交换b
和struct value
)stdin
读取它们(这是非常主观的,从经验出发,您会避免意外)