我必须转移一些类型的元素:
typedef struct
{
float w;
int a, b;
} edge;
到不同的进程,因此我创建了一个MPI派生类型:
unsigned int typecount;
MPI_Datatype PEDGE, types[2] = { MPI_FLOAT, MPI_INT };
MPI_Aint offsets[2], extent;
int blocklen[2] = { 1, 2 };
typecount = 2;
offsets[0] = 0;
MPI_Type_extent(MPI_FLOAT, &extent);
offsets[1] = (1*extent);
MPI_Type_struct (typecount, blocklen, offsets, types, &PEDGE);
MPI_Type_commit(&PEDGE);
当我执行sizeof(edge)
时,我得到12个字节,但是当我sizeof(PEDGE)
时,我只得到8个字节......为什么会这样?除此之外,我将PEDGE类型的一些元素发送到edge
类型的数组的代码失败了,可能是因为这种不匹配。
答案 0 :(得分:3)
这里的问题是MPI_Datatype
对象(如PEDGE
)本身不是新的数据类型,只是MPI可以解释为数据类型的某些特定于实现的实体的不透明句柄。因此,sizeof()
将无法返回其准确大小。请改用MPI_Type_size()
。
至于发送失败,我不能在没有看到你的代码的情况下说太多,但你的数据类型定义看起来是正确的。