1
1

Adding more fixes to stomp casting/addressing issues on 32-bit systems.

This commit was SVN r29164.
Этот коммит содержится в:
Joshua Ladd 2013-09-13 20:37:30 +00:00
родитель 096b8c022e
Коммит 027e7deb7f
14 изменённых файлов: 116 добавлений и 101 удалений

Просмотреть файл

@ -38,7 +38,7 @@ OSHMEM_DECLSPEC extern struct mca_memheap_base_module_t* mca_memheap_base_module
#define MEMHEAP_BASE_PRIVATE_SIZE (1ULL << MEMHEAP_BASE_PAGE_ORDER) /* should be at least the same as a huge page size */ #define MEMHEAP_BASE_PRIVATE_SIZE (1ULL << MEMHEAP_BASE_PAGE_ORDER) /* should be at least the same as a huge page size */
#define MEMHEAP_BASE_MIN_SIZE (1ULL << MEMHEAP_BASE_PAGE_ORDER) /* must fit into at least one huge page */ #define MEMHEAP_BASE_MIN_SIZE (1ULL << MEMHEAP_BASE_PAGE_ORDER) /* must fit into at least one huge page */
extern unsigned long long mca_memheap_base_start_address; extern void* mca_memheap_base_start_address;
extern char* mca_memheap_base_include; extern char* mca_memheap_base_include;
extern char* mca_memheap_base_exclude; extern char* mca_memheap_base_exclude;
extern int mca_memheap_base_already_opened; extern int mca_memheap_base_already_opened;
@ -84,8 +84,8 @@ typedef struct map_segment_t {
int is_active; /* enable/disable flag */ int is_active; /* enable/disable flag */
int shmid; int shmid;
uint64_t start; /* base address of the segment */ void* start; /* base address of the segment */
uint64_t end; /* final address of the segment */ void* end; /* final address of the segment */
size_t size; /* length of the segment */ size_t size; /* length of the segment */
segment_type_t type; /* type of the segment */ segment_type_t type; /* type of the segment */
@ -111,15 +111,15 @@ void memheap_oob_destruct(void);
OSHMEM_DECLSPEC uint64_t mca_memheap_base_find_offset(int pe, OSHMEM_DECLSPEC uint64_t mca_memheap_base_find_offset(int pe,
int tr_id, int tr_id,
unsigned long va, void* va,
uint64_t rva); void* rva);
OSHMEM_DECLSPEC int mca_memheap_base_is_symmetric_addr(unsigned long va); OSHMEM_DECLSPEC int mca_memheap_base_is_symmetric_addr(const void* va);
OSHMEM_DECLSPEC mca_spml_mkey_t *mca_memheap_base_get_mkey(unsigned long va, OSHMEM_DECLSPEC mca_spml_mkey_t *mca_memheap_base_get_mkey(void* va,
int tr_id); int tr_id);
OSHMEM_DECLSPEC mca_spml_mkey_t * mca_memheap_base_get_cached_mkey(int pe, OSHMEM_DECLSPEC mca_spml_mkey_t * mca_memheap_base_get_cached_mkey(int pe,
unsigned long va, void* va,
int btl_id, int btl_id,
uint64_t *rva); void** rva);
OSHMEM_DECLSPEC void mca_memheap_modex_recv_all(void); OSHMEM_DECLSPEC void mca_memheap_modex_recv_all(void);
/* This function is for internal usage only /* This function is for internal usage only
@ -133,7 +133,7 @@ typedef enum {
ADDR_INVALID = 0, ADDR_USER, ADDR_PRIVATE, ADDR_STATIC, ADDR_INVALID = 0, ADDR_USER, ADDR_PRIVATE, ADDR_STATIC,
} addr_type_t; } addr_type_t;
OSHMEM_DECLSPEC int mca_memheap_base_detect_addr_type(unsigned long va); OSHMEM_DECLSPEC int mca_memheap_base_detect_addr_type(void* va);
static inline unsigned memheap_log2(unsigned long long val) static inline unsigned memheap_log2(unsigned long long val)
{ {

Просмотреть файл

@ -243,7 +243,7 @@ static int __shm_attach(map_segment_t *s, size_t size, int use_hp, int do_rmid)
s->type = MAP_SEGMENT_ALLOC_SHM; s->type = MAP_SEGMENT_ALLOC_SHM;
s->shmid = shmid; s->shmid = shmid;
s->start = (uintptr_t) addr; s->start = addr;
s->size = size; s->size = size;
s->end = s->start + s->size; s->end = s->start + s->size;
s->context = &shm_context; s->context = &shm_context;
@ -295,7 +295,7 @@ MAP_ANONYMOUS
s->type = MAP_SEGMENT_ALLOC_MMAP; s->type = MAP_SEGMENT_ALLOC_MMAP;
s->shmid = MEMHEAP_SHM_INVALID; s->shmid = MEMHEAP_SHM_INVALID;
s->start = (uintptr_t) addr; s->start = addr;
s->size = size; s->size = size;
s->end = s->start + s->size; s->end = s->start + s->size;
s->context = NULL; s->context = NULL;
@ -472,7 +472,7 @@ static int __ibv_attach(map_segment_t *s, size_t size)
s->type = MAP_SEGMENT_ALLOC_IBV; s->type = MAP_SEGMENT_ALLOC_IBV;
s->shmid = device->ib_mr_shared->handle; s->shmid = device->ib_mr_shared->handle;
s->start = (intptr_t)ib_mr->addr; s->start = ib_mr->addr;
s->size = size; s->size = size;
s->end = s->start + s->size; s->end = s->start + s->size;
s->context = &memheap_device; s->context = &memheap_device;

Просмотреть файл

@ -33,7 +33,7 @@ int mca_memheap_base_alloc_type = 5;
int mca_memheap_base_alloc_type = 1; int mca_memheap_base_alloc_type = 1;
#endif /* MPAGE_ENABLE */ #endif /* MPAGE_ENABLE */
unsigned long long int mca_memheap_base_start_address = 0xFF000000; void* mca_memheap_base_start_address = (void*)0xFF000000;
int mca_memheap_base_output = -1; int mca_memheap_base_output = -1;
int mca_memheap_base_key_exchange = 1; int mca_memheap_base_key_exchange = 1;
int mca_memheap_base_mr_interleave_factor = 2; int mca_memheap_base_mr_interleave_factor = 2;

Просмотреть файл

@ -66,33 +66,33 @@ static int memheap_oob_get_mkeys(int pe,
uint32_t va_seg_num, uint32_t va_seg_num,
mca_spml_mkey_t *mkey); mca_spml_mkey_t *mkey);
static inline unsigned long __seg2base_va(int seg) static inline void* __seg2base_va(int seg)
{ {
return memheap_map->mem_segs[seg].start; return memheap_map->mem_segs[seg].start;
} }
static int __seg_cmp(const void *k, const void *v) static int __seg_cmp(const void *k, const void *v)
{ {
unsigned long va = (unsigned long) k; uintptr_t va = (uintptr_t) k;
map_segment_t *s = (map_segment_t *) v; map_segment_t *s = (map_segment_t *) v;
if (va < s->start) if (va < (uintptr_t)s->start)
return -1; return -1;
if (va >= s->end) if (va >= (uintptr_t)s->end)
return 1; return 1;
return 0; return 0;
} }
static inline map_segment_t *__find_va(unsigned long va) static inline map_segment_t *__find_va(const void* va)
{ {
map_segment_t *s; map_segment_t *s;
if (OPAL_LIKELY(va >= (unsigned long)memheap_map->mem_segs[HEAP_SEG_INDEX].start && if (OPAL_LIKELY((uintptr_t)va >= (uintptr_t)memheap_map->mem_segs[HEAP_SEG_INDEX].start &&
va < (unsigned long)memheap_map->mem_segs[HEAP_SEG_INDEX].end)) { (uintptr_t)va < (uintptr_t)memheap_map->mem_segs[HEAP_SEG_INDEX].end)) {
s = &memheap_map->mem_segs[HEAP_SEG_INDEX]; s = &memheap_map->mem_segs[HEAP_SEG_INDEX];
} else { } else {
s = bsearch((const void *) va, s = bsearch(va,
&memheap_map->mem_segs[SYMB_SEG_INDEX], &memheap_map->mem_segs[SYMB_SEG_INDEX],
memheap_map->n_segments - 1, memheap_map->n_segments - 1,
sizeof(*s), sizeof(*s),
@ -155,8 +155,8 @@ static int do_mkey_req(opal_buffer_t *msg, int pe, int seg)
} }
MEMHEAP_VERBOSE(5, MEMHEAP_VERBOSE(5,
"seg#%d tr_id: %d key %llx base_va %llx", "seg#%d tr_id: %d key %llx base_va %p",
seg, tr_id, (unsigned long long)mkey->key, (unsigned long long)mkey->va_base); seg, tr_id, (unsigned long long)mkey->key, mkey->va_base);
} }
return OSHMEM_SUCCESS; return OSHMEM_SUCCESS;
} }
@ -171,15 +171,15 @@ static void memheap_attach_segment(mca_spml_mkey_t *mkey, int tr_id)
if (!mkey->va_base if (!mkey->va_base
&& ((int) MEMHEAP_SHM_GET_ID(mkey->key) != MEMHEAP_SHM_INVALID)) { && ((int) MEMHEAP_SHM_GET_ID(mkey->key) != MEMHEAP_SHM_INVALID)) {
MEMHEAP_VERBOSE(5, MEMHEAP_VERBOSE(5,
"shared memory usage tr_id: %d key %llx base_va %llx shmid 0x%X|0x%X", "shared memory usage tr_id: %d key %llx base_va %p shmid 0x%X|0x%X",
tr_id, tr_id,
(unsigned long long)mkey->key, (unsigned long long)mkey->key,
(unsigned long long)mkey->va_base, mkey->va_base,
MEMHEAP_SHM_GET_TYPE(mkey->key), MEMHEAP_SHM_GET_TYPE(mkey->key),
MEMHEAP_SHM_GET_ID(mkey->key)); MEMHEAP_SHM_GET_ID(mkey->key));
if (MEMHEAP_SHM_GET_TYPE(mkey->key) == MAP_SEGMENT_ALLOC_SHM) { if (MEMHEAP_SHM_GET_TYPE(mkey->key) == MAP_SEGMENT_ALLOC_SHM) {
mkey->va_base = (intptr_t) shmat(MEMHEAP_SHM_GET_ID(mkey->key), mkey->va_base = shmat(MEMHEAP_SHM_GET_ID(mkey->key),
0, 0,
0); 0);
} else if (MEMHEAP_SHM_GET_TYPE(mkey->key) == MAP_SEGMENT_ALLOC_IBV) { } else if (MEMHEAP_SHM_GET_TYPE(mkey->key) == MAP_SEGMENT_ALLOC_IBV) {
@ -204,7 +204,7 @@ static void memheap_attach_segment(mca_spml_mkey_t *mkey, int tr_id)
device->ib_pd, addr, access_flag); device->ib_pd, addr, access_flag);
if (NULL == ib_mr) if (NULL == ib_mr)
{ {
mkey->va_base = -1; mkey->va_base = (void*)-1;
MEMHEAP_ERROR("error to ibv_reg_shared_mr() errno says %d: %s", MEMHEAP_ERROR("error to ibv_reg_shared_mr() errno says %d: %s",
errno, strerror(errno)); errno, strerror(errno));
} }
@ -215,7 +215,7 @@ static void memheap_attach_segment(mca_spml_mkey_t *mkey, int tr_id)
} }
opal_value_array_append_item(&device->ib_mr_array, &ib_mr); opal_value_array_append_item(&device->ib_mr_array, &ib_mr);
mkey->va_base = (intptr_t)ib_mr->addr; mkey->va_base = ib_mr->addr;
} }
#endif /* MPAGE_ENABLE */ #endif /* MPAGE_ENABLE */
} else { } else {
@ -267,8 +267,8 @@ static void do_mkey_resp(opal_buffer_t *msg)
memheap_attach_segment(&memheap_oob.mkeys[tr_id], tr_id); memheap_attach_segment(&memheap_oob.mkeys[tr_id], tr_id);
MEMHEAP_VERBOSE(5, MEMHEAP_VERBOSE(5,
"tr_id: %d key %llx base_va %llx", "tr_id: %d key %llx base_va %p",
tr_id, (unsigned long long)memheap_oob.mkeys[tr_id].key, (unsigned long long)memheap_oob.mkeys[tr_id].va_base); tr_id, (unsigned long long)memheap_oob.mkeys[tr_id].key, memheap_oob.mkeys[tr_id].va_base);
} }
} }
@ -401,11 +401,11 @@ static int memheap_oob_get_mkeys(int pe, uint32_t seg, mca_spml_mkey_t *mkeys)
for (i = 0; i < memheap_map->num_transports; i++) { for (i = 0; i < memheap_map->num_transports; i++) {
mkeys[i].va_base = __seg2base_va(seg); mkeys[i].va_base = __seg2base_va(seg);
MEMHEAP_VERBOSE(5, MEMHEAP_VERBOSE(5,
"MKEY CALCULATED BY LOCAL SPML: pe: %d tr_id: %d key %llx base_va %llx", "MKEY CALCULATED BY LOCAL SPML: pe: %d tr_id: %d key %llx base_va %p",
pe, pe,
i, i,
(unsigned long long)mkeys[i].key, (unsigned long long)mkeys[i].key,
(unsigned long long)mkeys[i].va_base); mkeys[i].va_base);
} }
return OSHMEM_SUCCESS; return OSHMEM_SUCCESS;
} }
@ -461,7 +461,7 @@ void mca_memheap_modex_recv_all(void)
int nprocs, my_pe; int nprocs, my_pe;
oshmem_proc_t *proc; oshmem_proc_t *proc;
mca_spml_mkey_t *mkey; mca_spml_mkey_t *mkey;
uint64_t dummy_rva; void* dummy_rva;
if (!mca_memheap_base_key_exchange) if (!mca_memheap_base_key_exchange)
return; return;
@ -524,24 +524,24 @@ void mca_memheap_modex_recv_all(void)
} }
} }
static inline uint64_t va2rva(unsigned long va, static inline void* va2rva(void* va,
uint64_t local_base, void* local_base,
uint64_t remote_base) void* remote_base)
{ {
return remote_base > local_base ? va + (remote_base - local_base) : return (void*) (remote_base > local_base ? (uintptr_t)va + (remote_base - local_base) :
va - (local_base - remote_base); (uintptr_t)va - (local_base - remote_base));
} }
mca_spml_mkey_t * mca_memheap_base_get_cached_mkey(int pe, mca_spml_mkey_t * mca_memheap_base_get_cached_mkey(int pe,
unsigned long va, void* va,
int btl_id, int btl_id,
uint64_t *rva) void** rva)
{ {
map_segment_t *s; map_segment_t *s;
int rc; int rc;
mca_spml_mkey_t *mkey; mca_spml_mkey_t *mkey;
MEMHEAP_VERBOSE_FASTPATH(10, "rkey: pe=%d va=%p", pe, (void *)va); MEMHEAP_VERBOSE_FASTPATH(10, "rkey: pe=%d va=%p", pe, va);
s = __find_va(va); s = __find_va(va);
if (NULL == s) if (NULL == s)
return NULL ; return NULL ;
@ -551,8 +551,8 @@ mca_spml_mkey_t * mca_memheap_base_get_cached_mkey(int pe,
if (pe == oshmem_my_proc_id()) { if (pe == oshmem_my_proc_id()) {
*rva = va; *rva = va;
MEMHEAP_VERBOSE_FASTPATH(10, "rkey: pe=%d va=%p -> (local) %lx %p", pe, (void *)va, MEMHEAP_VERBOSE_FASTPATH(10, "rkey: pe=%d va=%p -> (local) %lx %p", pe, va,
s->mkeys[btl_id].key, (void *)*rva); s->mkeys[btl_id].key, *rva);
return &s->mkeys[btl_id]; return &s->mkeys[btl_id];
} }
@ -581,7 +581,7 @@ mca_spml_mkey_t * mca_memheap_base_get_cached_mkey(int pe,
return mkey; return mkey;
} }
mca_spml_mkey_t *mca_memheap_base_get_mkey(unsigned long va, int tr_id) mca_spml_mkey_t *mca_memheap_base_get_mkey(void* va, int tr_id)
{ {
map_segment_t *s; map_segment_t *s;
@ -592,8 +592,8 @@ mca_spml_mkey_t *mca_memheap_base_get_mkey(unsigned long va, int tr_id)
uint64_t mca_memheap_base_find_offset(int pe, uint64_t mca_memheap_base_find_offset(int pe,
int tr_id, int tr_id,
unsigned long va, void* va,
uint64_t rva) void* rva)
{ {
map_segment_t *s; map_segment_t *s;
@ -602,12 +602,12 @@ uint64_t mca_memheap_base_find_offset(int pe,
return ((s && s->is_active) ? (rva - s->mkeys_cache[pe][tr_id].va_base) : 0); return ((s && s->is_active) ? (rva - s->mkeys_cache[pe][tr_id].va_base) : 0);
} }
int mca_memheap_base_is_symmetric_addr(unsigned long va) int mca_memheap_base_is_symmetric_addr(const void* va)
{ {
return (__find_va(va) ? 1 : 0); return (__find_va(va) ? 1 : 0);
} }
int mca_memheap_base_detect_addr_type(unsigned long va) int mca_memheap_base_detect_addr_type(void* va)
{ {
int addr_type = ADDR_INVALID; int addr_type = ADDR_INVALID;
map_segment_t *s; map_segment_t *s;
@ -617,11 +617,11 @@ int mca_memheap_base_detect_addr_type(unsigned long va)
if (s) { if (s) {
if (s->type == MAP_SEGMENT_STATIC) { if (s->type == MAP_SEGMENT_STATIC) {
addr_type = ADDR_STATIC; addr_type = ADDR_STATIC;
} else if (va >= (unsigned long) s->start } else if ((uintptr_t)va >= (uintptr_t) s->start
&& va < (unsigned long) (s->start + mca_memheap.memheap_size)) { && (uintptr_t)va < (uintptr_t) (s->start + mca_memheap.memheap_size)) {
addr_type = ADDR_USER; addr_type = ADDR_USER;
} else { } else {
assert( va >= (unsigned long)(s->start + mca_memheap.memheap_size) && va < (unsigned long)s->end); assert( (uintptr_t)va >= (uintptr_t)(s->start + mca_memheap.memheap_size) && (uintptr_t)va < (uintptr_t)s->end);
addr_type = ADDR_PRIVATE; addr_type = ADDR_PRIVATE;
} }
} }

Просмотреть файл

@ -27,10 +27,10 @@ int mca_memheap_base_reg(mca_memheap_map_t *memheap_map)
map_segment_t *s = &memheap_map->mem_segs[i]; map_segment_t *s = &memheap_map->mem_segs[i];
MEMHEAP_VERBOSE(5, MEMHEAP_VERBOSE(5,
"register seg#%02d: 0x%llX - 0x%llX %llu bytes type=0x%X id=0x%X", "register seg#%02d: 0x%p - 0x%p %llu bytes type=0x%X id=0x%X",
i, i,
(long long)s->start, s->start,
(long long)s->end, s->end,
(long long)(s->end - s->start), (long long)(s->end - s->start),
s->type, s->type,
s->shmid); s->shmid);
@ -52,10 +52,10 @@ int mca_memheap_base_dereg(mca_memheap_map_t *memheap_map)
continue; continue;
MEMHEAP_VERBOSE(5, MEMHEAP_VERBOSE(5,
"deregistering segment#%d: %llx - %llx %llu bytes", "deregistering segment#%d: %p - %p %llu bytes",
i, i,
(long long)s->start, s->start,
(long long)s->end, s->end,
(long long)(s->end - s->start)); (long long)(s->end - s->start));
ret = __dereg_segment(s); ret = __dereg_segment(s);
} }

Просмотреть файл

@ -16,8 +16,8 @@
#include <stdio.h> #include <stdio.h>
struct map_segment_desc { struct map_segment_desc {
uint64_t start; void* start;
uint64_t end; void* end;
char perms[8]; char perms[8];
uint64_t offset; uint64_t offset;
char dev[8]; char dev[8];
@ -27,8 +27,8 @@ struct map_segment_desc {
typedef struct memheap_static_context { typedef struct memheap_static_context {
struct { struct {
uint64_t start; void* start;
uint64_t end; void* end;
} mem_segs[MCA_MEMHEAP_MAX_SEGMENTS]; } mem_segs[MCA_MEMHEAP_MAX_SEGMENTS];
int n_segments; int n_segments;
} memheap_static_context_t; } memheap_static_context_t;
@ -93,7 +93,7 @@ static int __check_perms(struct map_segment_desc *seg)
static int __check_address(struct map_segment_desc *seg) static int __check_address(struct map_segment_desc *seg)
{ {
extern unsigned _end; extern unsigned _end;
unsigned long data_end = (unsigned long) &_end; void* data_end = &_end;
/** /**
* SGI shmem only supports globals&static in main program. * SGI shmem only supports globals&static in main program.
@ -104,10 +104,10 @@ static int __check_address(struct map_segment_desc *seg)
* FIXME: make sure we do not register symmetric heap twice * FIXME: make sure we do not register symmetric heap twice
* if we decide to allow shared objects * if we decide to allow shared objects
*/ */
if (seg->start > data_end) { if ((uintptr_t)seg->start > (uintptr_t)data_end) {
MEMHEAP_VERBOSE(100, MEMHEAP_VERBOSE(100,
"skip segment: data _end < segment start (%llx < %llx)", "skip segment: data _end < segment start (%p < %p)",
(unsigned long long)data_end, (unsigned long long)seg->start); data_end, seg->start);
return OSHMEM_ERROR; return OSHMEM_ERROR;
} }
return OSHMEM_SUCCESS; return OSHMEM_SUCCESS;

Просмотреть файл

@ -90,13 +90,12 @@ static inline int test_bit(int nr, const volatile void * addr)
static inline __opal_attribute_always_inline__ unsigned long __ffs(unsigned long word) static inline __opal_attribute_always_inline__ unsigned long __ffs(unsigned long word)
{ {
int num = 0; int num = 0;
#if __SIZEOF_LONG__ == 8
if(bits_per_long() == 64) {
if ((word & 0xffffffff) == 0) { if ((word & 0xffffffff) == 0) {
num += 32; num += 32;
word >>= 32; word >>= 32;
} }
} #endif
if ((word & 0xffff) == 0) { if ((word & 0xffff) == 0) {
num += 16; num += 16;

Просмотреть файл

@ -58,18 +58,18 @@ typedef int (*mca_memheap_base_module_free_fn_t)(void*);
*/ */
typedef uint64_t (*mca_memheap_base_module_find_offset_fn_t)(int pe, typedef uint64_t (*mca_memheap_base_module_find_offset_fn_t)(int pe,
int tr_id, int tr_id,
unsigned long va, void* va,
uint64_t rva); void* rva);
/** /**
* @return mkey suitable to access pe via given transport id. rva is set to virtual address mapping of (va) * @return mkey suitable to access pe via given transport id. rva is set to virtual address mapping of (va)
* on remote pe. * on remote pe.
*/ */
typedef mca_spml_mkey_t * (*mca_memheap_base_module_get_cached_mkey_fn_t)(int pe, typedef mca_spml_mkey_t * (*mca_memheap_base_module_get_cached_mkey_fn_t)(int pe,
unsigned long va, void* va,
int transport_id, int transport_id,
uint64_t *rva); void** rva);
typedef mca_spml_mkey_t * (*mca_memheap_base_module_get_local_mkey_fn_t)(unsigned long va, typedef mca_spml_mkey_t * (*mca_memheap_base_module_get_local_mkey_fn_t)(void* va,
int transport_id); int transport_id);
/* /*
@ -77,7 +77,7 @@ typedef mca_spml_mkey_t * (*mca_memheap_base_module_get_local_mkey_fn_t)(unsigne
*/ */
typedef int (*mca_memheap_base_module_finalize_fn_t)(void); typedef int (*mca_memheap_base_module_finalize_fn_t)(void);
typedef int (*mca_memheap_base_is_memheap_addr_fn_t)(unsigned long va); typedef int (*mca_memheap_base_is_memheap_addr_fn_t)(const void* va);
/* get mkeys from all ranks */ /* get mkeys from all ranks */
typedef void (*mca_memheap_base_mkey_exchange_fn_t)(void); typedef void (*mca_memheap_base_mkey_exchange_fn_t)(void);

Просмотреть файл

@ -80,7 +80,7 @@ typedef struct mca_spml_mkey {
} ib; } ib;
uint64_t key; uint64_t key;
}; };
uint64_t va_base; void* va_base;
void *spml_context; /* spml module can attach internal structures here */ void *spml_context; /* spml module can attach internal structures here */
} mca_spml_mkey_t; } mca_spml_mkey_t;

Просмотреть файл

@ -98,7 +98,7 @@ static char *btl_type2str(int btl_type)
static inline void calc_nfrags(mca_bml_base_btl_t* bml_btl, static inline void calc_nfrags(mca_bml_base_btl_t* bml_btl,
size_t size, size_t size,
int *frag_size, unsigned int *frag_size,
int *nfrags, int *nfrags,
int use_send) int use_send)
{ {
@ -428,11 +428,11 @@ mca_spml_mkey_t *mca_spml_yoda_register(void* addr,
} }
} }
mkeys[i].va_base = (unsigned long) addr; mkeys[i].va_base = addr;
SPML_VERBOSE(5, SPML_VERBOSE(5,
"rank %d btl %s rkey %x lkey %x key %llx address 0x%llX len %llu shmid 0x%X|0x%X", "rank %d btl %s rkey %x lkey %x key %llx address 0x%p len %llu shmid 0x%X|0x%X",
oshmem_proc_local_proc->proc_name.vpid, btl_type2str(ybtl->btl_type), mkeys[i].ib.rkey, mkeys[i].ib.lkey, (unsigned long long)mkeys[i].key, (unsigned long long)mkeys[i].va_base, (unsigned long long)size, MEMHEAP_SHM_GET_TYPE(shmid), MEMHEAP_SHM_GET_ID(shmid)); oshmem_proc_local_proc->proc_name.vpid, btl_type2str(ybtl->btl_type), mkeys[i].ib.rkey, mkeys[i].ib.lkey, (unsigned long long)mkeys[i].key, mkeys[i].va_base, (unsigned long long)size, MEMHEAP_SHM_GET_TYPE(shmid), MEMHEAP_SHM_GET_ID(shmid));
} }
OBJ_DESTRUCT(&convertor); OBJ_DESTRUCT(&convertor);
*count = mca_spml_yoda.n_btls; *count = mca_spml_yoda.n_btls;
@ -724,10 +724,10 @@ static inline int mca_spml_yoda_put_internal(void *dst_addr,
int nfrags; int nfrags;
int i; int i;
unsigned ncopied = 0; unsigned ncopied = 0;
int frag_size = 0; unsigned int frag_size = 0;
char *p_src, *p_dst; char *p_src, *p_dst;
mca_spml_yoda_context_t* yoda_context; mca_spml_yoda_context_t* yoda_context;
uint64_t rva; void* rva;
mca_spml_mkey_t *r_mkey; mca_spml_mkey_t *r_mkey;
int btl_id = 0; int btl_id = 0;
struct yoda_btl *ybtl; struct yoda_btl *ybtl;
@ -749,7 +749,7 @@ static inline int mca_spml_yoda_put_internal(void *dst_addr,
/* Get rkey of remote PE (dst proc) which must be on memheap*/ /* Get rkey of remote PE (dst proc) which must be on memheap*/
r_mkey = mca_memheap.memheap_get_cached_mkey(dst, r_mkey = mca_memheap.memheap_get_cached_mkey(dst,
(unsigned long) dst_addr, dst_addr,
btl_id, btl_id,
&rva); &rva);
if (!r_mkey) { if (!r_mkey) {
@ -769,7 +769,7 @@ static inline int mca_spml_yoda_put_internal(void *dst_addr,
* just do memcpy * just do memcpy
*/ */
if ((ybtl->btl_type == YODA_BTL_SM) if ((ybtl->btl_type == YODA_BTL_SM)
&& OPAL_LIKELY(mca_memheap.memheap_is_symmetric_addr((unsigned long)dst_addr) && (unsigned long)dst_addr != rva)) { && OPAL_LIKELY(mca_memheap.memheap_is_symmetric_addr(dst_addr) && dst_addr != rva)) {
memcpy((void *) (unsigned long) rva, src_addr, size); memcpy((void *) (unsigned long) rva, src_addr, size);
return OSHMEM_SUCCESS; return OSHMEM_SUCCESS;
} }
@ -783,7 +783,7 @@ static inline int mca_spml_yoda_put_internal(void *dst_addr,
/* Allocating send request from free list */ /* Allocating send request from free list */
putreq = mca_spml_yoda_putreq_alloc(dst); putreq = mca_spml_yoda_putreq_alloc(dst);
frag = &putreq->put_frag; frag = &putreq->put_frag;
ncopied = i < nfrags - 1 ? (unsigned)frag_size : (char *) src_addr + size - p_src; ncopied = i < nfrags - 1 ? frag_size :(unsigned) ((char *) src_addr + size - p_src);
/* Preparing source buffer */ /* Preparing source buffer */
@ -993,9 +993,9 @@ int mca_spml_yoda_get(void* src_addr, size_t size, void* dst_addr, int src)
{ {
int rc = OSHMEM_SUCCESS; int rc = OSHMEM_SUCCESS;
mca_spml_mkey_t *r_mkey, *l_mkey; mca_spml_mkey_t *r_mkey, *l_mkey;
uint64_t rva; void* rva;
unsigned ncopied = 0; unsigned ncopied = 0;
int frag_size = 0; unsigned int frag_size = 0;
char *p_src, *p_dst; char *p_src, *p_dst;
int i; int i;
int nfrags; int nfrags;
@ -1032,7 +1032,7 @@ int mca_spml_yoda_get(void* src_addr, size_t size, void* dst_addr, int src)
/* Get rkey of remote PE (src proc) which must be on memheap*/ /* Get rkey of remote PE (src proc) which must be on memheap*/
r_mkey = mca_memheap.memheap_get_cached_mkey(src, r_mkey = mca_memheap.memheap_get_cached_mkey(src,
(unsigned long) src_addr, src_addr,
btl_id, btl_id,
&rva); &rva);
if (!r_mkey) { if (!r_mkey) {
@ -1053,8 +1053,8 @@ int mca_spml_yoda_get(void* src_addr, size_t size, void* dst_addr, int src)
* just do memcpy * just do memcpy
*/ */
if ((ybtl->btl_type == YODA_BTL_SM) if ((ybtl->btl_type == YODA_BTL_SM)
&& OPAL_LIKELY(mca_memheap.memheap_is_symmetric_addr((unsigned long)src_addr) && (unsigned long)src_addr != rva)) { && OPAL_LIKELY(mca_memheap.memheap_is_symmetric_addr(src_addr) && src_addr != rva)) {
memcpy(dst_addr, (void *) (unsigned long) rva, size); memcpy(dst_addr, (void *) rva, size);
/* must call progress here to avoid deadlock. Scenarion: /* must call progress here to avoid deadlock. Scenarion:
* pe1 pols pe2 via shm get. pe2 tries to get static variable from node one, which goes to sm btl * pe1 pols pe2 via shm get. pe2 tries to get static variable from node one, which goes to sm btl
* In this case pe2 is stuck forever because pe1 never calls opal_progress. * In this case pe2 is stuck forever because pe1 never calls opal_progress.
@ -1064,13 +1064,13 @@ int mca_spml_yoda_get(void* src_addr, size_t size, void* dst_addr, int src)
return OSHMEM_SUCCESS; return OSHMEM_SUCCESS;
} }
l_mkey = mca_memheap.memheap_get_local_mkey((unsigned long) dst_addr, l_mkey = mca_memheap.memheap_get_local_mkey(dst_addr,
btl_id); btl_id);
/* /*
* Need a copy if local memory has not been registered or * Need a copy if local memory has not been registered or
* we make GET via SEND * we make GET via SEND
*/ */
frag_size = (int)ncopied; frag_size = ncopied;
if ((NULL == l_mkey) || get_via_send) if ((NULL == l_mkey) || get_via_send)
{ {
calc_nfrags(bml_btl, size, &frag_size, &nfrags, get_via_send); calc_nfrags(bml_btl, size, &frag_size, &nfrags, get_via_send);
@ -1091,7 +1091,7 @@ int mca_spml_yoda_get(void* src_addr, size_t size, void* dst_addr, int src)
frag = &getreq->get_frag; frag = &getreq->get_frag;
getreq->parent = &get_holder; getreq->parent = &get_holder;
ncopied = i < nfrags - 1 ? (unsigned)frag_size : (char *) dst_addr + size - p_dst; ncopied = i < nfrags - 1 ? frag_size :(unsigned) ((char *) dst_addr + size - p_dst);
frag->allocated = 0; frag->allocated = 0;
/* Prepare destination descriptor*/ /* Prepare destination descriptor*/
yoda_context = r_mkey->spml_context; yoda_context = r_mkey->spml_context;

Просмотреть файл

@ -189,7 +189,9 @@ FUNC_OP_CREATE(max, fint4, ompi_fortran_integer4_t, __max_op);
FUNC_OP_CREATE(max, fint8, ompi_fortran_integer8_t, __max_op); FUNC_OP_CREATE(max, fint8, ompi_fortran_integer8_t, __max_op);
FUNC_OP_CREATE(max, freal4, ompi_fortran_real4_t, __max_op); FUNC_OP_CREATE(max, freal4, ompi_fortran_real4_t, __max_op);
FUNC_OP_CREATE(max, freal8, ompi_fortran_real8_t, __max_op); FUNC_OP_CREATE(max, freal8, ompi_fortran_real8_t, __max_op);
#if ompi_fortran_real16_t
FUNC_OP_CREATE(max, freal16, ompi_fortran_real16_t, __max_op); FUNC_OP_CREATE(max, freal16, ompi_fortran_real16_t, __max_op);
#endif
/* MIN */ /* MIN */
#define __min_op(a, b) ((a) < (b) ? (a) : (b)) #define __min_op(a, b) ((a) < (b) ? (a) : (b))
@ -204,7 +206,9 @@ FUNC_OP_CREATE(min, fint4, ompi_fortran_integer4_t, __min_op);
FUNC_OP_CREATE(min, fint8, ompi_fortran_integer8_t, __min_op); FUNC_OP_CREATE(min, fint8, ompi_fortran_integer8_t, __min_op);
FUNC_OP_CREATE(min, freal4, ompi_fortran_real4_t, __min_op); FUNC_OP_CREATE(min, freal4, ompi_fortran_real4_t, __min_op);
FUNC_OP_CREATE(min, freal8, ompi_fortran_real8_t, __min_op); FUNC_OP_CREATE(min, freal8, ompi_fortran_real8_t, __min_op);
#if ompi_fortran_real16_t
FUNC_OP_CREATE(min, freal16, ompi_fortran_real16_t, __min_op); FUNC_OP_CREATE(min, freal16, ompi_fortran_real16_t, __min_op);
#endif
/* SUM */ /* SUM */
#define __sum_op(a, b) ((a) + (b)) #define __sum_op(a, b) ((a) + (b))
@ -221,7 +225,9 @@ FUNC_OP_CREATE(sum, fint4, ompi_fortran_integer4_t, __sum_op);
FUNC_OP_CREATE(sum, fint8, ompi_fortran_integer8_t, __sum_op); FUNC_OP_CREATE(sum, fint8, ompi_fortran_integer8_t, __sum_op);
FUNC_OP_CREATE(sum, freal4, ompi_fortran_real4_t, __sum_op); FUNC_OP_CREATE(sum, freal4, ompi_fortran_real4_t, __sum_op);
FUNC_OP_CREATE(sum, freal8, ompi_fortran_real8_t, __sum_op); FUNC_OP_CREATE(sum, freal8, ompi_fortran_real8_t, __sum_op);
#if ompi_fortran_real16_t
FUNC_OP_CREATE(sum, freal16, ompi_fortran_real16_t, __sum_op); FUNC_OP_CREATE(sum, freal16, ompi_fortran_real16_t, __sum_op);
#endif
/* PROD */ /* PROD */
#define __prod_op(a, b) ((a) * (b)) #define __prod_op(a, b) ((a) * (b))
@ -238,7 +244,9 @@ FUNC_OP_CREATE(prod, fint4, ompi_fortran_integer4_t, __prod_op);
FUNC_OP_CREATE(prod, fint8, ompi_fortran_integer8_t, __prod_op); FUNC_OP_CREATE(prod, fint8, ompi_fortran_integer8_t, __prod_op);
FUNC_OP_CREATE(prod, freal4, ompi_fortran_real4_t, __prod_op); FUNC_OP_CREATE(prod, freal4, ompi_fortran_real4_t, __prod_op);
FUNC_OP_CREATE(prod, freal8, ompi_fortran_real8_t, __prod_op); FUNC_OP_CREATE(prod, freal8, ompi_fortran_real8_t, __prod_op);
#if ompi_fortran_real16_t
FUNC_OP_CREATE(prod, freal16, ompi_fortran_real16_t, __prod_op); FUNC_OP_CREATE(prod, freal16, ompi_fortran_real16_t, __prod_op);
#endif
int oshmem_op_init(void) int oshmem_op_init(void)
{ {
@ -289,7 +297,9 @@ int oshmem_op_init(void)
OBJ_OP_CREATE(max, fint8, ompi_fortran_integer8_t, OSHMEM_OP_MAX, OSHMEM_OP_TYPE_FINT8); OBJ_OP_CREATE(max, fint8, ompi_fortran_integer8_t, OSHMEM_OP_MAX, OSHMEM_OP_TYPE_FINT8);
OBJ_OP_CREATE(max, freal4, ompi_fortran_real4_t, OSHMEM_OP_MAX, OSHMEM_OP_TYPE_FREAL4); OBJ_OP_CREATE(max, freal4, ompi_fortran_real4_t, OSHMEM_OP_MAX, OSHMEM_OP_TYPE_FREAL4);
OBJ_OP_CREATE(max, freal8, ompi_fortran_real8_t, OSHMEM_OP_MAX, OSHMEM_OP_TYPE_FREAL8); OBJ_OP_CREATE(max, freal8, ompi_fortran_real8_t, OSHMEM_OP_MAX, OSHMEM_OP_TYPE_FREAL8);
#if ompi_fortran_real16_t
OBJ_OP_CREATE(max, freal16, ompi_fortran_real16_t, OSHMEM_OP_MAX, OSHMEM_OP_TYPE_FREAL16); OBJ_OP_CREATE(max, freal16, ompi_fortran_real16_t, OSHMEM_OP_MAX, OSHMEM_OP_TYPE_FREAL16);
#endif
/* MIN */ /* MIN */
OBJ_OP_CREATE(min, short, short, OSHMEM_OP_MIN, OSHMEM_OP_TYPE_SHORT); OBJ_OP_CREATE(min, short, short, OSHMEM_OP_MIN, OSHMEM_OP_TYPE_SHORT);
@ -303,7 +313,9 @@ int oshmem_op_init(void)
OBJ_OP_CREATE(min, fint8, ompi_fortran_integer8_t, OSHMEM_OP_MIN, OSHMEM_OP_TYPE_FINT8); OBJ_OP_CREATE(min, fint8, ompi_fortran_integer8_t, OSHMEM_OP_MIN, OSHMEM_OP_TYPE_FINT8);
OBJ_OP_CREATE(min, freal4, ompi_fortran_real4_t, OSHMEM_OP_MIN, OSHMEM_OP_TYPE_FREAL4); OBJ_OP_CREATE(min, freal4, ompi_fortran_real4_t, OSHMEM_OP_MIN, OSHMEM_OP_TYPE_FREAL4);
OBJ_OP_CREATE(min, freal8, ompi_fortran_real8_t, OSHMEM_OP_MIN, OSHMEM_OP_TYPE_FREAL8); OBJ_OP_CREATE(min, freal8, ompi_fortran_real8_t, OSHMEM_OP_MIN, OSHMEM_OP_TYPE_FREAL8);
#if ompi_fortran_real16_t
OBJ_OP_CREATE(min, freal16, ompi_fortran_real16_t, OSHMEM_OP_MIN, OSHMEM_OP_TYPE_FREAL16); OBJ_OP_CREATE(min, freal16, ompi_fortran_real16_t, OSHMEM_OP_MIN, OSHMEM_OP_TYPE_FREAL16);
#endif
/* SUM */ /* SUM */
OBJ_OP_CREATE(sum, short, short, OSHMEM_OP_SUM, OSHMEM_OP_TYPE_SHORT); OBJ_OP_CREATE(sum, short, short, OSHMEM_OP_SUM, OSHMEM_OP_TYPE_SHORT);
@ -319,7 +331,9 @@ int oshmem_op_init(void)
OBJ_OP_CREATE(sum, fint8, ompi_fortran_integer8_t, OSHMEM_OP_SUM, OSHMEM_OP_TYPE_FINT8); OBJ_OP_CREATE(sum, fint8, ompi_fortran_integer8_t, OSHMEM_OP_SUM, OSHMEM_OP_TYPE_FINT8);
OBJ_OP_CREATE(sum, freal4, ompi_fortran_real4_t, OSHMEM_OP_SUM, OSHMEM_OP_TYPE_FREAL4); OBJ_OP_CREATE(sum, freal4, ompi_fortran_real4_t, OSHMEM_OP_SUM, OSHMEM_OP_TYPE_FREAL4);
OBJ_OP_CREATE(sum, freal8, ompi_fortran_real8_t, OSHMEM_OP_SUM, OSHMEM_OP_TYPE_FREAL8); OBJ_OP_CREATE(sum, freal8, ompi_fortran_real8_t, OSHMEM_OP_SUM, OSHMEM_OP_TYPE_FREAL8);
#if ompi_fortran_real16_t
OBJ_OP_CREATE(sum, freal16, ompi_fortran_real16_t, OSHMEM_OP_SUM, OSHMEM_OP_TYPE_FREAL16); OBJ_OP_CREATE(sum, freal16, ompi_fortran_real16_t, OSHMEM_OP_SUM, OSHMEM_OP_TYPE_FREAL16);
#endif
/* PROD */ /* PROD */
OBJ_OP_CREATE(prod, short, short, OSHMEM_OP_PROD, OSHMEM_OP_TYPE_SHORT); OBJ_OP_CREATE(prod, short, short, OSHMEM_OP_PROD, OSHMEM_OP_TYPE_SHORT);
@ -335,7 +349,9 @@ int oshmem_op_init(void)
OBJ_OP_CREATE(prod, fint8, ompi_fortran_integer8_t, OSHMEM_OP_PROD, OSHMEM_OP_TYPE_FINT8); OBJ_OP_CREATE(prod, fint8, ompi_fortran_integer8_t, OSHMEM_OP_PROD, OSHMEM_OP_TYPE_FINT8);
OBJ_OP_CREATE(prod, freal4, ompi_fortran_real4_t, OSHMEM_OP_PROD, OSHMEM_OP_TYPE_FREAL4); OBJ_OP_CREATE(prod, freal4, ompi_fortran_real4_t, OSHMEM_OP_PROD, OSHMEM_OP_TYPE_FREAL4);
OBJ_OP_CREATE(prod, freal8, ompi_fortran_real8_t, OSHMEM_OP_PROD, OSHMEM_OP_TYPE_FREAL8); OBJ_OP_CREATE(prod, freal8, ompi_fortran_real8_t, OSHMEM_OP_PROD, OSHMEM_OP_TYPE_FREAL8);
#if ompi_fortran_real16_t
OBJ_OP_CREATE(prod, freal16, ompi_fortran_real16_t, OSHMEM_OP_PROD, OSHMEM_OP_TYPE_FREAL16); OBJ_OP_CREATE(prod, freal16, ompi_fortran_real16_t, OSHMEM_OP_PROD, OSHMEM_OP_TYPE_FREAL16);
#endif
return OSHMEM_SUCCESS; return OSHMEM_SUCCESS;
} }

Просмотреть файл

@ -177,7 +177,7 @@ OSHMEM_DECLSPEC int oshmem_shmem_register_params(void);
*/ */
#include "oshmem/mca/memheap/memheap.h" #include "oshmem/mca/memheap/memheap.h"
#define RUNTIME_CHECK_ADDR(x) \ #define RUNTIME_CHECK_ADDR(x) \
if (OPAL_UNLIKELY(!MCA_MEMHEAP_CALL(is_symmetric_addr((unsigned long)(x))))) \ if (OPAL_UNLIKELY(!MCA_MEMHEAP_CALL(is_symmetric_addr((x))))) \
{ \ { \
RUNTIME_CHECK_ERROR("Required address %p is not in symmetric space\n", (x)); \ RUNTIME_CHECK_ERROR("Required address %p is not in symmetric space\n", (x)); \
oshmem_shmem_abort(-1); \ oshmem_shmem_abort(-1); \

Просмотреть файл

@ -17,12 +17,12 @@
int shmem_addr_accessible(void *addr, int pe) int shmem_addr_accessible(void *addr, int pe)
{ {
uint64_t rva; void* rva;
mca_spml_mkey_t *mkey; mca_spml_mkey_t *mkey;
RUNTIME_CHECK_INIT(); RUNTIME_CHECK_INIT();
mkey = MCA_MEMHEAP_CALL(get_cached_mkey(pe, (unsigned long)addr, mkey = MCA_MEMHEAP_CALL(get_cached_mkey(pe, addr,
oshmem_get_transport_id(pe), &rva)); oshmem_get_transport_id(pe), &rva));
return mkey ? 1 : 0; return mkey ? 1 : 0;

Просмотреть файл

@ -11,7 +11,7 @@
#ifndef SHMEM_FORTRAN_POINTER_H #ifndef SHMEM_FORTRAN_POINTER_H
#define SHMEM_FORTRAN_POINTER_H #define SHMEM_FORTRAN_POINTER_H
#define FORTRAN_POINTER_T uint64_t #define FORTRAN_POINTER_T uintptr_t
#define FPTR_2_VOID_PTR(a) ((void *)(a)) #define FPTR_2_VOID_PTR(a) ((void *)(a))
#endif #endif