1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
/*
* Copyright (c) 2013 Mellanox Technologies, Inc.
* All rights reserved.
* Copyright (c) 2019 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "oshmem_config.h"
#include <stdlib.h>
#include "oshmem/constants.h"
#include "oshmem/include/shmem.h"
#include "oshmem/shmem/shmem_api_logger.h"
#include "oshmem/runtime/runtime.h"
#include "oshmem/mca/memheap/memheap.h"
#include "oshmem/mca/memheap/base/base.h"
#if OSHMEM_PROFILING
#include "oshmem/include/pshmem.h"
#pragma weak shmem_ptr = pshmem_ptr
#include "oshmem/shmem/c/profile-defines.h"
#endif
void *shmem_ptr(const void *dst_addr, int pe)
{
sshmem_mkey_t *mkey;
int i;
void *rva;
RUNTIME_CHECK_INIT();
RUNTIME_CHECK_PE(pe);
RUNTIME_CHECK_ADDR(dst_addr);
/* process can access its own memory */
if (pe == oshmem_my_proc_id()) {
return (void *)dst_addr;
}
/* The memory must be on the local node */
if (!oshmem_proc_on_local_node(pe)) {
return NULL;
}
for (i = 0; i < mca_memheap_base_num_transports(); i++) {
/* TODO: iterate on all ctxs, try to get cached mkeys */
mkey = mca_memheap_base_get_cached_mkey(oshmem_ctx_default, pe, (void *)dst_addr, i, &rva);
if (!mkey) {
continue;
}
if (mca_memheap_base_mkey_is_shm(mkey)) {
return rva;
}
rva = MCA_SPML_CALL(rmkey_ptr(dst_addr, mkey, pe));
if (rva != NULL) {
return rva;
}
}
return NULL;
}
|