root/opal/mca/btl/vader/btl_vader_sc_emu.c

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

DEFINITIONS

This source file includes following definitions.
  1. mca_btl_vader_sc_emu_atomic_64
  2. mca_btl_vader_sc_emu_atomic_32
  3. mca_btl_vader_sc_emu_rdma
  4. mca_btl_vader_sc_emu_init

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2011-2018 Los Alamos National Security, LLC. All rights
   4  *                         reserved.
   5  * $COPYRIGHT$
   6  *
   7  * Additional copyrights may follow
   8  *
   9  * $HEADER$
  10  */
  11 
  12 #include "btl_vader.h"
  13 #include "btl_vader_frag.h"
  14 
  15 #if OPAL_HAVE_ATOMIC_MATH_64
  16 static void mca_btl_vader_sc_emu_atomic_64 (int64_t *operand, opal_atomic_int64_t *addr, mca_btl_base_atomic_op_t op)
  17 {
  18     int64_t result = 0;
  19 
  20     switch (op) {
  21     case MCA_BTL_ATOMIC_ADD:
  22         result = opal_atomic_fetch_add_64 (addr, *operand);
  23         break;
  24     case MCA_BTL_ATOMIC_AND:
  25         result = opal_atomic_fetch_and_64 (addr, *operand);
  26         break;
  27     case MCA_BTL_ATOMIC_OR:
  28         result = opal_atomic_fetch_or_64 (addr, *operand);
  29         break;
  30     case MCA_BTL_ATOMIC_XOR:
  31         result = opal_atomic_fetch_xor_64 (addr, *operand);
  32         break;
  33     case MCA_BTL_ATOMIC_SWAP:
  34         result = opal_atomic_swap_64 (addr, *operand);
  35         break;
  36 #if OPAL_HAVE_ATOMIC_MIN_64
  37     case MCA_BTL_ATOMIC_MIN:
  38         result = opal_atomic_fetch_min_64 (addr, *operand);
  39         break;
  40 #endif
  41 #if OPAL_HAVE_ATOMIC_MAX_64
  42     case MCA_BTL_ATOMIC_MAX:
  43         result = opal_atomic_fetch_max_64 (addr, *operand);
  44         break;
  45 #endif
  46     default:
  47         assert (0);
  48     }
  49 
  50     *operand = result;
  51 }
  52 #endif
  53 
  54 #if OPAL_HAVE_ATOMIC_MATH_32
  55 static void mca_btl_vader_sc_emu_atomic_32 (int32_t *operand, opal_atomic_int32_t *addr, mca_btl_base_atomic_op_t op)
  56 {
  57     int32_t result = 0;
  58 
  59     switch (op) {
  60     case MCA_BTL_ATOMIC_ADD:
  61         result = opal_atomic_fetch_add_32 (addr, *operand);
  62         break;
  63     case MCA_BTL_ATOMIC_AND:
  64         result = opal_atomic_fetch_and_32 (addr, *operand);
  65         break;
  66     case MCA_BTL_ATOMIC_OR:
  67         result = opal_atomic_fetch_or_32 (addr, *operand);
  68         break;
  69     case MCA_BTL_ATOMIC_XOR:
  70         result = opal_atomic_fetch_xor_32 (addr, *operand);
  71         break;
  72     case MCA_BTL_ATOMIC_SWAP:
  73         result = opal_atomic_swap_32 (addr, *operand);
  74         break;
  75 #if OPAL_HAVE_ATOMIC_MIN_32
  76     case MCA_BTL_ATOMIC_MIN:
  77         result = opal_atomic_fetch_min_32 (addr, *operand);
  78         break;
  79 #endif
  80 #if OPAL_HAVE_ATOMIC_MAX_32
  81     case MCA_BTL_ATOMIC_MAX:
  82         result = opal_atomic_fetch_max_32 (addr, *operand);
  83         break;
  84 #endif
  85     default:
  86         assert (0);
  87     }
  88 
  89     *operand = result;
  90 }
  91 #endif
  92 
  93 static void mca_btl_vader_sc_emu_rdma (mca_btl_base_module_t *btl, mca_btl_base_tag_t tag, mca_btl_base_descriptor_t *desc, void *ctx)
  94 {
  95     mca_btl_vader_sc_emu_hdr_t *hdr = (mca_btl_vader_sc_emu_hdr_t *) desc->des_segments[0].seg_addr.pval;
  96     size_t size = desc->des_segments[0].seg_len - sizeof (*hdr);
  97     void *data = (void *)(hdr + 1);
  98 
  99     switch (hdr->type) {
 100     case MCA_BTL_VADER_OP_PUT:
 101         memcpy ((void *) hdr->addr, data, size);
 102         break;
 103     case MCA_BTL_VADER_OP_GET:
 104         memcpy (data, (void *) hdr->addr, size);
 105         break;
 106 #if OPAL_HAVE_ATOMIC_MATH_64
 107     case MCA_BTL_VADER_OP_ATOMIC:
 108         if (!(hdr->flags & MCA_BTL_ATOMIC_FLAG_32BIT)) {
 109             mca_btl_vader_sc_emu_atomic_64 (hdr->operand, (void *) hdr->addr, hdr->op);
 110 #if OPAL_HAVE_ATOMIC_MATH_32
 111         } else {
 112             int32_t tmp = (int32_t) hdr->operand[0];
 113             mca_btl_vader_sc_emu_atomic_32 (&tmp, (void *) hdr->addr, hdr->op);
 114             hdr->operand[0] = tmp;
 115 #else
 116         } else {
 117             /* developer error. should not happen */
 118             assert (0);
 119 #endif /* OPAL_HAVE_ATOMIC_MATH_32 */
 120         }
 121         break;
 122 #endif /* OPAL_HAVE_ATOMIC_MATH_64 */
 123 #if OPAL_HAVE_ATOMIC_MATH_64
 124     case MCA_BTL_VADER_OP_CSWAP:
 125         if (!(hdr->flags & MCA_BTL_ATOMIC_FLAG_32BIT)) {
 126             opal_atomic_compare_exchange_strong_64 ((opal_atomic_int64_t *) hdr->addr, &hdr->operand[0], hdr->operand[1]);
 127 #if OPAL_HAVE_ATOMIC_MATH_32
 128         } else {
 129             opal_atomic_compare_exchange_strong_32 ((opal_atomic_int32_t *) hdr->addr, (int32_t *) &hdr->operand[0],
 130                                                     (int32_t) hdr->operand[1]);
 131 #else
 132         } else {
 133             /* developer error. should not happen */
 134             assert (0);
 135 #endif /* OPAL_HAVE_ATOMIC_MATH_32 */
 136         }
 137         break;
 138 #endif /* OPAL_HAVE_ATOMIC_MATH_64 */
 139     }
 140 }
 141 
 142 void mca_btl_vader_sc_emu_init (void)
 143 {
 144     mca_btl_base_active_message_trigger[MCA_BTL_TAG_VADER].cbfunc = mca_btl_vader_sc_emu_rdma;
 145     mca_btl_base_active_message_trigger[MCA_BTL_TAG_VADER].cbdata = NULL;
 146 }

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