⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpid_datatype_contents.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include <mpiimpl.h>#include <mpid_dataloop.h>#include <stdlib.h>#include <limits.h>/*@  MPID_Datatype_set_contents - store contents information for use in                               MPI_Type_get_contents.  Returns MPI_SUCCESS on success, MPI error code on error.@*/int MPID_Datatype_set_contents(MPID_Datatype *new_dtp,			       int combiner,			       int nr_ints,			       int nr_aints,			       int nr_types,			       int array_of_ints[],			       MPI_Aint array_of_aints[],			       MPI_Datatype array_of_types[]){    int i, contents_size, align_sz = 8, epsilon, mpi_errno;    int struct_sz, ints_sz, aints_sz, types_sz;    MPID_Datatype_contents *cp;    MPID_Datatype *old_dtp;    char *ptr;#ifdef HAVE_MAX_STRUCT_ALIGNMENT    if (align_sz > HAVE_MAX_STRUCT_ALIGNMENT) {	align_sz = HAVE_MAX_STRUCT_ALIGNMENT;    }#endif    struct_sz = sizeof(MPID_Datatype_contents);    types_sz  = nr_types * sizeof(MPI_Datatype);    ints_sz   = nr_ints * sizeof(int);    aints_sz  = nr_aints * sizeof(MPI_Aint);    /* pad the struct, types, and ints before we allocate.     *     * note: it's not necessary that we pad the aints,     *       because they are last in the region.     */    if ((epsilon = struct_sz % align_sz)) {	struct_sz += align_sz - epsilon;    }    if ((epsilon = types_sz % align_sz)) {	types_sz += align_sz - epsilon;    }    if ((epsilon = ints_sz % align_sz)) {	ints_sz += align_sz - epsilon;    }    contents_size = struct_sz + types_sz + ints_sz + aints_sz;    cp = (MPID_Datatype_contents *) MPIU_Malloc(contents_size);    /* --BEGIN ERROR HANDLING-- */    if (cp == NULL) {	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS,					 MPIR_ERR_RECOVERABLE,					 "MPID_Datatype_set_contents",					 __LINE__,					 MPI_ERR_OTHER,					 "**nomem",					 0);	return mpi_errno;    }    /* --END ERROR HANDLING-- */    cp->combiner = combiner;    cp->nr_ints  = nr_ints;    cp->nr_aints = nr_aints;    cp->nr_types = nr_types;    /* arrays are stored in the following order: types, ints, aints,     * following the structure itself.     */    ptr = ((char *) cp) + struct_sz;    memcpy(ptr, array_of_types, nr_types * sizeof(MPI_Datatype));        ptr = ((char *) cp) + struct_sz + types_sz;    if (nr_ints > 0) {	memcpy(ptr, array_of_ints, nr_ints * sizeof(int));    }    ptr = ((char *) cp) + struct_sz + types_sz + ints_sz;    if (nr_aints > 0) {	memcpy(ptr, array_of_aints, nr_aints * sizeof(MPI_Aint));    }    new_dtp->contents = cp;    /* increment reference counts on all the derived types used here */    for (i=0; i < nr_types; i++) {	if (HANDLE_GET_KIND(array_of_types[i]) != HANDLE_KIND_BUILTIN) {	    MPID_Datatype_get_ptr(array_of_types[i], old_dtp);	    MPID_Datatype_add_ref(old_dtp);	}    }    return MPI_SUCCESS;}void MPID_Datatype_free_contents(MPID_Datatype *dtp){    int i, cnt, struct_sz = sizeof(MPID_Datatype_contents);    int align_sz = 8, epsilon;    MPID_Datatype *old_dtp;    MPI_Datatype *array_of_types;    if ((epsilon = struct_sz % align_sz)) {	struct_sz += align_sz - epsilon;    }    /* note: relies on types being first after structure */    array_of_types = (MPI_Datatype *) ((char *)dtp->contents + struct_sz);    for (i=0; i < dtp->contents->nr_types; i++) {	if (HANDLE_GET_KIND(array_of_types[i]) != HANDLE_KIND_BUILTIN) {	    MPID_Datatype_get_ptr(array_of_types[i], old_dtp);	    MPIU_Object_release_ref(old_dtp, &cnt);	    if (cnt == 0) {		/* last reference to this type */		MPID_Datatype_free(old_dtp);	    }	}    }    MPIU_Free(dtp->contents);    dtp->contents = NULL;}void MPIDI_Datatype_get_contents_ints(MPID_Datatype_contents *cp,				      int *user_ints){    char *ptr;    int align_sz = 8, epsilon;    int struct_sz, types_sz;#ifdef HAVE_MAX_STRUCT_ALIGNMENT    if (align_sz > HAVE_MAX_STRUCT_ALIGNMENT) {	align_sz = HAVE_MAX_STRUCT_ALIGNMENT;    }#endif    struct_sz = sizeof(MPID_Datatype_contents);    types_sz  = cp->nr_types * sizeof(MPI_Datatype);    /* pad the struct, types, and ints before we allocate.     *     * note: it's not necessary that we pad the aints,     *       because they are last in the region.     */    if ((epsilon = struct_sz % align_sz)) {	struct_sz += align_sz - epsilon;    }    if ((epsilon = types_sz % align_sz)) {	types_sz += align_sz - epsilon;    }    ptr = ((char *) cp) + struct_sz + types_sz;    memcpy(user_ints, ptr, cp->nr_ints * sizeof(int));    return;}void MPIDI_Datatype_get_contents_aints(MPID_Datatype_contents *cp,				       MPI_Aint *user_aints){    char *ptr;    int align_sz = 8, epsilon;    int struct_sz, ints_sz, aints_sz, types_sz;#ifdef HAVE_MAX_STRUCT_ALIGNMENT    if (align_sz > HAVE_MAX_STRUCT_ALIGNMENT) {	align_sz = HAVE_MAX_STRUCT_ALIGNMENT;    }#endif    struct_sz = sizeof(MPID_Datatype_contents);    types_sz  = cp->nr_types * sizeof(MPI_Datatype);    ints_sz   = cp->nr_ints * sizeof(int);    aints_sz  = cp->nr_aints * sizeof(MPI_Aint);    /* pad the struct, types, and ints before we allocate.     *     * note: it's not necessary that we pad the aints,     *       because they are last in the region.     */    if ((epsilon = struct_sz % align_sz)) {	struct_sz += align_sz - epsilon;    }    if ((epsilon = types_sz % align_sz)) {	types_sz += align_sz - epsilon;    }    if ((epsilon = ints_sz % align_sz)) {	ints_sz += align_sz - epsilon;    }    ptr = ((char *) cp) + struct_sz + types_sz + ints_sz;    memcpy(user_aints, ptr, cp->nr_aints * sizeof(MPI_Aint));    return;}void MPIDI_Datatype_get_contents_types(MPID_Datatype_contents *cp,				       MPI_Datatype *user_types){    char *ptr;    int align_sz = 8, epsilon;    int struct_sz;#ifdef HAVE_MAX_STRUCT_ALIGNMENT    if (align_sz > HAVE_MAX_STRUCT_ALIGNMENT) {	align_sz = HAVE_MAX_STRUCT_ALIGNMENT;    }#endif    struct_sz = sizeof(MPID_Datatype_contents);    /* pad the struct, types, and ints before we allocate.     *     * note: it's not necessary that we pad the aints,     *       because they are last in the region.     */    if ((epsilon = struct_sz % align_sz)) {	struct_sz += align_sz - epsilon;    }    ptr = ((char *) cp) + struct_sz;    memcpy(user_types, ptr, cp->nr_types * sizeof(MPI_Datatype));    return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -