2

我必须将许多 type: 元素转移 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);

当我执行 a 时sizeof(edge),我得到 12 个字节,但执行时我只得到 8 个字节sizeof(PEDGE)……这是为什么呢?除此之外,我将一些 PEDGE 类型的元素发送到类型数组的代码edge失败了,可能是因为这种不匹配。

4

1 回答 1

3

这里的问题是,MPI_Datatype诸如此类的对象PEDGE本身并不是新的数据类型,而仅仅是 MPI 可以解释为数据类型的某些特定于实现的实体的不透明句柄。因此,sizeof()将无法返回其准确尺寸。改为使用MPI_Type_size()

至于发送失败,如果没有看到您的代码,我不能说太多,但是您的数据类型定义看起来确实正确。

于 2012-11-02T21:24:22.513 回答