正在访问 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 是指针类型:编译 this,mpicc
警告(在 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_Datatype
和 MPI_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);
因此您不必担心竞争条件,也不必更改您的应用程序创建派生数据类型的顺序。
我正在尝试使用 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 是指针类型:编译 this,mpicc
警告(在 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_Datatype
和 MPI_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);
因此您不必担心竞争条件,也不必更改您的应用程序创建派生数据类型的顺序。