Adding more fixes to stomp casting/addressing issues on 32-bit systems.
This commit was SVN r29164.
Этот коммит содержится в:
родитель
096b8c022e
Коммит
027e7deb7f
@ -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
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user