From a8867a9ca45ba762b6938a69876bd14e3a5d87e0 Mon Sep 17 00:00:00 2001 From: Nathan Hjelm Date: Fri, 7 Feb 2014 23:57:36 +0000 Subject: [PATCH] btl/vader: fix 32-bit support cmr=v1.7.5:ticket=trac:4053 This commit was SVN r30626. The following Trac tickets were found above: Ticket 4053 --> https://svn.open-mpi.org/trac/ompi/ticket/4053 --- ompi/mca/btl/vader/btl_vader.h | 17 -------- ompi/mca/btl/vader/btl_vader_component.c | 8 +++- ompi/mca/btl/vader/btl_vader_fifo.h | 50 ++++++++++++++++++------ ompi/mca/btl/vader/btl_vader_module.c | 3 +- 4 files changed, 47 insertions(+), 31 deletions(-) diff --git a/ompi/mca/btl/vader/btl_vader.h b/ompi/mca/btl/vader/btl_vader.h index e8d4ce28a7..19a650e9de 100644 --- a/ompi/mca/btl/vader/btl_vader.h +++ b/ompi/mca/btl/vader/btl_vader.h @@ -158,23 +158,6 @@ OMPI_MODULE_DECLSPEC extern mca_btl_vader_t mca_btl_vader; /* local rank in the group */ #define MCA_BTL_VADER_LOCAL_RANK ompi_process_info.my_local_rank - -/* This only works for finding the relative address for a pointer within my_segment */ -static inline intptr_t virtual2relative (char *addr) -{ - return (intptr_t) (addr - mca_btl_vader_component.my_segment) | ((int64_t)MCA_BTL_VADER_LOCAL_RANK << 32); -} - -static inline intptr_t virtual2relativepeer (struct mca_btl_base_endpoint_t *endpoint, char *addr) -{ - return (intptr_t) (addr - endpoint->segment_base) | ((int64_t)endpoint->peer_smp_rank << 32); -} - -static inline void *relative2virtual (intptr_t offset) -{ - return (void *)((offset & 0xffffffffull) + mca_btl_vader_component.endpoints[offset >> 32].segment_base); -} - /* memcpy is faster at larger sizes but is undefined if the pointers are aliased (TODO -- readd alias check) */ static inline void vader_memmove (void *dst, void *src, size_t size) diff --git a/ompi/mca/btl/vader/btl_vader_component.c b/ompi/mca/btl/vader/btl_vader_component.c index 4f7e50a993..7033866e57 100644 --- a/ompi/mca/btl/vader/btl_vader_component.c +++ b/ompi/mca/btl/vader/btl_vader_component.c @@ -118,14 +118,14 @@ static int mca_btl_vader_component_register (void) MCA_BASE_VAR_SCOPE_LOCAL, &mca_btl_vader_component.log_attach_align); -#if OMPI_BTL_VADER_HAVE_XPMEM +#if OMPI_BTL_VADER_HAVE_XPMEM && 64 == MCA_BTL_VADER_BITNESS mca_btl_vader_component.segment_size = 1 << 24; #else mca_btl_vader_component.segment_size = 1 << 22; #endif (void) mca_base_component_var_register(&mca_btl_vader_component.super.btl_version, "segment_size", "Maximum size of all shared " -#if OMPI_BTL_VADER_HAVE_XPMEM +#if OMPI_BTL_VADER_HAVE_XPMEM && 64 == MCA_BTL_VADER_BITNESS "memory buffers (default: 16M)", #else "memory buffers (default: 4M)", @@ -273,6 +273,10 @@ static mca_btl_base_module_t **mca_btl_vader_component_init (int *num_btls, mca_btl_vader_component.segment_size = (2 << 20); } + if (mca_btl_vader_component.segment_size > (1 << MCA_BTL_VADER_OFFSET_BITS)) { + mca_btl_vader_component.segment_size = 2 << MCA_BTL_VADER_OFFSET_BITS; + } + #if OMPI_BTL_VADER_HAVE_XPMEM /* create an xpmem segment for the entire memory space */ component->my_seg_id = xpmem_make (0, 0xffffffffffffffffll, XPMEM_PERMIT_MODE, diff --git a/ompi/mca/btl/vader/btl_vader_fifo.h b/ompi/mca/btl/vader/btl_vader_fifo.h index 9115235c56..55f1bf5204 100644 --- a/ompi/mca/btl/vader/btl_vader_fifo.h +++ b/ompi/mca/btl/vader/btl_vader_fifo.h @@ -30,15 +30,27 @@ #include "btl_vader_endpoint.h" #include "btl_vader_frag.h" -#if OPAL_HAVE_ATOMIC_MATH_64 -#define vader_item_cmpset(x, y, z) opal_atomic_cmpset_64((volatile int64_t *)(x), (int64_t)(y), (int64_t)(z)) -#define vader_item_swap(x, y) opal_atomic_swap_64((volatile int64_t *)(x), (int64_t)(y)) +#if SIZEOF_VOID_P == 8 + #define vader_item_cmpset(x, y, z) opal_atomic_cmpset_64((volatile int64_t *)(x), (int64_t)(y), (int64_t)(z)) + #define vader_item_swap(x, y) opal_atomic_swap_64((volatile int64_t *)(x), (int64_t)(y)) + + #define MCA_BTL_VADER_OFFSET_MASK 0xffffffffll + #define MCA_BTL_VADER_OFFSET_BITS 32 + #define MCA_BTL_VADER_BITNESS 64 + + typedef int64_t fifo_value_t; #else -#define vader_item_cmpset(x, y, z) opal_atomic_cmpset_32((volatile int32_t *)(x), (int32_t)(y), (int32_t)(z)) -#define vader_item_swap(x, y) opal_atomic_swap_32((volatile int32_t *)(x), (int32_t)(y)) + #define vader_item_cmpset(x, y, z) opal_atomic_cmpset_32((volatile int32_t *)(x), (int32_t)(y), (int32_t)(z)) + #define vader_item_swap(x, y) opal_atomic_swap_32((volatile int32_t *)(x), (int32_t)(y)) + + #define MCA_BTL_VADER_OFFSET_MASK 0x00ffffffl + #define MCA_BTL_VADER_OFFSET_BITS 24 + #define MCA_BTL_VADER_BITNESS 32 + + typedef int32_t fifo_value_t; #endif -#define VADER_FIFO_FREE ((intptr_t)-2) +#define VADER_FIFO_FREE ((fifo_value_t)-2) /* * Shared Memory FIFOs @@ -56,17 +68,33 @@ /* lock free fifo */ typedef struct vader_fifo_t { - volatile intptr_t fifo_head; - volatile intptr_t fifo_tail; + volatile fifo_value_t fifo_head; + volatile fifo_value_t fifo_tail; } vader_fifo_t; /* large enough to ensure the fifo is on its own cache line */ #define MCA_BTL_VADER_FIFO_SIZE 128 +/* This only works for finding the relative address for a pointer within my_segment */ +static inline fifo_value_t virtual2relative (char *addr) +{ + return (fifo_value_t) ((intptr_t) (addr - mca_btl_vader_component.my_segment)) | ((fifo_value_t)MCA_BTL_VADER_LOCAL_RANK << MCA_BTL_VADER_OFFSET_BITS); +} + +static inline fifo_value_t virtual2relativepeer (struct mca_btl_base_endpoint_t *endpoint, char *addr) +{ + return (fifo_value_t) ((intptr_t) (addr - endpoint->segment_base)) | ((fifo_value_t)endpoint->peer_smp_rank << MCA_BTL_VADER_OFFSET_BITS); +} + +static inline void *relative2virtual (fifo_value_t offset) +{ + return (void *)(intptr_t)((offset & MCA_BTL_VADER_OFFSET_MASK) + mca_btl_vader_component.endpoints[offset >> MCA_BTL_VADER_OFFSET_BITS].segment_base); +} + static inline mca_btl_vader_hdr_t *vader_fifo_read (vader_fifo_t *fifo) { mca_btl_vader_hdr_t *hdr; - intptr_t value; + fifo_value_t value; opal_atomic_rmb (); @@ -107,9 +135,9 @@ static inline int vader_fifo_init (vader_fifo_t *fifo) return OMPI_SUCCESS; } -static inline void vader_fifo_write (vader_fifo_t *fifo, intptr_t value) +static inline void vader_fifo_write (vader_fifo_t *fifo, fifo_value_t value) { - intptr_t prev; + fifo_value_t prev; opal_atomic_wmb (); prev = vader_item_swap (&fifo->fifo_tail, value); diff --git a/ompi/mca/btl/vader/btl_vader_module.c b/ompi/mca/btl/vader/btl_vader_module.c index 7104e5d5c8..3480416fc2 100644 --- a/ompi/mca/btl/vader/btl_vader_module.c +++ b/ompi/mca/btl/vader/btl_vader_module.c @@ -184,7 +184,8 @@ static int init_vader_endpoint (struct mca_btl_base_endpoint_t *ep, struct ompi_ (void) vader_get_registation (ep, modex->segment_base, mca_btl_vader_component.segment_size, MCA_MPOOL_FLAGS_PERSIST, (void **) &ep->segment_base); #else - opal_shmem_ds_copy (&modex->seg_ds, &ep->seg_ds); + msg_size -= offsetof (struct vader_modex_t, seg_ds); + memcpy (&ep->seg_ds, &modex->seg_ds, msg_size); ep->segment_base = opal_shmem_segment_attach (&ep->seg_ds); if (NULL == ep->segment_base) { return rc;