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

📄 dataloop_create_contig.c

📁 fortran并行计算包
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "./dataloop.h"/*@   Dataloop_contiguous - create the dataloop representation for a   contiguous datatype   Arguments:+  int icount,.  MPI_Datatype oldtype,.  DLOOP_Dataloop **dlp_p,.  int *dlsz_p,.  int *dldepth_p,-  int flag.N Errors.N Returns 0 on success, -1 on failure.@*/int PREPEND_PREFIX(Dataloop_create_contiguous)(int icount,					       DLOOP_Type oldtype,					       DLOOP_Dataloop **dlp_p,					       int *dlsz_p,					       int *dldepth_p,					       int flag){    DLOOP_Count count;    int is_builtin, apply_contig_coalescing = 0;    int new_loop_sz, new_loop_depth;    DLOOP_Dataloop *new_dlp;    count = (DLOOP_Count) icount; /* avoid subsequent casting */    is_builtin = (DLOOP_Handle_hasloop_macro(oldtype)) ? 0 : 1;    if (is_builtin)    {	new_loop_depth = 1;    }    else    {	int old_loop_sz = 0, old_loop_depth = 0;	DLOOP_Offset old_size = 0, old_extent = 0;	DLOOP_Dataloop *old_loop_ptr;	DLOOP_Handle_get_loopsize_macro(oldtype, old_loop_sz, flag);	DLOOP_Handle_get_loopdepth_macro(oldtype, old_loop_depth, flag);	DLOOP_Handle_get_loopptr_macro(oldtype, old_loop_ptr, flag);	DLOOP_Handle_get_size_macro(oldtype, old_size);	DLOOP_Handle_get_extent_macro(oldtype, old_extent);	/* if we have a simple combination of contigs, coalesce */	if (((old_loop_ptr->kind & DLOOP_KIND_MASK) == DLOOP_KIND_CONTIG)	    && (old_size == old_extent))	{	    /* will just copy contig and multiply count */	    apply_contig_coalescing = 1;	    new_loop_depth          = old_loop_depth;	}	else	{	    new_loop_depth = old_loop_depth + 1;	}    }    if (is_builtin)    {	DLOOP_Offset basic_sz = 0;	PREPEND_PREFIX(Dataloop_alloc)(DLOOP_KIND_CONTIG,				       count,				       &new_dlp,				       &new_loop_sz);	/* --BEGIN ERROR HANDLING-- */	if (!new_dlp) return -1;	/* --END ERROR HANDLING-- */	DLOOP_Handle_get_size_macro(oldtype, basic_sz);	new_dlp->kind = DLOOP_KIND_CONTIG | DLOOP_FINAL_MASK;	if (flag == DLOOP_DATALOOP_ALL_BYTES)	{	    count             *= basic_sz;	    new_dlp->el_size   = 1;	    new_dlp->el_extent = 1;	    new_dlp->el_type   = MPI_BYTE;	}	else	{	    new_dlp->el_size   = basic_sz;	    new_dlp->el_extent = new_dlp->el_size;	    new_dlp->el_type   = oldtype;	}	new_dlp->loop_params.c_t.count = count;    }    else    {	/* user-defined base type (oldtype) */	DLOOP_Dataloop *old_loop_ptr;	int old_loop_sz = 0;	DLOOP_Handle_get_loopptr_macro(oldtype, old_loop_ptr, flag);	DLOOP_Handle_get_loopsize_macro(oldtype, old_loop_sz, flag);	if (apply_contig_coalescing)	{	    /* make a copy of the old loop and multiply the count */	    PREPEND_PREFIX(Dataloop_dup)(old_loop_ptr,					 old_loop_sz,					 &new_dlp);	    /* --BEGIN ERROR HANDLING-- */	    if (!new_dlp) return -1;	    /* --END ERROR HANDLING-- */	    new_dlp->loop_params.c_t.count *= count;	    new_loop_sz = old_loop_sz;	    DLOOP_Handle_get_loopdepth_macro(oldtype, new_loop_depth, flag);	}	else	{	    DLOOP_Dataloop *old_loop_ptr;	    int old_loop_sz = 0;	    DLOOP_Handle_get_loopptr_macro(oldtype, old_loop_ptr, flag);	    DLOOP_Handle_get_loopsize_macro(oldtype, old_loop_sz, flag);	    /* allocate space for new loop including copy of old */	    PREPEND_PREFIX(Dataloop_alloc_and_copy)(DLOOP_KIND_CONTIG,						    count,						    old_loop_ptr,						    old_loop_sz,						    &new_dlp,						    &new_loop_sz);	    /* --BEGIN ERROR HANDLING-- */	    if (!new_dlp) return -1;	    /* --END ERROR HANDLING-- */	    new_dlp->kind = DLOOP_KIND_CONTIG;	    DLOOP_Handle_get_size_macro(oldtype, new_dlp->el_size);	    DLOOP_Handle_get_extent_macro(oldtype, new_dlp->el_extent);	    DLOOP_Handle_get_basic_type_macro(oldtype, new_dlp->el_type);	    	    new_dlp->loop_params.c_t.count = count;	}    }    *dlp_p     = new_dlp;    *dlsz_p    = new_loop_sz;    *dldepth_p = new_loop_depth;    return 0;}

⌨️ 快捷键说明

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