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

📄 mpid_nem_lmt.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
       rts_sreq, then MPID_Cancel_send() is responsible for releasing       the RTS request object. */    MPIDI_Request_fetch_and_clear_rts_sreq(sreq, &rts_sreq);    if (rts_sreq != NULL)        MPID_Request_release(rts_sreq);    if (cts_pkt->cookie_len != 0)    {        MPIU_CHKPMEM_MALLOC(sreq->ch.lmt_tmp_cookie.MPID_IOV_BUF, char *, cts_pkt->cookie_len, mpi_errno, "tmp cookie buf");        sreq->ch.lmt_tmp_cookie.MPID_IOV_LEN = cts_pkt->cookie_len;        /* if all data has been received, copy it here, otherwise let channel do the copy */        if (data_len >= cts_pkt->cookie_len)        {            MPID_NEM_MEMCPY(sreq->ch.lmt_tmp_cookie.MPID_IOV_BUF, data_buf, cts_pkt->cookie_len);            mpi_errno = ((MPIDI_CH3I_VC *)vc->channel_private)->lmt_start_send(vc, sreq, sreq->ch.lmt_tmp_cookie);            if (mpi_errno) MPIU_ERR_POP (mpi_errno);            *buflen = sizeof(MPIDI_CH3_Pkt_t) + cts_pkt->cookie_len;            *rreqp = NULL;        }        else        {            /* create a recv req and set up to receive the cookie into the sreq's tmp_cookie */            MPID_Request *rreq;            MPIDI_Request_create_rreq(rreq, mpi_errno, goto fn_fail);            /* FIXME:  where does this request get freed? */            rreq->dev.iov[0] = sreq->ch.lmt_tmp_cookie;            rreq->dev.iov_count = 1;            rreq->ch.lmt_req = sreq;            rreq->dev.OnDataAvail = do_send;            *buflen = sizeof(MPIDI_CH3_Pkt_t);            *rreqp = rreq;        }    }    else    {        MPID_IOV cookie = {0,0};        mpi_errno = ((MPIDI_CH3I_VC *)vc->channel_private)->lmt_start_send(vc, sreq, cookie);        if (mpi_errno) MPIU_ERR_POP (mpi_errno);        *buflen = sizeof(MPIDI_CH3_Pkt_t);        *rreqp = NULL;    } fn_exit:    MPIU_CHKPMEM_COMMIT();    MPIDI_FUNC_EXIT(MPID_STATE_PKT_CTS_HANDLER);    return mpi_errno; fn_fail:    MPIU_CHKPMEM_REAP();    goto fn_exit;}#undef FUNCNAME#define FUNCNAME pkt_DONE_handler#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int pkt_DONE_handler(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, MPIDI_msg_sz_t *buflen, MPID_Request **rreqp){    int mpi_errno = MPI_SUCCESS;    MPID_nem_pkt_lmt_done_t * const done_pkt = (MPID_nem_pkt_lmt_done_t *)pkt;    MPID_Request *req;    MPIDI_STATE_DECL(MPID_STATE_PKT_DONE_HANDLER);    MPIDI_FUNC_ENTER(MPID_STATE_PKT_DONE_HANDLER);    *buflen = sizeof(MPIDI_CH3_Pkt_t);    MPID_Request_get_ptr(done_pkt->req_id, req);    switch (MPIDI_Request_get_type(req))    {    case MPIDI_REQUEST_TYPE_RECV:        mpi_errno = ((MPIDI_CH3I_VC *)vc->channel_private)->lmt_done_recv(vc, req);        if (mpi_errno) MPIU_ERR_POP(mpi_errno);        break;    case MPIDI_REQUEST_TYPE_SEND:        mpi_errno = ((MPIDI_CH3I_VC *)vc->channel_private)->lmt_done_send(vc, req);        if (mpi_errno) MPIU_ERR_POP(mpi_errno);        break;    default:        MPIU_ERR_SETANDJUMP1(mpi_errno, MPI_ERR_OTHER, "**intern", "**intern %s", "unexpected request type");        break;    }    *rreqp = NULL; fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_PKT_DONE_HANDLER);    return mpi_errno; fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME pkt_COOKIE_handler#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int pkt_COOKIE_handler(MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, MPIDI_msg_sz_t *buflen, MPID_Request **rreqp){    int mpi_errno = MPI_SUCCESS;    MPID_nem_pkt_lmt_cookie_t * const cookie_pkt = (MPID_nem_pkt_lmt_cookie_t *)pkt;    MPID_Request *req;    char *data_buf;    MPIDI_msg_sz_t data_len;    MPIU_CHKPMEM_DECL(1);    MPIDI_STATE_DECL(MPID_STATE_PKT_COOKIE_HANDLER);    MPIDI_FUNC_ENTER(MPID_STATE_PKT_COOKIE_HANDLER);    data_len = *buflen - sizeof(MPIDI_CH3_Pkt_t);    data_buf = (char *)pkt + sizeof(MPIDI_CH3_Pkt_t);    MPID_Request_get_ptr(cookie_pkt->req_id, req);    if (cookie_pkt->cookie_len != 0)    {        if (data_len >= cookie_pkt->cookie_len)        {            /* call handle cookie with cookie data in receive buffer */            MPID_IOV cookie;            cookie.MPID_IOV_BUF = data_buf;            cookie.MPID_IOV_LEN = cookie_pkt->cookie_len;            mpi_errno = ((MPIDI_CH3I_VC *)vc->channel_private)->lmt_handle_cookie(vc, req, cookie);            if (mpi_errno) MPIU_ERR_POP(mpi_errno);            *rreqp = NULL;            *buflen = sizeof(MPIDI_CH3_Pkt_t) + cookie_pkt->cookie_len;        }        else        {            /* create a recv req and set up to receive the cookie into the rreq's tmp_cookie */            MPID_Request *rreq;            MPIDI_Request_create_rreq(rreq, mpi_errno, goto fn_fail);            MPIU_CHKPMEM_MALLOC(rreq->ch.lmt_tmp_cookie.MPID_IOV_BUF, char *, cookie_pkt->cookie_len, mpi_errno, "tmp cookie buf");            /* FIXME:  where does this request get freed? */            rreq->ch.lmt_tmp_cookie.MPID_IOV_LEN = cookie_pkt->cookie_len;            rreq->dev.iov[0] = rreq->ch.lmt_tmp_cookie;            rreq->dev.iov_count = 1;            rreq->ch.lmt_req = req;            rreq->dev.OnDataAvail = do_cookie;            *rreqp = rreq;            *buflen = sizeof(MPIDI_CH3_Pkt_t);        }    }    else    {        MPID_IOV cookie = {0,0};        mpi_errno = ((MPIDI_CH3I_VC *)vc->channel_private)->lmt_handle_cookie(vc, req, cookie);        if (mpi_errno) MPIU_ERR_POP(mpi_errno);        *buflen = sizeof(MPIDI_CH3_Pkt_t);        *rreqp = NULL;    } fn_exit:    MPIU_CHKPMEM_COMMIT();    MPIDI_FUNC_EXIT(MPID_STATE_PKT_COOKIE_HANDLER);    return mpi_errno; fn_fail:    MPIU_CHKPMEM_REAP();    goto fn_exit;}#undef FUNCNAME#define FUNCNAME do_cts#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int do_cts(MPIDI_VC_t *vc, MPID_Request *rreq, int *complete){    int mpi_errno = MPI_SUCCESS;    MPIDI_msg_sz_t data_sz;    int dt_contig;    MPI_Aint dt_true_lb;    MPID_Datatype * dt_ptr;    MPID_IOV s_cookie;    MPIDI_STATE_DECL(MPID_STATE_DO_CTS);    MPIDI_FUNC_ENTER(MPID_STATE_DO_CTS);    MPIU_DBG_MSG(CH3_OTHER,VERBOSE,"posted request found");    /* determine amount of data to be transfered and check for truncation */    MPIDI_Datatype_get_info(rreq->dev.user_count, rreq->dev.datatype, dt_contig, data_sz, dt_ptr, dt_true_lb);    if (rreq->ch.lmt_data_sz > data_sz)    {        MPIU_ERR_SET2(rreq->status.MPI_ERROR, MPI_ERR_TRUNCATE, "**truncate", "**truncate %d %d", rreq->ch.lmt_data_sz, data_sz);        rreq->ch.lmt_data_sz = data_sz;    }    s_cookie = rreq->ch.lmt_tmp_cookie;    mpi_errno = ((MPIDI_CH3I_VC *)vc->channel_private)->lmt_start_recv(vc, rreq, s_cookie);    if (mpi_errno) MPIU_ERR_POP(mpi_errno);    /* free cookie buffer allocated in RTS handler */    if (rreq->ch.lmt_tmp_cookie.MPID_IOV_LEN)    {        MPIU_Free(rreq->ch.lmt_tmp_cookie.MPID_IOV_BUF);        rreq->ch.lmt_tmp_cookie.MPID_IOV_LEN = 0;    }    *complete = TRUE; fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_DO_CTS);    return mpi_errno; fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME do_send#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int do_send(MPIDI_VC_t *vc, MPID_Request *rreq, int *complete){    int mpi_errno = MPI_SUCCESS;    MPID_IOV r_cookie;    MPID_Request * const sreq = rreq->ch.lmt_req;    MPIDI_STATE_DECL(MPID_STATE_DO_SEND);    MPIDI_FUNC_ENTER(MPID_STATE_DO_SEND);    r_cookie = sreq->ch.lmt_tmp_cookie;    mpi_errno = ((MPIDI_CH3I_VC *)vc->channel_private)->lmt_start_send(vc, sreq, r_cookie);    if (mpi_errno) MPIU_ERR_POP(mpi_errno);    /* free cookie buffer allocated in CTS handler */    MPIU_Free(sreq->ch.lmt_tmp_cookie.MPID_IOV_BUF);    sreq->ch.lmt_tmp_cookie.MPID_IOV_LEN = 0;    *complete = TRUE; fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_DO_SEND);    return mpi_errno; fn_fail:    goto fn_exit;}#undef FUNCNAME#define FUNCNAME do_cookie#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)static int do_cookie(MPIDI_VC_t *vc, MPID_Request *rreq, int *complete){    int mpi_errno = MPI_SUCCESS;    MPID_IOV cookie;    MPID_Request *req = rreq->ch.lmt_req;    MPIDI_STATE_DECL(MPID_STATE_DO_COOKIE);    MPIDI_FUNC_ENTER(MPID_STATE_DO_COOKIE);    cookie = req->ch.lmt_tmp_cookie;    mpi_errno = ((MPIDI_CH3I_VC *)vc->channel_private)->lmt_handle_cookie(vc, req, cookie);    if (mpi_errno) MPIU_ERR_POP (mpi_errno);    /* free cookie buffer allocated in COOKIE handler */    MPIU_Free(req->ch.lmt_tmp_cookie.MPID_IOV_BUF);    req->ch.lmt_tmp_cookie.MPID_IOV_LEN = 0;    *complete = TRUE; fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_DO_COOKIE);    return mpi_errno; fn_fail:    goto fn_exit;}

⌨️ 快捷键说明

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