root/oshmem/shmem/c/shmem_put.c

/* [<][>][^][v][top][bottom][index][help] */
   1 /*
   2  * Copyright (c) 2013      Mellanox Technologies, Inc.
   3  *                         All rights reserved.
   4  * $COPYRIGHT$
   5  *
   6  * Additional copyrights may follow
   7  *
   8  * $HEADER$
   9  */
  10 #include "oshmem_config.h"
  11 
  12 #include "oshmem/constants.h"
  13 #include "oshmem/include/shmem.h"
  14 
  15 #include "oshmem/runtime/runtime.h"
  16 
  17 #include "oshmem/mca/spml/spml.h"
  18 
  19 /*
  20  * These routines copy contiguous data from a local object to an object on the destination PE.
  21  * These routines transfer nelems elements of the data object at address source on the calling
  22  * PE, to the data object at address target on the remote PE pe. These routines start the
  23  * remote transfer and may return before the data is delivered to the remote PE. The delivery
  24  * of data into the data object on the destination PE from different put calls may occur in any
  25  * order. Because of this, two successive put operations may deliver data out of order unless a
  26  * call to shmem_fence() is introduced between the two calls.
  27  */
  28 #define DO_SHMEM_TYPE_PUT(ctx, type, target, source, len, pe) do {  \
  29         int rc = OSHMEM_SUCCESS;                                    \
  30         size_t size = 0;                                            \
  31                                                                     \
  32         RUNTIME_CHECK_INIT();                                       \
  33         RUNTIME_CHECK_PE(pe);                                       \
  34         RUNTIME_CHECK_ADDR(target);                                 \
  35                                                                     \
  36         size = len * sizeof(type);                                  \
  37         rc = MCA_SPML_CALL(put(                                     \
  38             ctx,                                                    \
  39             (void*)target,                                          \
  40             size,                                                   \
  41             (void*)source,                                          \
  42             pe));                                                   \
  43         RUNTIME_CHECK_RC(rc);                                       \
  44     } while (0)
  45 
  46 #define SHMEM_CTX_TYPE_PUT(type_name, type)                         \
  47     void shmem_ctx##type_name##_put(shmem_ctx_t ctx, type *target, const type *source, size_t len, int pe)\
  48     {                                                               \
  49         DO_SHMEM_TYPE_PUT(ctx, type, target, source, len, pe);      \
  50         return ;                                                    \
  51     }
  52 
  53 #define SHMEM_TYPE_PUT(type_name, type)                             \
  54     void shmem##type_name##_put(type *target, const type *source, size_t len, int pe)\
  55     {                                                               \
  56         DO_SHMEM_TYPE_PUT(oshmem_ctx_default, type, target,          \
  57                           source, len, pe);                         \
  58         return ;                                                    \
  59     }
  60 
  61 #if OSHMEM_PROFILING
  62 #include "oshmem/include/pshmem.h"
  63 #pragma weak shmem_ctx_char_put       = pshmem_ctx_char_put
  64 #pragma weak shmem_ctx_short_put      = pshmem_ctx_short_put
  65 #pragma weak shmem_ctx_int_put        = pshmem_ctx_int_put
  66 #pragma weak shmem_ctx_long_put       = pshmem_ctx_long_put
  67 #pragma weak shmem_ctx_float_put      = pshmem_ctx_float_put
  68 #pragma weak shmem_ctx_double_put     = pshmem_ctx_double_put
  69 #pragma weak shmem_ctx_longlong_put   = pshmem_ctx_longlong_put
  70 #pragma weak shmem_ctx_schar_put      = pshmem_ctx_schar_put
  71 #pragma weak shmem_ctx_uchar_put      = pshmem_ctx_uchar_put
  72 #pragma weak shmem_ctx_ushort_put     = pshmem_ctx_ushort_put
  73 #pragma weak shmem_ctx_uint_put       = pshmem_ctx_uint_put
  74 #pragma weak shmem_ctx_ulong_put      = pshmem_ctx_ulong_put
  75 #pragma weak shmem_ctx_ulonglong_put  = pshmem_ctx_ulonglong_put
  76 #pragma weak shmem_ctx_longdouble_put = pshmem_ctx_longdouble_put
  77 #pragma weak shmem_ctx_int8_put       = pshmem_ctx_int8_put
  78 #pragma weak shmem_ctx_int16_put      = pshmem_ctx_int16_put
  79 #pragma weak shmem_ctx_int32_put      = pshmem_ctx_int32_put
  80 #pragma weak shmem_ctx_int64_put      = pshmem_ctx_int64_put
  81 #pragma weak shmem_ctx_uint8_put      = pshmem_ctx_uint8_put
  82 #pragma weak shmem_ctx_uint16_put     = pshmem_ctx_uint16_put
  83 #pragma weak shmem_ctx_uint32_put     = pshmem_ctx_uint32_put
  84 #pragma weak shmem_ctx_uint64_put     = pshmem_ctx_uint64_put
  85 #pragma weak shmem_ctx_size_put       = pshmem_ctx_size_put
  86 #pragma weak shmem_ctx_ptrdiff_put    = pshmem_ctx_ptrdiff_put
  87 
  88 #pragma weak shmem_char_put           = pshmem_char_put
  89 #pragma weak shmem_short_put          = pshmem_short_put
  90 #pragma weak shmem_int_put            = pshmem_int_put
  91 #pragma weak shmem_long_put           = pshmem_long_put
  92 #pragma weak shmem_float_put          = pshmem_float_put
  93 #pragma weak shmem_double_put         = pshmem_double_put
  94 #pragma weak shmem_longlong_put       = pshmem_longlong_put
  95 #pragma weak shmem_schar_put          = pshmem_schar_put
  96 #pragma weak shmem_uchar_put          = pshmem_uchar_put
  97 #pragma weak shmem_ushort_put         = pshmem_ushort_put
  98 #pragma weak shmem_uint_put           = pshmem_uint_put
  99 #pragma weak shmem_ulong_put          = pshmem_ulong_put
 100 #pragma weak shmem_ulonglong_put      = pshmem_ulonglong_put
 101 #pragma weak shmem_longdouble_put     = pshmem_longdouble_put
 102 #pragma weak shmem_int8_put           = pshmem_int8_put
 103 #pragma weak shmem_int16_put          = pshmem_int16_put
 104 #pragma weak shmem_int32_put          = pshmem_int32_put
 105 #pragma weak shmem_int64_put          = pshmem_int64_put
 106 #pragma weak shmem_uint8_put          = pshmem_uint8_put
 107 #pragma weak shmem_uint16_put         = pshmem_uint16_put
 108 #pragma weak shmem_uint32_put         = pshmem_uint32_put
 109 #pragma weak shmem_uint64_put         = pshmem_uint64_put
 110 #pragma weak shmem_size_put           = pshmem_size_put
 111 #pragma weak shmem_ptrdiff_put        = pshmem_ptrdiff_put
 112 
 113 #pragma weak shmem_ctx_putmem = pshmem_ctx_putmem
 114 #pragma weak shmem_ctx_put8 = pshmem_ctx_put8
 115 #pragma weak shmem_ctx_put16 = pshmem_ctx_put16
 116 #pragma weak shmem_ctx_put32 = pshmem_ctx_put32
 117 #pragma weak shmem_ctx_put64 = pshmem_ctx_put64
 118 #pragma weak shmem_ctx_put128 = pshmem_ctx_put128
 119 
 120 #pragma weak shmem_putmem = pshmem_putmem
 121 #pragma weak shmem_put8 = pshmem_put8
 122 #pragma weak shmem_put16 = pshmem_put16
 123 #pragma weak shmem_put32 = pshmem_put32
 124 #pragma weak shmem_put64 = pshmem_put64
 125 #pragma weak shmem_put128 = pshmem_put128
 126 #include "oshmem/shmem/c/profile/defines.h"
 127 #endif
 128 
 129 SHMEM_CTX_TYPE_PUT(_char, char)
 130 SHMEM_CTX_TYPE_PUT(_short, short)
 131 SHMEM_CTX_TYPE_PUT(_int, int)
 132 SHMEM_CTX_TYPE_PUT(_long, long)
 133 SHMEM_CTX_TYPE_PUT(_longlong, long long)
 134 SHMEM_CTX_TYPE_PUT(_schar, signed char)
 135 SHMEM_CTX_TYPE_PUT(_uchar, unsigned char)
 136 SHMEM_CTX_TYPE_PUT(_ushort, unsigned short)
 137 SHMEM_CTX_TYPE_PUT(_uint, unsigned int)
 138 SHMEM_CTX_TYPE_PUT(_ulong, unsigned long)
 139 SHMEM_CTX_TYPE_PUT(_ulonglong, unsigned long long)
 140 SHMEM_CTX_TYPE_PUT(_float, float)
 141 SHMEM_CTX_TYPE_PUT(_double, double)
 142 SHMEM_CTX_TYPE_PUT(_longdouble, long double)
 143 SHMEM_CTX_TYPE_PUT(_int8, int8_t)
 144 SHMEM_CTX_TYPE_PUT(_int16, int16_t)
 145 SHMEM_CTX_TYPE_PUT(_int32, int32_t)
 146 SHMEM_CTX_TYPE_PUT(_int64, int64_t)
 147 SHMEM_CTX_TYPE_PUT(_uint8, uint8_t)
 148 SHMEM_CTX_TYPE_PUT(_uint16, uint16_t)
 149 SHMEM_CTX_TYPE_PUT(_uint32, uint32_t)
 150 SHMEM_CTX_TYPE_PUT(_uint64, uint64_t)
 151 SHMEM_CTX_TYPE_PUT(_size, size_t)
 152 SHMEM_CTX_TYPE_PUT(_ptrdiff, ptrdiff_t)
 153 
 154 SHMEM_TYPE_PUT(_char, char)
 155 SHMEM_TYPE_PUT(_short, short)
 156 SHMEM_TYPE_PUT(_int, int)
 157 SHMEM_TYPE_PUT(_long, long)
 158 SHMEM_TYPE_PUT(_longlong, long long)
 159 SHMEM_TYPE_PUT(_schar, signed char)
 160 SHMEM_TYPE_PUT(_uchar, unsigned char)
 161 SHMEM_TYPE_PUT(_ushort, unsigned short)
 162 SHMEM_TYPE_PUT(_uint, unsigned int)
 163 SHMEM_TYPE_PUT(_ulong, unsigned long)
 164 SHMEM_TYPE_PUT(_ulonglong, unsigned long long)
 165 SHMEM_TYPE_PUT(_float, float)
 166 SHMEM_TYPE_PUT(_double, double)
 167 SHMEM_TYPE_PUT(_longdouble, long double)
 168 SHMEM_TYPE_PUT(_int8, int8_t)
 169 SHMEM_TYPE_PUT(_int16, int16_t)
 170 SHMEM_TYPE_PUT(_int32, int32_t)
 171 SHMEM_TYPE_PUT(_int64, int64_t)
 172 SHMEM_TYPE_PUT(_uint8, uint8_t)
 173 SHMEM_TYPE_PUT(_uint16, uint16_t)
 174 SHMEM_TYPE_PUT(_uint32, uint32_t)
 175 SHMEM_TYPE_PUT(_uint64, uint64_t)
 176 SHMEM_TYPE_PUT(_size, size_t)
 177 SHMEM_TYPE_PUT(_ptrdiff, ptrdiff_t)
 178 
 179 #define DO_SHMEM_PUTMEM(ctx, target, source, element_size, nelems, pe) do { \
 180         int rc = OSHMEM_SUCCESS;                                    \
 181         size_t size = 0;                                            \
 182                                                                     \
 183         RUNTIME_CHECK_INIT();                                       \
 184         RUNTIME_CHECK_PE(pe);                                       \
 185         RUNTIME_CHECK_ADDR(target);                                 \
 186                                                                     \
 187         size = nelems * element_size;                               \
 188         rc = MCA_SPML_CALL(put(                                     \
 189             ctx,                                                    \
 190             (void*)target,                                          \
 191             size,                                                   \
 192             (void*)source,                                          \
 193             pe));                                                   \
 194         RUNTIME_CHECK_RC(rc);                                       \
 195     } while (0)
 196 
 197 #define SHMEM_CTX_TYPE_PUTMEM(name, element_size, prefix)           \
 198     void prefix##_ctx##name(shmem_ctx_t ctx, void *target, const void *source, size_t nelems, int pe) \
 199     {                                                               \
 200         DO_SHMEM_PUTMEM(ctx, target, source,                        \
 201                         element_size, nelems, pe);                  \
 202         return ;                                                    \
 203     }
 204 
 205 #define SHMEM_TYPE_PUTMEM(name, element_size, prefix)               \
 206     void prefix##name(void *target, const void *source, size_t nelems, int pe) \
 207     {                                                               \
 208         DO_SHMEM_PUTMEM(oshmem_ctx_default, target,                  \
 209                         source, element_size, nelems, pe);          \
 210         return ;                                                    \
 211     }
 212 
 213 SHMEM_CTX_TYPE_PUTMEM(_putmem, 1, shmem)
 214 SHMEM_CTX_TYPE_PUTMEM(_put8,  1, shmem)
 215 SHMEM_CTX_TYPE_PUTMEM(_put16, 2, shmem)
 216 SHMEM_CTX_TYPE_PUTMEM(_put32, 4, shmem)
 217 SHMEM_CTX_TYPE_PUTMEM(_put64, 8, shmem)
 218 SHMEM_CTX_TYPE_PUTMEM(_put128, 16, shmem)
 219 SHMEM_TYPE_PUTMEM(_putmem, 1, shmem)
 220 SHMEM_TYPE_PUTMEM(_put8,  1, shmem)
 221 SHMEM_TYPE_PUTMEM(_put16, 2, shmem)
 222 SHMEM_TYPE_PUTMEM(_put32, 4, shmem)
 223 SHMEM_TYPE_PUTMEM(_put64, 8, shmem)
 224 SHMEM_TYPE_PUTMEM(_put128, 16, shmem)
 225 

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