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

📄 unordered.c

📁 fortran并行计算包
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. *//* * This is code for handling unordered delivery of packets.  It is currently  * unused but saved for reference. */#if defined(MPIDI_CH3_MSGS_UNORDERED)int MPIDI_CH3U_Handle_unordered_recv_pkt(MPIDI_VC_t * vc, MPIDI_CH3_Pkt_t * pkt);#define MPIDI_CH3U_Handle_unordered_recv_pkt MPIDI_CH3U_Handle_recv_pkt#else#define MPIDI_CH3U_Handle_ordered_recv_pkt MPIDI_CH3U_Handle_recv_pkt #endif#if defined(MPIDI_CH3_MSGS_UNORDERED)#define MPIDI_CH3U_Pkt_send_container_alloc() (MPIU_Malloc(sizeof(MPIDI_CH3_Pkt_send_container_t)))#define MPIDI_CH3U_Pkt_send_container_free(pc_) MPIU_Free(pc_)#undef FUNCNAME#define FUNCNAME MPIDI_CH3U_Handle_unordered_recv_pkt#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3U_Handle_unordered_recv_pkt(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t * pkt,					 MPID_Request ** rreqp){    int mpi_errno = MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3U_HANDLE_UNORDERED_RECV_PKT);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3U_HANDLE_UNORDERED_RECV_PKT);    /* FIXME: This should probably be *rreqp = NULL? */    rreqp = NULL;        switch(pkt->type)    {	case MPIDI_CH3_PKT_EAGER_SEND:	case MPIDI_CH3_PKT_EAGER_SYNC_SEND:	case MPIDI_CH3_PKT_READY_SEND:	case MPIDI_CH3_PKT_RNDV_REQ_TO_SEND:	{	    MPIDI_CH3_Pkt_send_t * send_pkt = (MPIDI_CH3_Pkt_send_t *) pkt;	    MPIDI_CH3_Pkt_send_container_t * pc_cur;	    MPIDI_CH3_Pkt_send_container_t * pc_last;	    	    MPIU_DBG_MSG(CH3_OTHER,VERBOSE,			 "received (potentially) out-of-order send pkt");	    MPIU_DBG_MSG_FMT(CH3_OTHER,VERBOSE,(MPIU_DBG_FDEST,	          "rank=%d, tag=%d, context=%d seqnum=%d",		  send_pkt->match.rank, send_pkt->match.tag, 		  send_pkt->match.context_id, send_pkt->seqnum));	    MPIU_DBG_MSG_FMAT(CH3_OTHER,VERBOSE,(MPIU_DBG_FDEST,              "vc - seqnum_send=%d seqnum_recv=%d reorder_msg_queue=0x%08lx",	      vc->seqnum_send, vc->seqnum_recv, 	      (unsigned long) vc->msg_reorder_queue));	    	    if (send_pkt->seqnum == vc->seqnum_recv)	    {		mpi_errno = MPIDI_CH3U_Handle_ordered_recv_pkt(vc, pkt, rreqp);		/* --BEGIN ERROR HANDLING-- */		if (mpi_errno != MPI_SUCCESS)		{		    goto fn_exit;		}		/* --END ERROR HANDLING-- */		vc->seqnum_recv++;		pc_cur = vc->msg_reorder_queue;		while(pc_cur != NULL && vc->seqnum_recv == pc_cur->pkt.seqnum)		{		    pkt = (MPIDI_CH3_Pkt_t *) &pc_cur->pkt;		    mpi_errno = MPIDI_CH3U_Handle_ordered_recv_pkt(vc, pkt, rreqp);		    /* --BEGIN ERROR HANDLING-- */		    if (mpi_errno != MPI_SUCCESS)		    {			mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER,							 "**ch3|pktordered", 0);			goto fn_exit;		    }		    /* --END ERROR HANDLING-- */		    vc->seqnum_recv++;		    pc_last = pc_cur;		    pc_cur = pc_cur->next;		    MPIDI_CH3U_Pkt_send_container_free(pc_last);		}		vc->msg_reorder_queue = pc_cur;	    }	    else	    {		MPIDI_CH3_Pkt_send_container_t * pc_new;			/* allocate container and copy packet */		pc_new = MPIDI_CH3U_Pkt_send_container_alloc();		/* --BEGIN ERROR HANDLING-- */		if (pc_new == NULL)		{		    mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER,						     "**ch3|nopktcontainermem", 0);		    goto fn_exit;		}		/* --END ERROR HANDLING-- */		pc_new->pkt = *send_pkt;		/* insert packet into reorder queue */		pc_last = NULL;		pc_cur = vc->msg_reorder_queue;		while (pc_cur != NULL)		{		    /* the current recv seqnum is subtracted from both the 		       seqnums prior to comparision so as to remove any wrap		       around effects. */		    if (pc_new->pkt.seqnum - vc->seqnum_recv < 			pc_cur->pkt.seqnum - vc->seqnum_recv)		    {			break;		    }		    pc_last = pc_cur;		    pc_cur = pc_cur->next;		}		if (pc_last == NULL)		{		    pc_new->next = pc_cur;		    vc->msg_reorder_queue = pc_new;		}		else		{		    pc_new->next = pc_cur;		    pc_last->next = pc_new;		}	    }	    break;	}	case MPIDI_CH3_PKT_CANCEL_SEND_REQ:	{	    /* --BEGIN ERROR HANDLING-- */	    /* FIXME: processing send cancel requests requires that we be 	       aware of pkts in the reorder queue */	    mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,					     "**ch3|ooocancelreq", 0);	    goto fn_exit;	    break;	    /* --END ERROR HANDLING-- */	}		default:	{	    mpi_errno = MPIDI_CH3U_Handle_ordered_recv_pkt(vc, pkt, rreqp);	    break;	}    }  fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3U_HANDLE_UNORDERED_RECV_PKT);    return mpi_errno;}#endif /* defined(MPIDI_CH3_MSGS_UNORDERED) */

⌨️ 快捷键说明

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