访问MPI_Datatype

时间:2018-04-07 05:48:02

标签: mpi openmpi

我正在尝试使用PMPI包装器来记录一些功能参数,例如MPI_Send的参数。我需要记录它们然后我可以用它们来重建所有这些参数的内容。

MPI_Send的包装器如下所示:

/* ================== C Wrappers for MPI_Send ================== */
_EXTERN_C_ int PMPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm);
_EXTERN_C_ int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) { 
    int _wrap_py_return_val = 0;

    do_wrap_send_series((char *)"MPI_Send", buf, count, datatype, dest, tag, comm);
    _wrap_py_return_val = PMPI_Send(buf, count, datatype, dest, tag, comm);
    return _wrap_py_return_val;
}

问题是我无法记录指针的值并在以后使用它。指针可能在运行中有所不同。

至少MPI_Datatype是指针类型,如果我错了,请纠正我。

如何找出MPI_Datatype是指针类型:编译thismpicc警告(在x86_64上):

warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘struct ompi_datatype_t *’

struct ompi_datatype_t的定义是:

struct ompi_datatype_t {
    opal_datatype_t    super;                    /**< Base opal_datatype_t superclass */
    /* --- cacheline 5 boundary (320 bytes) was 32 bytes ago --- */

    int32_t            id;                       /**< OMPI-layers unique id of the type */
    int32_t            d_f_to_c_index;           /**< Fortran index for this datatype */
    struct opal_hash_table_t *d_keyhash;         /**< Attribute fields */

    void*              args;                     /**< Data description for the user */
    void*              packed_description;       /**< Packed description of the datatype */
    uint64_t           pml_data;                 /**< PML-specific information */
    /* --- cacheline 6 boundary (384 bytes) --- */
    char               name[MPI_MAX_OBJECT_NAME];/**< Externally visible name */
    /* --- cacheline 7 boundary (448 bytes) --- */

    /* size: 448, cachelines: 7, members: 7 */
};

typedef struct ompi_datatype_t ompi_datatype_t;

所以看起来每个MPI_Datatype都有一个唯一的id。

因此,我尝试访问here提交的id。我收到了错误:

error: dereferencing pointer to incomplete type ‘struct ompi_datatype_t’

ompi应该是内部数据结构。有没有办法实现我的目标?

生成PMPI包装器的工具:here

1 个答案:

答案 0 :(得分:2)

一般来说,MPI_Datatype是一个不透明的处理程序,所以你不能做任何假设,特别是如果你的包装器应该是可移植的。

MPI_Datatype确实是Open MPI中的指针,但它是MPICH中的一个数字。

(较旧)Fortran使用整数来引用数据类型,因此一个选项是使用以下子例程

  • MPI_Fint MPI_Type_c2f(MPI_Datatype datatype);
  • MPI_Datatype MPI_Type_f2c(MPI_Fint datatype);

要在MPI_DatatypeMPI_Fintint之间进行转换,除非您使用8个字节的Fortran整数构建Open MPI)

话虽如此,如果你想比较运行之间的数据类型,你可能想要考虑这些子程序

  • int MPI_Type_set_name(MPI_Datatype type, const char *type_name);
  • int MPI_Type_get_name(MPI_Datatype type, char *type_name, int *resultlen);

因此,您不必担心竞争条件,也不必更改应用程序创建派生数据类型的顺序。