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

📄 mpid_nem_lmt.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2006 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "mpid_nem_impl.h"#define set_request_info(rreq_, pkt_, msg_type_)		\{								\    (rreq_)->status.MPI_SOURCE = (pkt_)->match.rank;		\    (rreq_)->status.MPI_TAG = (pkt_)->match.tag;		\    (rreq_)->status.count = (pkt_)->data_sz;			\    (rreq_)->dev.sender_req_id = (pkt_)->sender_req_id;		\    (rreq_)->dev.recv_data_sz = (pkt_)->data_sz;		\    MPIDI_Request_set_seqnum((rreq_), (pkt_)->seqnum);		\    MPIDI_Request_set_msg_type((rreq_), (msg_type_));		\}/* request completion actions */static int do_cts(MPIDI_VC_t *vc, MPID_Request *rreq, int *complete);static int do_send(MPIDI_VC_t *vc, MPID_Request *rreq, int *complete);static int do_cookie(MPIDI_VC_t *vc, MPID_Request *rreq, int *complete);/* packet handlers */static int pkt_RTS_handler(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, MPIDI_msg_sz_t *buflen, MPID_Request **rreqp);static int pkt_CTS_handler(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, MPIDI_msg_sz_t *buflen, MPID_Request **rreqp);static int pkt_DONE_handler(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, MPIDI_msg_sz_t *buflen, MPID_Request **rreqp);static int pkt_COOKIE_handler(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, MPIDI_msg_sz_t *buflen, MPID_Request **rreqp);#undef FUNCNAME#define FUNCNAME MPID_nem_lmt_pkthandler_init#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPID_nem_lmt_pkthandler_init(MPIDI_CH3_PktHandler_Fcn *pktArray[], int arraySize){    int mpi_errno = MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_LMT_PKTHANDLER_INIT);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_LMT_PKTHANDLER_INIT);    /* Check that the array is large enough */    if (arraySize <= MPIDI_NEM_PKT_END) {	MPIU_ERR_SETFATALANDJUMP(mpi_errno,MPI_ERR_INTERN, "**ch3|pktarraytoosmall");    }    pktArray[MPIDI_NEM_PKT_LMT_RTS] = pkt_RTS_handler;    pktArray[MPIDI_NEM_PKT_LMT_CTS] = pkt_CTS_handler;    pktArray[MPIDI_NEM_PKT_LMT_DONE] = pkt_DONE_handler;    pktArray[MPIDI_NEM_PKT_LMT_COOKIE] = pkt_COOKIE_handler; fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_LMT_PKTHANDLER_INIT);    return mpi_errno; fn_fail:    goto fn_exit;}/* MPID_nem_lmt_RndvSend - Send a request to perform a rendezvous send */#undef FUNCNAME#define FUNCNAME MPID_nem_lmt_RndvSend#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPID_nem_lmt_RndvSend(MPID_Request **sreq_p, const void * buf, int count, MPI_Datatype datatype, int dt_contig,                          MPIDI_msg_sz_t data_sz, MPI_Aint dt_true_lb, int rank, int tag, MPID_Comm * comm, int context_offset){    int mpi_errno = MPI_SUCCESS;    MPIDI_CH3_Pkt_t upkt;    MPID_nem_pkt_lmt_rts_t * const rts_pkt = (MPID_nem_pkt_lmt_rts_t *)&upkt;    MPIDI_VC_t *vc;    MPID_Request *sreq =*sreq_p;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_LMT_RNDVSEND);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_LMT_RNDVSEND);    MPIDI_Comm_get_vc(comm, rank, &vc);    /* if the lmt functions are not set, fall back to the default rendezvous code */    if (((MPIDI_CH3I_VC *)vc->channel_private)->lmt_initiate_lmt == NULL)    {        mpi_errno = MPIDI_CH3_RndvSend(sreq_p, buf, count, datatype, dt_contig, data_sz, dt_true_lb, rank, tag, comm, context_offset);        if (mpi_errno) MPIU_ERR_POP(mpi_errno);        goto fn_exit;    }    MPIU_DBG_MSG_D(CH3_OTHER,VERBOSE,		   "sending lmt RTS, data_sz=" MPIDI_MSG_SZ_FMT, data_sz);    sreq->partner_request = NULL;    sreq->ch.lmt_tmp_cookie.MPID_IOV_LEN = 0;	    MPIDI_Pkt_init(rts_pkt, MPIDI_NEM_PKT_LMT_RTS);    rts_pkt->match.rank	      = comm->rank;    rts_pkt->match.tag	      = tag;    rts_pkt->match.context_id = comm->context_id + context_offset;    rts_pkt->sender_req_id    = sreq->handle;    rts_pkt->data_sz	      = data_sz;    MPIDI_VC_FAI_send_seqnum(vc, seqnum);    MPIDI_Pkt_set_seqnum(rts_pkt, seqnum);    MPIDI_Request_set_seqnum(sreq, seqnum);    mpi_errno = ((MPIDI_CH3I_VC *)vc->channel_private)->lmt_initiate_lmt(vc, &upkt, sreq);    if (mpi_errno) MPIU_ERR_POP(mpi_errno); fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_LMT_RNDVSEND);    return mpi_errno; fn_fail:    goto fn_exit;}/* * This routine processes a rendezvous message once the message is matched. * It is used in mpid_recv and mpid_irecv. */#undef FUNCNAME#define FUNCNAME MPID_nem_lmt_RndvRecv#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPID_nem_lmt_RndvRecv(MPIDI_VC_t *vc, MPID_Request *rreq){    int mpi_errno = MPI_SUCCESS;    int complete = 0;    MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_LMT_RNDVRECV);    MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_LMT_RNDVRECV);    /* if the lmt functions are not set, fall back to the default rendezvous code */    if (((MPIDI_CH3I_VC *)vc->channel_private)->lmt_initiate_lmt == NULL)    {        mpi_errno = MPIDI_CH3_RecvRndv(vc, rreq);        if (mpi_errno) MPIU_ERR_POP(mpi_errno);        goto fn_exit;    }    MPIU_DBG_MSG(CH3_OTHER,VERBOSE, "lmt RTS in the request");    mpi_errno = do_cts(vc, rreq, &complete);    if (mpi_errno) MPIU_ERR_POP(mpi_errno);    MPIU_Assert(complete); fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_LMT_RNDVRECV);    return mpi_errno; fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME pkt_RTS_handler#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int pkt_RTS_handler(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, MPIDI_msg_sz_t *buflen, MPID_Request **rreqp){    int mpi_errno = MPI_SUCCESS;    MPID_Request * rreq;    int found;    MPID_nem_pkt_lmt_rts_t * const rts_pkt = (MPID_nem_pkt_lmt_rts_t *)pkt;    char *data_buf;    MPIDI_msg_sz_t data_len;    MPIU_CHKPMEM_DECL(1);    MPIDI_STATE_DECL(MPID_STATE_PKT_RTS_HANDLER);    MPIDI_FUNC_ENTER(MPID_STATE_PKT_RTS_HANDLER);    MPIU_DBG_MSG_FMT(CH3_OTHER,VERBOSE,(MPIU_DBG_FDEST, "received LMT RTS pkt, sreq=0x%08x, rank=%d, tag=%d, context=%d, data_sz=" MPIDI_MSG_SZ_FMT,                                        rts_pkt->sender_req_id, rts_pkt->match.rank, rts_pkt->match.tag, rts_pkt->match.context_id,                                        rts_pkt->data_sz));    rreq = MPIDI_CH3U_Recvq_FDP_or_AEU(&rts_pkt->match, &found);    MPIU_ERR_CHKANDJUMP(rreq == NULL, mpi_errno, MPI_ERR_OTHER, "**nomemreq");    set_request_info(rreq, rts_pkt, MPIDI_REQUEST_RNDV_MSG);    rreq->ch.lmt_req_id = rts_pkt->sender_req_id;    rreq->ch.lmt_data_sz = rts_pkt->data_sz;    data_len = *buflen - sizeof(MPIDI_CH3_Pkt_t);    data_buf = (char *)pkt + sizeof(MPIDI_CH3_Pkt_t);    if (rts_pkt->cookie_len == 0)    {        rreq->ch.lmt_tmp_cookie.MPID_IOV_LEN = 0;        rreq->dev.iov_count = 0;        *buflen = sizeof(MPIDI_CH3_Pkt_t);        *rreqp = NULL;        if (found)        {            /* there's no cookie to receive, and we found a match, so handle the cts directly */            int complete;            MPIU_DBG_MSG(CH3_OTHER,VERBOSE,"posted request found");            mpi_errno = do_cts(vc, rreq, &complete);            if (mpi_errno) MPIU_ERR_POP (mpi_errno);            MPIU_Assert (complete);        }        else        {            MPIU_DBG_MSG(CH3_OTHER,VERBOSE,"unexpected request allocated");            rreq->dev.OnDataAvail = 0;            MPIDI_CH3_Progress_signal_completion();        }    }    else    {        /* set for the cookie to be received into the tmp_cookie in the request */        MPIU_CHKPMEM_MALLOC(rreq->ch.lmt_tmp_cookie.MPID_IOV_BUF, char *, rts_pkt->cookie_len, mpi_errno, "tmp cookie buf");        rreq->ch.lmt_tmp_cookie.MPID_IOV_LEN = rts_pkt->cookie_len;        /* if all data has been received, copy it here, otherwise let channel do the copy */        if (data_len >= rts_pkt->cookie_len)        {            MPID_NEM_MEMCPY(rreq->ch.lmt_tmp_cookie.MPID_IOV_BUF, data_buf, rts_pkt->cookie_len);            *rreqp = NULL;            *buflen = sizeof(MPIDI_CH3_Pkt_t) + rts_pkt->cookie_len;        }        else        {            rreq->dev.iov[0] = rreq->ch.lmt_tmp_cookie;            rreq->dev.iov_count = 1;            *rreqp = rreq;            *buflen = sizeof(MPIDI_CH3_Pkt_t);            if (found)            {                rreq->dev.OnDataAvail = do_cts;            }            else            {                MPIU_DBG_MSG(CH3_OTHER,VERBOSE,"unexpected request allocated");                rreq->dev.OnDataAvail = 0;                MPIDI_CH3_Progress_signal_completion();            }        }    }    MPIU_CHKPMEM_COMMIT(); fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_PKT_RTS_HANDLER);    return mpi_errno; fn_fail:    MPIU_CHKPMEM_REAP();    goto fn_exit;}#undef FUNCNAME#define FUNCNAME pkt_CTS_handler#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int pkt_CTS_handler(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, MPIDI_msg_sz_t *buflen, MPID_Request **rreqp){    MPID_nem_pkt_lmt_cts_t * const cts_pkt = (MPID_nem_pkt_lmt_cts_t *)pkt;    MPID_Request *sreq;    MPID_Request *rts_sreq;    char *data_buf;    MPIDI_msg_sz_t data_len;    int mpi_errno = MPI_SUCCESS;    MPIU_CHKPMEM_DECL(1);    MPIDI_STATE_DECL(MPID_STATE_PKT_CTS_HANDLER);    MPIDI_FUNC_ENTER(MPID_STATE_PKT_CTS_HANDLER);    MPIU_DBG_MSG(CH3_OTHER,VERBOSE,"received rndv CTS pkt");    data_len = *buflen - sizeof(MPIDI_CH3_Pkt_t);    data_buf = (char *)pkt + sizeof(MPIDI_CH3_Pkt_t);    MPID_Request_get_ptr(cts_pkt->sender_req_id, sreq);    sreq->ch.lmt_req_id = cts_pkt->receiver_req_id;    sreq->ch.lmt_data_sz = cts_pkt->data_sz;    /* Release the RTS request if one exists.       MPID_Request_fetch_and_clear_rts_sreq() needs to be atomic to       prevent cancel send from cancelling the wrong (future) request.       If MPID_Request_fetch_and_clear_rts_sreq() returns a NULL

⌨️ 快捷键说明

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