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

📄 ch3u_buffer.c

📁 刚才是说明 现在是安装程序在 LINUX环境下进行编程的MPICH安装文件
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "mpidimpl.h"#if !defined(MPIDI_COPY_BUFFER_SZ)#define MPIDI_COPY_BUFFER_SZ 16384#endif#undef FUNCNAME#define FUNCNAME MPIDI_CH3U_Buffer_copy#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)void MPIDI_CH3U_Buffer_copy(    const void * const sbuf, int scount, MPI_Datatype sdt, int * smpi_errno,    void * const rbuf, int rcount, MPI_Datatype rdt, MPIDI_msg_sz_t * rsz,    int * rmpi_errno){    int sdt_contig;    int rdt_contig;    MPIDI_msg_sz_t sdata_sz;    MPIDI_msg_sz_t rdata_sz;    MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3U_BUFFER_COPY);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3U_BUFFER_COPY);    *smpi_errno = MPI_SUCCESS;    *rmpi_errno = MPI_SUCCESS;    MPIDI_CH3U_Datatype_get_info(scount, sdt, sdt_contig, sdata_sz);    MPIDI_CH3U_Datatype_get_info(rcount, rdt, rdt_contig, rdata_sz);    if (sdata_sz == 0)    {	*rsz = 0;	goto fn_exit;    }        if (sdata_sz > rdata_sz)    {	MPIDI_DBG_PRINTF((15, FCNAME, "message truncated, sdata_sz=" MPIDI_MSG_SZ_FMT " rdata_sz=", MPIDI_MSG_SZ_FMT,			  sdata_sz, rdata_sz));	sdata_sz = rdata_sz;	*rmpi_errno = MPI_ERR_TRUNCATE;    }        if (sdt_contig && rdt_contig)    {	memcpy(rbuf, sbuf, sdata_sz);	*rsz = sdata_sz;    }    else if (sdt_contig)    {	MPID_Segment seg;	MPIDI_msg_sz_t last;	MPID_Segment_init(rbuf, rcount, rdt, &seg);	last = sdata_sz;	MPIDI_DBG_PRINTF((40, FCNAME, "pre-unpack last=" MPIDI_MSG_SZ_FMT, last ));	MPID_Segment_unpack(&seg, 0, &last, sbuf);	MPIDI_DBG_PRINTF((40, FCNAME, "pre-unpack last=" MPIDI_MSG_SZ_FMT, last ));	if (last != sdata_sz)	{	    *smpi_errno = MPI_ERR_UNKNOWN;	    *rmpi_errno = MPI_ERR_UNKNOWN;	}	*rsz = last;    }    else if (rdt_contig)    {	MPID_Segment seg;	MPIDI_msg_sz_t last;	MPID_Segment_init(sbuf, scount, sdt, &seg);	last = sdata_sz;	MPIDI_DBG_PRINTF((40, FCNAME, "pre-pack last=" MPIDI_MSG_SZ_FMT, last ));	MPID_Segment_pack(&seg, 0, &last, rbuf);	MPIDI_DBG_PRINTF((40, FCNAME, "post-pack last=" MPIDI_MSG_SZ_FMT, last ));	if (last != sdata_sz)	{	    *smpi_errno = MPI_ERR_UNKNOWN;	    *rmpi_errno = MPI_ERR_UNKNOWN;	}	*rsz = last;    }    else    {	char * buf;	MPIDI_msg_sz_t buf_off;	MPID_Segment sseg;	MPIDI_msg_sz_t sfirst;	MPID_Segment rseg;	MPIDI_msg_sz_t rfirst;	buf = MPIU_Malloc(MPIDI_COPY_BUFFER_SZ);	if (buf == NULL)	{	    MPIDI_DBG_PRINTF((40, FCNAME, "SRBuf allocation failure"));	    *smpi_errno = MPIR_ERR_MEMALLOCFAILED;	    *rmpi_errno = MPIR_ERR_MEMALLOCFAILED;	    *rsz = 0;	    goto fn_exit;	}	MPID_Segment_init(sbuf, scount, sdt, &sseg);	MPID_Segment_init(rbuf, rcount, rdt, &rseg);	sfirst = 0;	rfirst = 0;	buf_off = 0;		for(;;)	{	    MPIDI_msg_sz_t last;	    char * buf_end;	    if (sdata_sz - sfirst > MPIDI_COPY_BUFFER_SZ - buf_off)	    {		last = sfirst + (MPIDI_COPY_BUFFER_SZ - buf_off);	    }	    else	    {		last = sdata_sz;	    }	    	    MPIDI_DBG_PRINTF((40, FCNAME, "pre-pack first=" MPIDI_MSG_SZ_FMT ", last=" MPIDI_MSG_SZ_FMT, sfirst, last ));	    MPID_Segment_pack(&sseg, sfirst, &last, buf + buf_off);	    MPIDI_DBG_PRINTF((40, FCNAME, "post-pack first=" MPIDI_MSG_SZ_FMT ", last=" MPIDI_MSG_SZ_FMT, sfirst, last ));	    assert(last > sfirst);	    	    buf_end = buf + buf_off + (last - sfirst);	    sfirst = last;	    	    MPIDI_DBG_PRINTF((40, FCNAME, "pre-unpack first=" MPIDI_MSG_SZ_FMT ", last=" MPIDI_MSG_SZ_FMT, rfirst, last ));	    MPID_Segment_unpack(&rseg, rfirst, &last, buf);	    MPIDI_DBG_PRINTF((40, FCNAME, "post-unpack first=" MPIDI_MSG_SZ_FMT ", last=" MPIDI_MSG_SZ_FMT, rfirst, last ));	    assert(last > rfirst);	    rfirst = last;	    if (rfirst == sdata_sz)	    {		/* successful completion */		break;	    }	    	    if (sfirst == sdata_sz)	    {		/* datatype mismatch -- remaining bytes could not be unpacked */		*rmpi_errno = MPI_ERR_UNKNOWN;		break;	    }	    	    buf_off = sfirst - rfirst;	    if (buf_off > 0)	    {		MPIDI_DBG_PRINTF((40, FCNAME, "moved " MPIDI_MSG_SZ_FMT " bytes to the beginning of the tmp buffer", buf_off));		memmove(buf, buf_end - buf_off, buf_off);	    }	}	*rsz = rfirst;	MPIU_Free(buf);    }  fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3U_BUFFER_COPY);}

⌨️ 快捷键说明

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