【发布时间】:2012-10-23 13:45:17
【问题描述】:
我必须传递一些类型的元素:
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 类型的数组的代码失败了,可能是因为这种不匹配。
【问题讨论】:
-
我从来没有使用过 MPI 派生类型,但你不应该有
MPI_Datatype PEDGE, types[3] = { MPI_FLOAT, MPI_INT, MPI_INT };吗?你有一个带有浮点数和两个整数的struct。同样,您的偏移量将需要第三个组件。这将导致 4 个缺失字节(sizeof(int)通常为 4) -
@tpg2114:这就是
blocklen数组的用途。请参阅MPI_Type_struct()上的参考资料。 -
我想如果我只指定唯一数据类型的数量,它应该仍然有效。我提到了数据类型(MPI_FLOAT、MPI_INT)和特定数据类型的频率(在 blocklen 中),这应该足以让 MPI 创建数据类型。正如“suszterpatt”所说,由于
sizeof是一个编译时运算符,它无法告诉确切的大小。但即使使用 3 个元素,sizeof 也会给出 8 个字节,所以问题可能出在其他地方。 -
@Sayan 不,问题是
edge和PEDGE不是同一个类型,所以它们的大小不一样。假设你有一个struct和一个指向它的指针。指针的大小明显不同于结构的大小。这就是PEDGE的含义:描述数据类型的一些内部 MPI 结构的句柄。拿它的sizeof是没有意义的。 -
请注意,
MPI_Type_struct在 MPI-2.0 中已被弃用,取而代之的是MPI_Type_create_struct,并在 MPI-3.0 中删除。
标签: mpi derived-types