[英]What's wrong with this MPI code?
下面的MPI程序只是为消息定义了MPI类型,然后将消息从进程0发送到进程1。但是,它崩溃,并显示了非常错误的错误消息。 它出什么问题了?
#include <stdio.h>
#include <mpi.h>
struct P {
char choices[64];
int next_choice;
};
typedef struct P Packing;
int main(int argc,char** argv) {
int rank;
MPI_Datatype PACKING_TYPE;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
if (rank == 0) {
/*Defines a new MPI datatype tag for Packings.*/
int field_count = 2;
int field_lengths[2] = {64,1};
MPI_Aint field_offsets[2] = {0,64 * sizeof(char)};
MPI_Datatype field_types[2] = {MPI_CHAR,MPI_INT};
MPI_Type_struct(field_count,field_lengths,
field_offsets,field_types,&PACKING_TYPE);
MPI_Type_commit(&PACKING_TYPE);
}
MPI_Barrier(MPI_COMM_WORLD);
if (rank == 0) {
Packing pack;
MPI_Status status;
MPI_Send(&pack,1,PACKING_TYPE,1,0,MPI_COMM_WORLD);
puts("Process 0 sent message.");
}
if (rank == 1) {
Packing pack;
MPI_Status status;
MPI_Recv(&pack,1,PACKING_TYPE,MPI_ANY_SOURCE,
MPI_ANY_TAG,MPI_COMM_WORLD,&status);
puts("Process 1 recieved message.");
}
MPI_Barrier(MPI_COMM_WORLD);
if(rank == 0) {
MPI_Type_free(&PACKING_TYPE);
}
MPI_Finalize();
return 0;
}
MPI_Type_struct()
和MPI_Type_commit()
都不进行任何通信(例如,没有通信器作为参数列表的一部分); 他们纯粹是本地运营。 因此,使用该类型的每个进程都必须创建它。 (这很有意义;任何接收数据的进程都需要了解其布局)。
因此,在摆脱了关于类型创建和释放操作的if (rank == 0)
测试(以及障碍)之后,您的代码即可正常工作。
顺便说一句-实际测量偏移(例如,使用offsetof
或类似方法)而不是假设它们总是最安全的; 编译器可以自由地在结构中插入(例如)填充以帮助对齐。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.