26 #ifndef MCA_BTL_VADER_H
27 #define MCA_BTL_VADER_H
29 #include "ompi_config.h"
48 #include "opal/include/opal/align.h"
49 #include "opal/class/opal_free_list.h"
56 #include "ompi/mca/common/sm/common_sm.h"
64 #define min(a,b) ((a) < (b) ? (a) : (b))
66 extern int mca_btl_vader_memcpy_limit;
67 extern int mca_btl_vader_log_align;
68 extern int mca_btl_vader_max_inline_send;
75 #define VADER_CACHE_LINE_PAD 128
78 #define VADER_MAX_ADDRESS ((uintptr_t)0x7ffffffff000)
104 xpmem_segid_t my_seg_id;
105 xpmem_segid_t *shm_seg_ids;
148 #define VIRTUAL2RELATIVE(VADDR ) ((intptr_t)(VADDR) - (intptr_t)mca_btl_vader_component.shm_bases[mca_btl_vader_component.my_smp_rank])
149 #define RELATIVE2VIRTUAL(OFFSET) ((intptr_t)(OFFSET) + (intptr_t)mca_btl_vader_component.shm_bases[mca_btl_vader_component.my_smp_rank])
154 size_t size,
int flags)
158 struct xpmem_addr xpmem_addr;
159 uintptr_t base, bound;
162 if (OPAL_UNLIKELY(peer_smp_rank == mca_btl_vader_component.
my_smp_rank)) {
166 base = (uintptr_t) down_align_addr(rem_ptr, mca_btl_vader_log_align);
167 bound = (uintptr_t) up_align_addr((
void *)((uintptr_t) rem_ptr + size - 1),
168 mca_btl_vader_log_align) + 1;
169 if (OPAL_UNLIKELY(bound > VADER_MAX_ADDRESS)) {
170 bound = VADER_MAX_ADDRESS;
174 rc = rcache->rcache_find_all (rcache, (
void *) base, bound - base, regs, 10);
175 for (i = 0 ; i < rc ; ++i) {
176 if (bound <= (uintptr_t)regs[i]->bound && base >= (uintptr_t)regs[i]->base) {
181 if (regs[i]->flags & MCA_MPOOL_FLAGS_PERSIST) {
187 rc = rcache->rcache_delete (rcache, regs[i]);
188 if (OPAL_UNLIKELY(0 != rc)) {
194 base = (uintptr_t) regs[i]->base < base ? (uintptr_t) regs[i]->base : base;
198 if (OPAL_LIKELY(0 == regs[i]->ref_count)) {
200 (void) xpmem_detach (regs[i]->alloc_base);
208 if (OPAL_LIKELY(NULL != reg)) {
211 reg->base = (
unsigned char *) base;
212 reg->bound = (
unsigned char *) bound;
215 xpmem_addr.apid = mca_btl_vader_component.apids[peer_smp_rank];
216 xpmem_addr.offset = base;
218 reg->alloc_base = xpmem_attach (xpmem_addr, bound - base, NULL);
219 if (OPAL_UNLIKELY((
void *)-1 == reg->alloc_base)) {
223 rcache->rcache_insert (rcache, reg, 0);
235 if (OPAL_UNLIKELY(0 == reg->ref_count && !(reg->flags & MCA_MPOOL_FLAGS_PERSIST))) {
236 rcache->rcache_delete (rcache, reg);
237 (void)xpmem_detach (reg->alloc_base);
244 return (
void *) ((uintptr_t) reg->alloc_base +
245 (ptrdiff_t)((uintptr_t) rem_ptr - (uintptr_t) reg->base));
250 static inline void vader_memmove (
void *dst,
void *src,
size_t size)
252 if (size >= (
size_t) mca_btl_vader_memcpy_limit) {
253 memcpy (dst, src, size);
255 memmove (dst, src, size);
268 mca_btl_base_tag_t tag);
279 void *header,
size_t header_size,
280 size_t payload_size, uint8_t order,
281 uint32_t flags, mca_btl_base_tag_t tag,
314 uint8_t order,
size_t size, uint32_t flags);
A descriptor that holds the parameters to a send/put/get operation along w/ a callback routine that i...
Definition: btl.h:275
ompi_free_list_t vader_frags_eager
free list of vader send frags
Definition: btl_vader.h:113
size_t eager_limit
send fragment size
Definition: btl_vader.h:98
mca_mpool_base_module_t * vader_mpool
mpool on local node
Definition: btl_vader.h:96
bool btl_inited
flag indicating if btl has been inited
Definition: btl_vader.h:134
int32_t num_smp_procs
current number of smp procs on this host
Definition: btl_vader.h:110
rcache module descriptor
Definition: rcache.h:83
unsigned char * vader_next_fbox_out
indices of fast boxes to write
Definition: btl_vader.h:122
mca_btl_base_descriptor_t * mca_btl_vader_alloc(struct mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *endpoint, uint8_t order, size_t size, uint32_t flags)
Allocate a segment.
Definition: btl_vader.c:579
Definition: common_sm.h:60
void(* mca_btl_base_module_error_cb_fn_t)(struct mca_btl_base_module_t *btl, int32_t flags, struct ompi_proc_t *errproc, char *btlinfo)
Callback function that is called asynchronously on receipt of an error from the transport layer...
Definition: btl.h:538
char ** shm_bases
pointer to base pointers in shared memory
Definition: btl_vader.h:102
mca_common_sm_module_t * vader_seg
description of shared memory segment
Definition: btl_vader.h:99
int vader_free_list_max
maximum size of free lists
Definition: btl_vader.h:92
unsigned char * vader_next_fbox_in
indices of fast boxes to poll
Definition: btl_vader.h:121
mca_btl_base_module_t super
base BTL interface
Definition: btl_vader.h:133
#define OBJ_RELEASE(object)
Release an object (by decrementing its reference count).
Definition: opal_object.h:324
opal_list_t active_sends
list of outstanding fragments
Definition: btl_vader.h:116
int mca_btl_vader_put(struct mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *endpoint, struct mca_btl_base_descriptor_t *des)
Initiate an synchronous put.
Definition: btl_vader_put.c:25
int32_t my_smp_rank
My SMP process rank.
Definition: btl_vader.h:111
Shared Memory (VADER) BTL module.
Definition: btl_vader.h:89
int mca_btl_vader_send(struct mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *endpoint, struct mca_btl_base_descriptor_t *descriptor, mca_btl_base_tag_t tag)
Initiate a send to the peer.
Definition: btl_vader_send.c:37
Byte Transfer Layer (BTL)
#define opal_atomic_add(ADDR, VALUE)
Atomically increment the content depending on the type.
Definition: atomic.h:597
Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana University Research and Techno...
void * vader_mpool_base
base address of shared memory pool
Definition: btl_vader.h:97
volatile struct vader_fifo_t ** shm_fifo
pointer to fifo 2D array in shared memory
Definition: btl_vader.h:100
Definition: ompi_free_list.h:39
State of ELAN endpoint connection.
Definition: btl_elan_endpoint.h:33
unsigned char ** vader_fboxes_out
outgoing fast boxes (memory belongs to remote peers)
Definition: btl_vader.h:119
BTL component descriptor.
Definition: btl.h:411
Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana University Research and Techno...
Definition: opal_convertor.h:90
int vader_free_list_num
initial size of free lists
Definition: btl_vader.h:91
int mca_btl_vader_get(struct mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *endpoint, struct mca_btl_base_descriptor_t *des)
Initiate an synchronous get.
Definition: btl_vader_get.c:25
struct vader_fifo_t ** fifo
cached copy of the pointer to the 2D fifo array.
Definition: btl_vader.h:106
Definition: opal_list.h:147
char * vader_mpool_name
name of shared memory pool module
Definition: btl_vader.h:95
mca_btl_base_component_2_0_0_t super
base BTL component
Definition: btl_vader.h:90
Definition: btl_vader_fifo.h:50
int mca_btl_vader_sendi(struct mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *endpoint, struct opal_convertor_t *convertor, void *header, size_t header_size, size_t payload_size, uint8_t order, uint32_t flags, mca_btl_base_tag_t tag, mca_btl_base_descriptor_t **descriptor)
Initiate an inline send to the peer.
Definition: btl_vader_sendi.c:38
VADER BTL Interface.
Definition: btl_vader.h:132
ompi_free_list_t vader_frags_user
free list of vader put/get frags
Definition: btl_vader.h:114
unsigned char ** vader_fboxes_in
incomming fast boxes (memory belongs to this process)
Definition: btl_vader.h:118
BTL module interface functions and attributes.
Definition: btl.h:786
int vader_free_list_inc
number of elements to alloc when growing free lists
Definition: btl_vader.h:93
mpool module descriptor.
Definition: mpool.h:174