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

📄 dataloop.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
	    new_loop->loop_params.i_t.blocksize_array =		(DLOOP_Count *) (((char *) new_loop) + loop_sz);	    new_loop->loop_params.i_t.offset_array =		(DLOOP_Offset *) (((char *) new_loop) + loop_sz + blk_sz);	    if (old_loop == NULL) {		new_loop->loop_params.i_t.dataloop = NULL;	    }	    else {		new_loop->loop_params.i_t.dataloop =		    (DLOOP_Dataloop *) (((char *) new_loop) +					(new_loop_sz - old_loop_sz));	    }	    break;	case DLOOP_KIND_BLOCKINDEXED:	    new_loop->loop_params.bi_t.offset_array =		(DLOOP_Offset *) (((char *) new_loop) + loop_sz);	    if (old_loop == NULL) {		new_loop->loop_params.bi_t.dataloop = NULL;	    }	    else {		new_loop->loop_params.bi_t.dataloop =		    (DLOOP_Dataloop *) (((char *) new_loop) +					(new_loop_sz - old_loop_sz));	    }	    break;	case DLOOP_KIND_CONTIG:	    if (old_loop == NULL) {		new_loop->loop_params.c_t.dataloop = NULL;	    }	    else {		new_loop->loop_params.c_t.dataloop =		    (DLOOP_Dataloop *) (((char *) new_loop) +					(new_loop_sz - old_loop_sz));	    }	    break;	case DLOOP_KIND_VECTOR:	    if (old_loop == NULL) {		new_loop->loop_params.v_t.dataloop = NULL;	    }	    else {		new_loop->loop_params.v_t.dataloop =		    (DLOOP_Dataloop *) (((char *) new_loop) +					(new_loop_sz - old_loop_sz));	    }	    break;	default:	    DLOOP_Assert(0);    }    pos = ((char *) new_loop) + (new_loop_sz - old_loop_sz);    if (old_loop != NULL) {	PREPEND_PREFIX(Dataloop_copy)(pos, old_loop, old_loop_sz);    }    *new_loop_p    = new_loop;    *new_loop_sz_p = new_loop_sz;    return;}/*@  Dataloop_struct_alloc - allocate the resources used to store a dataloop and                          copy in old dataloop as appropriate.  this version                          is specifically for use when a struct dataloop is                          being created; the space to hold old dataloops in                          this case must be described back to the                          implementation in order for efficient copying.  Input Parameters:+ count         - number of elements in dataloop (kind dependent). old_loop_sz   - size of old dataloop (should be zero if old_loop is NULL). basic_ct      - number of basic types for which new dataloops are needed. old_loop_p    - address at which to store pointer to old loops. new_loop_p    - address at which to store new struct dataloop pointer- new_loop_sz_p - address at which to store new loop size  Notes:  The count parameter passed into this function will often be different  from the count passed in at the MPI layer due to optimizations.  The caller is responsible for filling in the region pointed to by  old_loop_p (count elements).@*/void PREPEND_PREFIX(Dataloop_struct_alloc)(DLOOP_Count count,					   int old_loop_sz,					   int basic_ct,					   DLOOP_Dataloop **old_loop_p,					   DLOOP_Dataloop **new_loop_p,					   int *new_loop_sz_p){    int new_loop_sz = 0;    int align_sz = 8; /* default aligns everything to 8-byte boundaries */    int epsilon;    int loop_sz = sizeof(DLOOP_Dataloop);    int off_sz, blk_sz, ptr_sz, extent_sz, basic_sz;    DLOOP_Dataloop *new_loop;#ifdef HAVE_MAX_STRUCT_ALIGNMENT    if (align_sz > HAVE_MAX_STRUCT_ALIGNMENT) {	align_sz = HAVE_MAX_STRUCT_ALIGNMENT;    }#endif    /* calculate the space that we actually need for everything */    ptr_sz    = count * sizeof(DLOOP_Dataloop *);    extent_sz = count * sizeof(DLOOP_Offset);    blk_sz    = count * sizeof(DLOOP_Count);    off_sz    = count * sizeof(DLOOP_Offset);    basic_sz  = sizeof(DLOOP_Dataloop);    /* pad everything that we're going to allocate */    epsilon = loop_sz % align_sz;    if (epsilon) loop_sz += align_sz - epsilon;    epsilon = off_sz % align_sz;    if (epsilon) off_sz += align_sz - epsilon;    epsilon = blk_sz % align_sz;    if (epsilon) blk_sz += align_sz - epsilon;    epsilon = ptr_sz % align_sz;    if (epsilon) ptr_sz += align_sz - epsilon;    epsilon = extent_sz % align_sz;    if (epsilon) extent_sz += align_sz - epsilon;    epsilon = basic_sz % align_sz;    if (epsilon) basic_sz += align_sz - epsilon;    /* note: we pad *each* basic type dataloop, because the     * code used to create them assumes that we're going to     * do that.     */    new_loop_sz += loop_sz + off_sz + blk_sz + ptr_sz +	extent_sz + (basic_ct * basic_sz) + old_loop_sz;    /* allocate space */    new_loop = (DLOOP_Dataloop *) DLOOP_Malloc(new_loop_sz);    if (new_loop == NULL) {	*new_loop_p = NULL;	return;    }#ifdef DLOOP_DEBUG_MEMORY    DLOOP_dbg_printf("DLOOP_Dataloop_struct_alloc: new loop @ %x (tot sz = %d, loop = %d, off = %d, blk = %d, ptr = %d, extent = %d, basics = %d, old = %d)\n",		     (int) new_loop,		     new_loop_sz,		     loop_sz,		     off_sz,		     blk_sz,		     ptr_sz,		     extent_sz,		     basic_sz,		     old_loop_sz);#endif    /* set all the pointers in the new dataloop structure */    new_loop->loop_params.s_t.dataloop_array = (DLOOP_Dataloop **)	(((char *) new_loop) + loop_sz);    new_loop->loop_params.s_t.blocksize_array =	(DLOOP_Count *)	(((char *) new_loop) + loop_sz + ptr_sz);    new_loop->loop_params.s_t.offset_array = (DLOOP_Offset *)	(((char *) new_loop) + loop_sz + ptr_sz + blk_sz);    new_loop->loop_params.s_t.el_extent_array =	(DLOOP_Offset *)	(((char *) new_loop) + loop_sz + ptr_sz + blk_sz + off_sz);    *old_loop_p = (DLOOP_Dataloop *)	(((char *) new_loop) + loop_sz + ptr_sz + blk_sz + off_sz + extent_sz);    *new_loop_p = new_loop;    *new_loop_sz_p = new_loop_sz;    return;}/*@  Dataloop_dup - make a copy of a dataloop  Returns 0 on success, -1 on failure.@*/void PREPEND_PREFIX(Dataloop_dup)(DLOOP_Dataloop *old_loop,				  int old_loop_sz,				  DLOOP_Dataloop **new_loop_p){    DLOOP_Dataloop *new_loop;    DLOOP_Assert(old_loop != NULL);    DLOOP_Assert(old_loop_sz > 0);        new_loop = (DLOOP_Dataloop *) DLOOP_Malloc(old_loop_sz);    if (new_loop == NULL) {	*new_loop_p = NULL;	return;    }    PREPEND_PREFIX(Dataloop_copy)(new_loop, old_loop, old_loop_sz);    *new_loop_p = new_loop;    return;}/*@  Dataloop_stream_size - return the size of the data described by the dataloop  Input Parameters:+ dl_p   - pointer to dataloop for which we will return the size- sizefn - function for determining size of types in the corresponding stream           (passing NULL will instead result in el_size values being used)@*/DLOOP_OffsetPREPEND_PREFIX(Dataloop_stream_size)(struct DLOOP_Dataloop *dl_p,				     DLOOP_Offset (*sizefn)(DLOOP_Type el_type)){    DLOOP_Offset ret;    DLOOP_Offset tmp_sz, tmp_ct = 1;     for (;;)    {        if ((dl_p->kind & DLOOP_KIND_MASK) == DLOOP_KIND_STRUCT)        {            int i;                        tmp_sz = 0;            for (i = 0; i < dl_p->loop_params.s_t.count; i++)            {                tmp_sz += dl_p->loop_params.s_t.blocksize_array[i] *                    PREPEND_PREFIX(Dataloop_stream_size)(dl_p->loop_params.s_t.dataloop_array[i], sizefn);            }            return tmp_sz * tmp_ct;        }        switch (dl_p->kind & DLOOP_KIND_MASK) {        case DLOOP_KIND_CONTIG:            tmp_ct *= dl_p->loop_params.c_t.count;#ifdef DLOOP_DEBUG_SIZE            DLOOP_dbg_printf("stream_size: contig: ct = %d; new tot_ct = %d\n",                             (int) dl_p->loop_params.c_t.count, (int) tmp_ct);#endif            break;        case DLOOP_KIND_VECTOR:            tmp_ct *= dl_p->loop_params.v_t.count * dl_p->loop_params.v_t.blocksize;#ifdef DLOOP_DEBUG_SIZE            DLOOP_dbg_printf("stream_size: vector: ct = %d; blk = %d; new tot_ct = %d\n",                             (int) dl_p->loop_params.v_t.count,                             (int) dl_p->loop_params.v_t.blocksize,                             (int) tmp_ct);#endif            break;        case DLOOP_KIND_BLOCKINDEXED:            tmp_ct *= dl_p->loop_params.bi_t.count * dl_p->loop_params.bi_t.blocksize;#ifdef DLOOP_DEBUG_SIZE            DLOOP_dbg_printf("stream_size: blkindexed: blks = %d; new tot_ct = %d\n",                             (int) dl_p->loop_params.bi_t.count *                             (int) dl_p->loop_params.bi_t.blocksize,                             (int) tmp_ct);#endif            break;        case DLOOP_KIND_INDEXED:            tmp_ct *= dl_p->loop_params.i_t.total_blocks;#ifdef DLOOP_DEBUG_SIZE            DLOOP_dbg_printf("stream_size: contig: blks = %d; new tot_ct = %d\n",                             (int) dl_p->loop_params.i_t.total_blocks,                             (int) tmp_ct);#endif            break;        default:            /* --BEGIN ERROR HANDLING-- */            DLOOP_Assert(0);            break;            /* --END ERROR HANDLING-- */        }        if (dl_p->kind & DLOOP_FINAL_MASK) break;        else {            DLOOP_Assert(dl_p->loop_params.cm_t.dataloop != NULL);            dl_p = dl_p->loop_params.cm_t.dataloop;        }    }    /* call fn for size using bottom type, or use size if fnptr is NULL */    tmp_sz = ((sizefn) ? sizefn(dl_p->el_type) : dl_p->el_size);    return tmp_sz * tmp_ct;}/* --BEGIN ERROR HANDLING-- *//*@  Dataloop_print - dump a dataloop tree to stdout for debugging  purposes  Input Parameters:+ dataloop - root of tree to dump- depth - starting depth; used to help keep up with where we are in the tree@*/void PREPEND_PREFIX(Dataloop_print)(struct DLOOP_Dataloop *dataloop,				    int depth){    int i;    if (dataloop == NULL)    {        DLOOP_dbg_printf("dataloop is NULL (probably basic type)\n");        return;    }    DLOOP_dbg_printf("loc=%p, treedepth=%d, kind=%d, el_extent=%ld\n",		     dataloop, (int) depth, (int) dataloop->kind, (long) dataloop->el_extent);    switch(dataloop->kind & DLOOP_KIND_MASK) {	case DLOOP_KIND_CONTIG:	    DLOOP_dbg_printf("\tCONTIG: count=%d, datatype=%p\n", 			     (int) dataloop->loop_params.c_t.count, 			     dataloop->loop_params.c_t.dataloop);	    if (!(dataloop->kind & DLOOP_FINAL_MASK))		PREPEND_PREFIX(Dataloop_print)(dataloop->loop_params.c_t.dataloop, depth+1);	    break;	case DLOOP_KIND_VECTOR:	    DLOOP_dbg_printf("\tVECTOR: count=%d, blksz=%d, stride=%d, datatype=%p\n",			     (int) dataloop->loop_params.v_t.count, 			     (int) dataloop->loop_params.v_t.blocksize, 			     (int) dataloop->loop_params.v_t.stride,			     dataloop->loop_params.v_t.dataloop);	    if (!(dataloop->kind & DLOOP_FINAL_MASK))		PREPEND_PREFIX(Dataloop_print)(dataloop->loop_params.v_t.dataloop, depth+1);	    break;	case DLOOP_KIND_BLOCKINDEXED:	    DLOOP_dbg_printf("\tBLOCKINDEXED: count=%d, blksz=%d, datatype=%p\n",			     (int) dataloop->loop_params.bi_t.count, 			     (int) dataloop->loop_params.bi_t.blocksize, 			     dataloop->loop_params.bi_t.dataloop);	    /* print out offsets later */	    if (!(dataloop->kind & DLOOP_FINAL_MASK))		PREPEND_PREFIX(Dataloop_print)(dataloop->loop_params.bi_t.dataloop, depth+1);	    break;	case DLOOP_KIND_INDEXED:	    DLOOP_dbg_printf("\tINDEXED: count=%d, datatype=%p\n",			     (int) dataloop->loop_params.i_t.count,			     dataloop->loop_params.i_t.dataloop);	    /* print out blocksizes and offsets later */	    if (!(dataloop->kind & DLOOP_FINAL_MASK))		PREPEND_PREFIX(Dataloop_print)(dataloop->loop_params.i_t.dataloop, depth+1);	    break;	case DLOOP_KIND_STRUCT:	    DLOOP_dbg_printf("\tSTRUCT: count=%d\n", (int) dataloop->loop_params.s_t.count);	    DLOOP_dbg_printf("\tblocksizes:\n");	    for (i=0; i < dataloop->loop_params.s_t.count; i++)		DLOOP_dbg_printf("\t\t%d\n", (int) dataloop->loop_params.s_t.blocksize_array[i]);	    DLOOP_dbg_printf("\toffsets:\n");	    for (i=0; i < dataloop->loop_params.s_t.count; i++)		DLOOP_dbg_printf("\t\t%d\n", (int) dataloop->loop_params.s_t.offset_array[i]);	    DLOOP_dbg_printf("\tdatatypes:\n");	    for (i=0; i < dataloop->loop_params.s_t.count; i++)		DLOOP_dbg_printf("\t\t%p\n", dataloop->loop_params.s_t.dataloop_array[i]);	    if (dataloop->kind & DLOOP_FINAL_MASK) break;	    for (i=0; i < dataloop->loop_params.s_t.count; i++) {		PREPEND_PREFIX(Dataloop_print)(dataloop->loop_params.s_t.dataloop_array[i],depth+1);	    }	    break;	default:	    DLOOP_Assert(0);	    break;    }    return;}/* --END ERROR HANDLING-- */

⌨️ 快捷键说明

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