root/opal/mca/btl/ugni/btl_ugni_prepare.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. mca_btl_ugni_prepare_src_send_nodata
  2. mca_btl_ugni_prepare_src_send_inplace
  3. mca_btl_ugni_prepare_src_send_buffered
  4. mca_btl_ugni_prepare_src_send

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2011-2015 Los Alamos National Security, LLC. All rights
   4  *                         reserved.
   5  * Copyright (c) 2011      UT-Battelle, LLC. All rights reserved.
   6  * $COPYRIGHT$
   7  *
   8  * Additional copyrights may follow
   9  *
  10  * $HEADER$
  11  */
  12 
  13 #if !defined(MCA_BTL_UGNI_PREPARE_H)
  14 #define MCA_BTL_UGNI_PREPARE_H
  15 
  16 #include "opal_config.h"
  17 
  18 #include "btl_ugni.h"
  19 #include "btl_ugni_frag.h"
  20 
  21 static inline struct mca_btl_base_descriptor_t *
  22 mca_btl_ugni_prepare_src_send_nodata (struct mca_btl_base_module_t *btl,
  23                                       mca_btl_base_endpoint_t *endpoint,
  24                                       uint8_t order, size_t reserve,
  25                                       uint32_t flags)
  26 {
  27     mca_btl_ugni_base_frag_t *frag = NULL;
  28 
  29     frag = mca_btl_ugni_frag_alloc_rdma (endpoint);
  30     if (OPAL_UNLIKELY(NULL == frag)) {
  31         return NULL;
  32     }
  33 
  34     BTL_VERBOSE(("preparing src for send fragment. size = %u", (unsigned int) reserve));
  35 
  36     frag->hdr_size = reserve + sizeof (frag->hdr.send);
  37 
  38     frag->segments[0].seg_addr.pval = frag->hdr.send_ex.pml_header;
  39     frag->segments[0].seg_len       = reserve;
  40 
  41     frag->segments[1].seg_addr.pval = NULL;
  42     frag->segments[1].seg_len       = 0;
  43 
  44     frag->base.des_segments      = frag->segments;
  45     frag->base.des_segment_count = 1;
  46     frag->base.order           = order;
  47     frag->base.des_flags       = flags;
  48 
  49     return &frag->base;
  50 }
  51 
  52 static inline struct mca_btl_base_descriptor_t *
  53 mca_btl_ugni_prepare_src_send_inplace (struct mca_btl_base_module_t *btl,
  54                                        mca_btl_base_endpoint_t *endpoint,
  55                                        struct opal_convertor_t *convertor,
  56                                        uint8_t order, size_t reserve, size_t *size,
  57                                        uint32_t flags)
  58 {
  59     bool use_eager_get = (*size + reserve) > mca_btl_ugni_component.smsg_max_data;
  60     mca_btl_ugni_module_t *ugni_module = (mca_btl_ugni_module_t *) btl;
  61     mca_btl_ugni_base_frag_t *frag = NULL;
  62     mca_btl_ugni_reg_t *registration = NULL;
  63     void *data_ptr;
  64     int rc;
  65 
  66     opal_convertor_get_current_pointer (convertor, &data_ptr);
  67 
  68     frag = mca_btl_ugni_frag_alloc_rdma (endpoint);
  69     if (OPAL_UNLIKELY(NULL == frag)) {
  70         return NULL;
  71     }
  72 
  73     BTL_VERBOSE(("preparing src for send fragment. size = %u",
  74                  (unsigned int)(*size + reserve)));
  75 
  76     if (OPAL_UNLIKELY(true == use_eager_get)) {
  77         rc = ugni_module->rcache->rcache_register (ugni_module->rcache, data_ptr, *size, 0,
  78                                                    MCA_RCACHE_ACCESS_REMOTE_READ,
  79                                                    (mca_rcache_base_registration_t **)&registration);
  80         if (OPAL_UNLIKELY(OPAL_SUCCESS != rc)) {
  81             mca_btl_ugni_frag_return (frag);
  82             return NULL;
  83         }
  84 
  85         frag->flags = MCA_BTL_UGNI_FRAG_EAGER | MCA_BTL_UGNI_FRAG_IGNORE;
  86 
  87         frag->registration = registration;
  88         frag->hdr.eager.memory_handle = registration->handle;;
  89 
  90         frag->hdr_size = reserve + sizeof (frag->hdr.eager);
  91         frag->segments[0].seg_addr.pval = frag->hdr.eager_ex.pml_header;
  92     } else {
  93         frag->hdr_size = reserve + sizeof (frag->hdr.send);
  94         frag->segments[0].seg_addr.pval = frag->hdr.send_ex.pml_header;
  95     }
  96 
  97     frag->segments[0].seg_len       = reserve;
  98 
  99     frag->segments[1].seg_addr.pval = data_ptr;
 100     frag->segments[1].seg_len       = *size;
 101 
 102     frag->base.des_segments       = frag->segments;
 103     frag->base.des_segment_count = 2;
 104     frag->base.order           = order;
 105     frag->base.des_flags       = flags;
 106 
 107     return &frag->base;
 108 }
 109 
 110 static inline struct mca_btl_base_descriptor_t *
 111 mca_btl_ugni_prepare_src_send_buffered (struct mca_btl_base_module_t *btl,
 112                                         mca_btl_base_endpoint_t *endpoint,
 113                                         struct opal_convertor_t *convertor,
 114                                         uint8_t order, size_t reserve, size_t *size,
 115                                         uint32_t flags)
 116 {
 117     bool use_eager_get = (*size + reserve) > mca_btl_ugni_component.smsg_max_data;
 118     mca_btl_ugni_reg_t *registration = NULL;
 119     mca_btl_ugni_base_frag_t *frag = NULL;
 120     uint32_t iov_count = 1;
 121     struct iovec iov;
 122     int rc;
 123 
 124     if (OPAL_UNLIKELY(true == use_eager_get)) {
 125         frag = mca_btl_ugni_frag_alloc_eager_send (endpoint);
 126         if (OPAL_UNLIKELY(NULL == frag)) {
 127             return NULL;
 128         }
 129 
 130         frag->flags = MCA_BTL_UGNI_FRAG_EAGER | MCA_BTL_UGNI_FRAG_IGNORE;
 131 
 132         registration = (mca_btl_ugni_reg_t *) frag->base.super.registration;
 133 
 134         frag->hdr.eager.memory_handle = registration->handle;
 135         frag->hdr_size = reserve + sizeof (frag->hdr.eager);
 136         frag->segments[0].seg_addr.pval = frag->hdr.eager_ex.pml_header;
 137     } else {
 138         frag = mca_btl_ugni_frag_alloc_smsg (endpoint);
 139         if (OPAL_UNLIKELY(NULL == frag)) {
 140             return NULL;
 141         }
 142 
 143         frag->hdr_size = reserve + sizeof (frag->hdr.send);
 144         frag->segments[0].seg_addr.pval = frag->hdr.send_ex.pml_header;
 145     }
 146 
 147     frag->flags |= MCA_BTL_UGNI_FRAG_BUFFERED;
 148 
 149     iov.iov_len  = *size;
 150     iov.iov_base = (IOVBASE_TYPE *) frag->base.super.ptr;
 151 
 152     rc = opal_convertor_pack (convertor, &iov, &iov_count, size);
 153     if (OPAL_UNLIKELY(rc < 0)) {
 154         mca_btl_ugni_frag_return (frag);
 155         return NULL;
 156     }
 157 
 158     frag->segments[0].seg_len       = reserve;
 159 
 160     frag->segments[1].seg_addr.pval = frag->base.super.ptr;
 161     frag->segments[1].seg_len       = *size;
 162 
 163     frag->base.des_segments       = frag->segments;
 164     frag->base.des_segment_count = 2;
 165     frag->base.order           = order;
 166     frag->base.des_flags       = flags;
 167 
 168     return &frag->base;
 169 }
 170 
 171 static inline struct mca_btl_base_descriptor_t *
 172 mca_btl_ugni_prepare_src_send (struct mca_btl_base_module_t *btl,
 173                                mca_btl_base_endpoint_t *endpoint,
 174                                struct opal_convertor_t *convertor,
 175                                uint8_t order, size_t reserve, size_t *size,
 176                                uint32_t flags)
 177 {
 178     bool use_eager_get = (*size + reserve) > mca_btl_ugni_component.smsg_max_data;
 179     bool send_in_place;
 180     void *data_ptr;
 181 
 182     if (!(*size)) {
 183         return mca_btl_ugni_prepare_src_send_nodata (btl, endpoint, order, reserve, flags);
 184     }
 185 
 186     opal_convertor_get_current_pointer (convertor, &data_ptr);
 187 
 188     send_in_place = (btl->btl_flags & MCA_BTL_FLAGS_SEND_INPLACE) && !(opal_convertor_need_buffers(convertor) ||
 189                                                                        (use_eager_get && ((uintptr_t)data_ptr & 3)));
 190 
 191     if (send_in_place) {
 192         return mca_btl_ugni_prepare_src_send_inplace (btl, endpoint, convertor, order,
 193                                                       reserve, size, flags);
 194     } else {
 195         return mca_btl_ugni_prepare_src_send_buffered (btl, endpoint, convertor, order,
 196                                                        reserve, size, flags);
 197     }
 198 }
 199 
 200 #endif

/* [<][>][^][v][top][bottom][index][help] */