我正在尝试使用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 *’
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
答案 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_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);
因此,您不必担心竞争条件,也不必更改应用程序创建派生数据类型的顺序。