mtl_portals_recv.c

来自「MPI stands for the Message Passing Inter」· C语言 代码 · 共 500 行 · 第 1/2 页

C
500
字号
/* * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana *                         University Research and Technology *                         Corporation.  All rights reserved. * Copyright (c) 2004-2005 The University of Tennessee and The University *                         of Tennessee Research Foundation.  All rights *                         reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, *                         University of Stuttgart.  All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. *                         All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */#include "ompi_config.h"#include "opal/class/opal_list.h"#include "ompi/request/request.h"#include "ompi/datatype/datatype.h"#include "ompi/communicator/communicator.h"#include "ompi/datatype/convertor.h"#include "ompi/mca/mtl/base/base.h"#include "ompi/mca/mtl/base/mtl_base_datatype.h"#include "mtl_portals.h"#include "mtl_portals_endpoint.h"#include "mtl_portals_request.h"#include "mtl_portals_recv_short.h"#define CHECK_MATCH(incoming_bits, match_bits, ignore_bits)     \    (((incoming_bits ^ match_bits) & ~ignore_bits) == 0)/* called when a receive should be progressed */static intompi_mtl_portals_recv_progress(ptl_event_t *ev,                               struct ompi_mtl_portals_request_t* ptl_request){    int ret;    switch (ev->type) {    case PTL_EVENT_PUT_END:        /* make sure the data is in the right place */        ompi_mtl_datatype_unpack(ptl_request->convertor,                                 ev->md.start, ev->mlength);        /* set the status */        ptl_request->super.ompi_req->req_status.MPI_SOURCE =            PTL_GET_SOURCE(ev->match_bits);        ptl_request->super.ompi_req->req_status.MPI_TAG =                 PTL_GET_TAG(ev->match_bits);        ptl_request->super.ompi_req->req_status.MPI_ERROR =             (ev->rlength > ev->mlength) ?            MPI_ERR_TRUNCATE : MPI_SUCCESS;        ptl_request->super.ompi_req->req_status._count =             ev->mlength;        OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_output,                             "recv complete: 0x%016llx\n", ev->match_bits));                ptl_request->super.completion_callback(&ptl_request->super);        break;    case PTL_EVENT_REPLY_END:        /* make sure the data is in the right place */        ompi_mtl_datatype_unpack(ptl_request->convertor,                                 ev->md.start, ev->mlength);        ret=PtlMDUnlink(ev->md_handle);        if( ret !=PTL_OK) {            return ompi_common_portals_error_ptl_to_ompi(ret);        }        /* set the status - most of this filled in right after issuing           the PtlGet*/        ptl_request->super.ompi_req->req_status._count =             ev->mlength;        OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_output,                             "recv complete: 0x%016llx\n", ev->match_bits));                ptl_request->super.completion_callback(&ptl_request->super);        break;    default:        break;    }        return OMPI_SUCCESS;}static intompi_mtl_portals_get_data(ompi_mtl_portals_event_t *recv_event,                           struct ompi_convertor_t *convertor,                          ompi_mtl_portals_request_t  *ptl_request){    int ret;    ptl_md_t md;    ptl_handle_md_t md_h;    size_t buflen;        if (PTL_IS_SHORT_MSG(recv_event->ev.match_bits)) {        /* the buffer is sitting in the short message queue */        struct iovec iov;        uint32_t iov_count = 1;        size_t max_data;        ompi_mtl_portals_recv_short_block_t *block =             recv_event->ev.md.user_ptr;        iov.iov_base = (((char*) recv_event->ev.md.start) + recv_event->ev.offset);        iov.iov_len = recv_event->ev.mlength;        max_data = iov.iov_len;        /* see if this message filled the receive block */        if (recv_event->ev.md.length - (recv_event->ev.offset +                                         recv_event->ev.mlength) <            recv_event->ev.md.max_size) {            block->full = true;        }        /* pull out the data */        if (iov.iov_len > 0) {            ompi_convertor_unpack(convertor, &iov, &iov_count,                                  &max_data );        }        /* if synchronous, return an ack */        if (PTL_IS_SYNC_MSG(recv_event->ev)) {            md.length = 0;            md.start = (((char*) recv_event->ev.md.start) + recv_event->ev.offset);            md.threshold = 1; /* send */            md.options = PTL_MD_EVENT_START_DISABLE;            md.user_ptr = NULL;            md.eq_handle = ompi_mtl_portals.ptl_eq_h;            ret = PtlMDBind(ompi_mtl_portals.ptl_ni_h, md,                            PTL_UNLINK, &md_h);            if (PTL_OK != ret) {                opal_output(fileno(stderr)," Error returned from PtlMDBind.  Error code - %d \n",ret);                abort();            }            OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_output,                                 "acking recv: 0x%016llx\n",                                  recv_event->ev.match_bits));            ret = PtlPut(md_h,                         PTL_NO_ACK_REQ,                         recv_event->ev.initiator,                         OMPI_MTL_PORTALS_ACK_TABLE_ID,                         0,                         recv_event->ev.hdr_data,                         0,                         0);            if (PTL_OK != ret) {                opal_output(fileno(stderr)," Error returned from PtlPut.  Error code - %d \n",ret);                abort();            }        }        /* finished with our buffer space */        ompi_mtl_portals_return_block_part(&ompi_mtl_portals, block);        ompi_convertor_get_packed_size(convertor, &buflen);        ptl_request->super.ompi_req->req_status.MPI_SOURCE =            PTL_GET_SOURCE(recv_event->ev.match_bits);        ptl_request->super.ompi_req->req_status.MPI_TAG =             PTL_GET_TAG(recv_event->ev.match_bits);        ptl_request->super.ompi_req->req_status.MPI_ERROR =             (recv_event->ev.rlength > buflen) ?            MPI_ERR_TRUNCATE : MPI_SUCCESS;        ptl_request->super.ompi_req->req_status._count =             recv_event->ev.mlength;        OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_output,                             "recv complete: 0x%016llx\n",                              recv_event->ev.match_bits));                ptl_request->super.completion_callback(&ptl_request->super);    } else {        ret = ompi_mtl_datatype_recv_buf(convertor, &md.start, &buflen,                                         &ptl_request->free_after);        if (OMPI_SUCCESS != ret) {            opal_output(fileno(stderr)," Error returned from ompi_mtl_datatype_recv_buf.  Error code - %d \n",ret);            abort();        }        md.length = (recv_event->ev.rlength > buflen) ? buflen : recv_event->ev.rlength;        md.threshold = 2; /* send and get */        md.options = PTL_MD_EVENT_START_DISABLE;        md.user_ptr = ptl_request;        md.eq_handle = ompi_mtl_portals.ptl_eq_h;        /* retain because it's unclear how many events we'll get here.           Some implementations give just the REPLY, others give SEND           and REPLY */        ret = PtlMDBind(ompi_mtl_portals.ptl_ni_h, md,                        PTL_RETAIN, &md_h);        if (PTL_OK != ret) {            opal_output(fileno(stderr)," Error returned from ompi_mtl_datatype_recv_buf.  Error code - %d \n",ret);            abort();        }        ptl_request->event_callback = ompi_mtl_portals_recv_progress;        ret = PtlGet(md_h,                      recv_event->ev.initiator,                      OMPI_MTL_PORTALS_READ_TABLE_ID,                     0,                      recv_event->ev.hdr_data,                     0);        if (PTL_OK != ret) {            opal_output(fileno(stderr)," Error returned from PtlGet.  Error code - %d \n",ret);            abort();        }        ptl_request->super.ompi_req->req_status.MPI_SOURCE =            PTL_GET_SOURCE(recv_event->ev.match_bits);        ptl_request->super.ompi_req->req_status.MPI_TAG =             PTL_GET_TAG(recv_event->ev.match_bits);        ptl_request->super.ompi_req->req_status.MPI_ERROR =             (recv_event->ev.rlength > buflen) ?            MPI_ERR_TRUNCATE : MPI_SUCCESS;    }    return OMPI_SUCCESS;}static voidompi_mtl_portals_match_up_put_end(ptl_seq_t link){    opal_list_item_t *list_item;    /* match up a PUT_END event with its corresponding PUT_START event */    list_item = opal_list_get_first(&ompi_mtl_portals.unexpected_messages);    while (list_item != opal_list_get_end(&ompi_mtl_portals.unexpected_messages)) {        opal_list_item_t *next_item = opal_list_get_next(list_item);        ompi_mtl_portals_event_t *recv_event = (ompi_mtl_portals_event_t*) list_item;        if (recv_event->ev.link == link) {            recv_event->is_complete = true;            return;

⌨️ 快捷键说明

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