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

📄 mpidi_isend_self.c

📁 fortran并行计算包
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "mpidimpl.h"/* FIXME: Explain this function *//* FIXME: should there be a simpler version of this for short messages,    particularly contiguous ones?  See also the FIXME about buffering   short messages */#undef FUNCNAME#define FUNCNAME MPIDI_Isend_self#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_Isend_self(const void * buf, int count, MPI_Datatype datatype, int rank, int tag, MPID_Comm * comm, int context_offset,		     int type, MPID_Request ** request){    MPIDI_Message_match match;    MPID_Request * sreq;    MPID_Request * rreq;    MPIDI_VC_t * vc;#if defined(MPID_USE_SEQUENCE_NUMBERS)    MPID_Seqnum_t seqnum;#endif        int found;    int mpi_errno = MPI_SUCCESS;	    MPIU_DBG_MSG(CH3_OTHER,VERBOSE,"sending message to self");	    MPIDI_Request_create_sreq(sreq, mpi_errno, goto fn_exit);    MPIDI_Request_set_type(sreq, type);    MPIDI_Request_set_msg_type(sreq, MPIDI_REQUEST_SELF_MSG);        match.rank = rank;    match.tag = tag;    match.context_id = comm->context_id + context_offset;    rreq = MPIDI_CH3U_Recvq_FDP_or_AEU(&match, &found);    /* --BEGIN ERROR HANDLING-- */    if (rreq == NULL)    {	MPIU_Object_set_ref(sreq, 0);	MPIDI_CH3_Request_destroy(sreq);	sreq = NULL;	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_NO_MEM, "**nomem", 0);	goto fn_exit;    }    /* --END ERROR HANDLING-- */    MPIDI_Comm_get_vc(comm, rank, &vc);    MPIDI_VC_FAI_send_seqnum(vc, seqnum);    MPIDI_Request_set_seqnum(sreq, seqnum);    MPIDI_Request_set_seqnum(rreq, seqnum);        rreq->status.MPI_SOURCE = rank;    rreq->status.MPI_TAG = tag;        if (found)    {	MPIDI_msg_sz_t data_sz;		MPIU_DBG_MSG(CH3_OTHER,VERBOSE,		     "found posted receive request; copying data");	    	MPIDI_CH3U_Buffer_copy(buf, count, datatype, &sreq->status.MPI_ERROR,			       rreq->dev.user_buf, rreq->dev.user_count, rreq->dev.datatype, &data_sz, &rreq->status.MPI_ERROR);	rreq->status.count = (int)data_sz;	MPID_REQUEST_SET_COMPLETED(rreq);	MPID_Request_release(rreq);	/* sreq has never been seen by the user or outside this thread, so it is safe to reset ref_count and cc */	MPIU_Object_set_ref(sreq, 1);	sreq->cc = 0;    }    else    {	if (type != MPIDI_REQUEST_TYPE_RSEND)	{	    int dt_sz;		    /* FIXME: Insert code here to buffer small sends in a temporary buffer? */	    MPIU_DBG_MSG(CH3_OTHER,VERBOSE,          "added receive request to unexpected queue; attaching send request");	    if (HANDLE_GET_KIND(datatype) != HANDLE_KIND_BUILTIN)	    {		MPID_Datatype_get_ptr(datatype, sreq->dev.datatype_ptr);		MPID_Datatype_add_ref(sreq->dev.datatype_ptr);	    }	    rreq->partner_request = sreq;	    rreq->dev.sender_req_id = sreq->handle;	    MPID_Datatype_get_size_macro(datatype, dt_sz);	    rreq->status.count = count * dt_sz;	}	else	{	    /* --BEGIN ERROR HANDLING-- */	    MPIU_DBG_MSG(CH3_OTHER,TYPICAL,			 "ready send unable to find matching recv req");	    sreq->status.MPI_ERROR = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,							  "**rsendnomatch", "**rsendnomatch %d %d", rank, tag);	    rreq->status.MPI_ERROR = sreq->status.MPI_ERROR;	    	    rreq->partner_request = NULL;	    rreq->dev.sender_req_id = MPI_REQUEST_NULL;	    rreq->status.count = 0;	    	    /* sreq has never been seen by the user or outside this thread, so it is safe to reset ref_count and cc */	    MPIU_Object_set_ref(sreq, 1);	    sreq->cc = 0;	    /* --END ERROR HANDLING-- */	}	    	MPIDI_Request_set_msg_type(rreq, MPIDI_REQUEST_SELF_MSG);	MPIDI_CH3_Progress_signal_completion();    }  fn_exit:    *request = sreq;    return mpi_errno;}

⌨️ 快捷键说明

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