正在访问 MPI_Datatype 的 ID

Accessing id of MPI_Datatype

我正在尝试使用 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 *’

structompi_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

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

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

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

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

为了在 MPI_DatatypeMPI_Fint 之间转换(一个 int 除非你用 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);

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