【问题标题】:MPI derived type from a struct来自结构的 MPI 派生类型
【发布时间】: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 不,问题是edgePEDGE 不是同一个类型,所以它们的大小不一样。假设你有一个struct 和一个指向它的指针。指针的大小明显不同于结构的大小。这就是PEDGE 的含义:描述数据类型的一些内部 MPI 结构的句柄。拿它的sizeof 是没有意义的。
  • 请注意,MPI_Type_struct 在 MPI-2.0 中已被弃用,取而代之的是 MPI_Type_create_struct,并在 MPI-3.0 中删除

标签: mpi derived-types


【解决方案1】:

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

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

【讨论】:

  • 或者换句话说,“cecin'est pas un type”。 PEDGE 是数据类型的表示,而不是数据类型本身。
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 2013-12-02
  • 2019-10-19
  • 2014-01-20
  • 2016-10-18
  • 2012-02-03
  • 2014-12-03
相关资源
最近更新 更多