Changeset View
Changeset View
Standalone View
Standalone View
openmp/runtime/src/kmp_alloc.cpp
Show First 20 Lines • Show All 1,430 Lines • ▼ Show 20 Lines | |||||
omp_allocator_handle_t __kmpc_get_default_allocator(int gtid) { | omp_allocator_handle_t __kmpc_get_default_allocator(int gtid) { | ||||
return __kmp_threads[gtid]->th.th_def_allocator; | return __kmp_threads[gtid]->th.th_def_allocator; | ||||
} | } | ||||
typedef struct kmp_mem_desc { // Memory block descriptor | typedef struct kmp_mem_desc { // Memory block descriptor | ||||
void *ptr_alloc; // Pointer returned by allocator | void *ptr_alloc; // Pointer returned by allocator | ||||
size_t size_a; // Size of allocated memory block (initial+descriptor+align) | size_t size_a; // Size of allocated memory block (initial+descriptor+align) | ||||
size_t size_orig; // Original size requested | |||||
void *ptr_align; // Pointer to aligned memory, returned | void *ptr_align; // Pointer to aligned memory, returned | ||||
kmp_allocator_t *allocator; // allocator | kmp_allocator_t *allocator; // allocator | ||||
} kmp_mem_desc_t; | } kmp_mem_desc_t; | ||||
static int alignment = sizeof(void *); // let's align to pointer size | static int alignment = sizeof(void *); // let's align to pointer size | ||||
void *__kmpc_alloc(int gtid, size_t size, omp_allocator_handle_t allocator) { | void *__kmpc_alloc(int gtid, size_t size, omp_allocator_handle_t allocator) { | ||||
void *ptr = NULL; | void *ptr = NULL; | ||||
kmp_allocator_t *al; | kmp_allocator_t *al; | ||||
Show All 12 Lines | void *__kmpc_alloc(int gtid, size_t size, omp_allocator_handle_t allocator) { | ||||
kmp_mem_desc_t desc; | kmp_mem_desc_t desc; | ||||
kmp_uintptr_t addr; // address returned by allocator | kmp_uintptr_t addr; // address returned by allocator | ||||
kmp_uintptr_t addr_align; // address to return to caller | kmp_uintptr_t addr_align; // address to return to caller | ||||
kmp_uintptr_t addr_descr; // address of memory block descriptor | kmp_uintptr_t addr_descr; // address of memory block descriptor | ||||
int align = alignment; // default alignment | int align = alignment; // default alignment | ||||
if (allocator > kmp_max_mem_alloc && al->alignment > 0) { | if (allocator > kmp_max_mem_alloc && al->alignment > 0) { | ||||
align = al->alignment; // alignment requested by user | align = al->alignment; // alignment requested by user | ||||
} | } | ||||
desc.size_orig = size; | |||||
desc.size_a = size + sz_desc + align; | desc.size_a = size + sz_desc + align; | ||||
if (__kmp_memkind_available) { | if (__kmp_memkind_available) { | ||||
if (allocator < kmp_max_mem_alloc) { | if (allocator < kmp_max_mem_alloc) { | ||||
// pre-defined allocator | // pre-defined allocator | ||||
if (allocator == omp_high_bw_mem_alloc && mk_hbw_preferred) { | if (allocator == omp_high_bw_mem_alloc && mk_hbw_preferred) { | ||||
ptr = kmp_mk_alloc(*mk_hbw_preferred, desc.size_a); | ptr = kmp_mk_alloc(*mk_hbw_preferred, desc.size_a); | ||||
} else { | } else { | ||||
▲ Show 20 Lines • Show All 104 Lines • ▼ Show 20 Lines | void *__kmpc_alloc(int gtid, size_t size, omp_allocator_handle_t allocator) { | ||||
return desc.ptr_align; | return desc.ptr_align; | ||||
} | } | ||||
void *__kmpc_calloc(int gtid, size_t nmemb, size_t size, | void *__kmpc_calloc(int gtid, size_t nmemb, size_t size, | ||||
omp_allocator_handle_t allocator) { | omp_allocator_handle_t allocator) { | ||||
void *ptr = NULL; | void *ptr = NULL; | ||||
kmp_allocator_t *al; | kmp_allocator_t *al; | ||||
KMP_DEBUG_ASSERT(__kmp_init_serial); | KMP_DEBUG_ASSERT(__kmp_init_serial); | ||||
protze.joachim: Shouldn't this be after handling size==0? | |||||
Not Done ReplyInline ActionsActually, the assertion does not make sense at all, because size_t is unsigned. AndreyChurbanov: Actually, the assertion does not make sense at all, because size_t is unsigned. | |||||
if (allocator == omp_null_allocator) | if (allocator == omp_null_allocator) | ||||
allocator = __kmp_threads[gtid]->th.th_def_allocator; | allocator = __kmp_threads[gtid]->th.th_def_allocator; | ||||
KE_TRACE(25, ("__kmpc_calloc: T#%d (%d, %d, %p)\n", gtid, (int)nmemb, | KE_TRACE(25, ("__kmpc_calloc: T#%d (%d, %d, %p)\n", gtid, (int)nmemb, | ||||
(int)size, allocator)); | (int)size, allocator)); | ||||
al = RCAST(kmp_allocator_t *, CCAST(omp_allocator_handle_t, allocator)); | al = RCAST(kmp_allocator_t *, CCAST(omp_allocator_handle_t, allocator)); | ||||
Show All 11 Lines | void *__kmpc_calloc(int gtid, size_t nmemb, size_t size, | ||||
if (ptr) { | if (ptr) { | ||||
memset(ptr, 0x00, nmemb * size); | memset(ptr, 0x00, nmemb * size); | ||||
} | } | ||||
KE_TRACE(25, ("__kmpc_calloc returns %p, T#%d\n", ptr, gtid)); | KE_TRACE(25, ("__kmpc_calloc returns %p, T#%d\n", ptr, gtid)); | ||||
return ptr; | return ptr; | ||||
} | } | ||||
void *__kmpc_realloc(int gtid, void *ptr, size_t size, | |||||
omp_allocator_handle_t allocator, | |||||
omp_allocator_handle_t free_allocator) { | |||||
void *nptr = NULL; | |||||
KMP_DEBUG_ASSERT(__kmp_init_serial); | |||||
if (size == 0) { | |||||
if (ptr != NULL) | |||||
__kmpc_free(gtid, ptr, free_allocator); | |||||
return nptr; | |||||
} | |||||
KE_TRACE(25, ("__kmpc_realloc: T#%d (%p, %d, %p, %p)\n", gtid, ptr, (int)size, | |||||
allocator, free_allocator)); | |||||
nptr = __kmpc_alloc(gtid, size, allocator); | |||||
if (nptr != NULL && ptr != NULL) { | |||||
kmp_mem_desc_t desc; | |||||
kmp_uintptr_t addr_align; // address to return to caller | |||||
kmp_uintptr_t addr_descr; // address of memory block descriptor | |||||
addr_align = (kmp_uintptr_t)ptr; | |||||
addr_descr = addr_align - sizeof(kmp_mem_desc_t); | |||||
desc = *((kmp_mem_desc_t *)addr_descr); // read descriptor | |||||
KMP_DEBUG_ASSERT(desc.ptr_align == ptr); | |||||
KMP_DEBUG_ASSERT(desc.size_orig > 0); | |||||
KMP_DEBUG_ASSERT(desc.size_orig < desc.size_a); | |||||
KMP_MEMCPY((char *)nptr, (char *)ptr, | |||||
(size_t)((size < desc.size_orig) ? size : desc.size_orig)); | |||||
} | |||||
if (nptr != NULL) { | |||||
__kmpc_free(gtid, ptr, free_allocator); | |||||
} | |||||
KE_TRACE(25, ("__kmpc_realloc returns %p, T#%d\n", nptr, gtid)); | |||||
return nptr; | |||||
} | |||||
void __kmpc_free(int gtid, void *ptr, const omp_allocator_handle_t allocator) { | void __kmpc_free(int gtid, void *ptr, const omp_allocator_handle_t allocator) { | ||||
KE_TRACE(25, ("__kmpc_free: T#%d free(%p,%p)\n", gtid, ptr, allocator)); | KE_TRACE(25, ("__kmpc_free: T#%d free(%p,%p)\n", gtid, ptr, allocator)); | ||||
if (ptr == NULL) | if (ptr == NULL) | ||||
return; | return; | ||||
kmp_allocator_t *al; | kmp_allocator_t *al; | ||||
omp_allocator_handle_t oal; | omp_allocator_handle_t oal; | ||||
al = RCAST(kmp_allocator_t *, CCAST(omp_allocator_handle_t, allocator)); | al = RCAST(kmp_allocator_t *, CCAST(omp_allocator_handle_t, allocator)); | ||||
▲ Show 20 Lines • Show All 479 Lines • Show Last 20 Lines |
Shouldn't this be after handling size==0?