82 changes: 69 additions & 13 deletions openmp/runtime/src/include/50/omp_lib.f90.var
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,15 @@
integer, parameter :: omp_lock_hint_kind = omp_sync_hint_kind
integer, parameter :: omp_control_tool_kind = omp_integer_kind
integer, parameter :: omp_control_tool_result_kind = omp_integer_kind
integer, parameter :: omp_allocator_kind = c_intptr_t
integer, parameter :: omp_allocator_handle_kind = c_intptr_t
integer, parameter :: omp_memspace_handle_kind = c_intptr_t
integer, parameter :: omp_alloctrait_key_kind = omp_integer_kind
integer, parameter :: omp_alloctrait_val_kind = c_intptr_t

type omp_alloctrait
integer(kind=omp_alloctrait_key_kind) key
integer(kind=omp_alloctrait_val_kind) value
end type omp_alloctrait

integer, parameter :: omp_pause_resource_kind = omp_integer_kind

Expand Down Expand Up @@ -88,15 +96,50 @@
integer (kind=omp_control_tool_result_kind), parameter :: omp_control_tool_success = 0
integer (kind=omp_control_tool_result_kind), parameter :: omp_control_tool_ignored = 1

integer (kind=omp_allocator_kind), parameter :: omp_null_allocator = 0
integer (kind=omp_allocator_kind), parameter :: omp_default_mem_alloc = 1
integer (kind=omp_allocator_kind), parameter :: omp_large_cap_mem_alloc = 2
integer (kind=omp_allocator_kind), parameter :: omp_const_mem_alloc = 3
integer (kind=omp_allocator_kind), parameter :: omp_high_bw_mem_alloc = 4
integer (kind=omp_allocator_kind), parameter :: omp_low_lat_mem_alloc = 5
integer (kind=omp_allocator_kind), parameter :: omp_cgroup_mem_alloc = 6
integer (kind=omp_allocator_kind), parameter :: omp_pteam_mem_alloc = 7
integer (kind=omp_allocator_kind), parameter :: omp_thread_mem_alloc = 8
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_threadmodel = 1
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_alignment = 2
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_access = 3
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_pool_size = 4
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_fallback = 5
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_fb_data = 6
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_pinned = 7
integer (kind=omp_alloctrait_key_kind), parameter :: omp_atk_partition = 8

integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_false = 0
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_true = 1
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_default = 2
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_contended = 3
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_uncontended = 4
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_sequential = 5
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_private = 6
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_all = 7
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_thread = 8
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_pteam = 9
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_cgroup = 10
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_default_mem_fb = 11
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_null_fb = 12
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_abort_fb = 13
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_allocator_fb = 14
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_environment = 15
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_nearest = 16
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_blocked = 17
integer (kind=omp_alloctrait_val_kind), parameter :: omp_atv_interleaved = 18

integer (kind=omp_allocator_handle_kind), parameter :: omp_null_allocator = 0
integer (kind=omp_allocator_handle_kind), parameter :: omp_default_mem_alloc = 1
integer (kind=omp_allocator_handle_kind), parameter :: omp_large_cap_mem_alloc = 2
integer (kind=omp_allocator_handle_kind), parameter :: omp_const_mem_alloc = 3
integer (kind=omp_allocator_handle_kind), parameter :: omp_high_bw_mem_alloc = 4
integer (kind=omp_allocator_handle_kind), parameter :: omp_low_lat_mem_alloc = 5
integer (kind=omp_allocator_handle_kind), parameter :: omp_cgroup_mem_alloc = 6
integer (kind=omp_allocator_handle_kind), parameter :: omp_pteam_mem_alloc = 7
integer (kind=omp_allocator_handle_kind), parameter :: omp_thread_mem_alloc = 8

integer (kind=omp_memspace_handle_kind), parameter :: omp_default_mem_space = 0
integer (kind=omp_memspace_handle_kind), parameter :: omp_large_cap_mem_space = 1
integer (kind=omp_memspace_handle_kind), parameter :: omp_const_mem_space = 2
integer (kind=omp_memspace_handle_kind), parameter :: omp_high_bw_mem_space = 3
integer (kind=omp_memspace_handle_kind), parameter :: omp_low_lat_mem_space = 4

integer (kind=omp_pause_resource_kind), parameter :: omp_pause_resume = 0
integer (kind=omp_pause_resource_kind), parameter :: omp_pause_soft = 1
Expand Down Expand Up @@ -409,14 +452,27 @@
integer (kind=omp_integer_kind) omp_get_max_task_priority
end function omp_get_max_task_priority

subroutine omp_set_default_allocator(svar) bind(c)
function omp_init_allocator(memspace, ntraits, traits)
use omp_lib_kinds
integer (kind=omp_allocator_handle_kind) omp_init_allocator
integer (kind=omp_memspace_handle_kind) :: memspace
integer (kind=omp_integer_kind) :: ntraits
type(omp_alloctrait), intent(in) :: traits(*)
end function omp_init_allocator

subroutine omp_destroy_allocator(allocator) bind(c)
use omp_lib_kinds
integer (kind=omp_allocator_handle_kind), value :: allocator
end subroutine omp_destroy_allocator

subroutine omp_set_default_allocator(allocator) bind(c)
use omp_lib_kinds
integer (kind=omp_allocator_kind), value :: svar
integer (kind=omp_allocator_handle_kind), value :: allocator
end subroutine omp_set_default_allocator

function omp_get_default_allocator() bind(c)
use omp_lib_kinds
integer (kind=omp_allocator_kind) omp_get_default_allocator
integer (kind=omp_allocator_handle_kind) omp_get_default_allocator
end function omp_get_default_allocator

subroutine omp_set_affinity_format(format)
Expand Down
122 changes: 108 additions & 14 deletions openmp/runtime/src/include/50/omp_lib.h.var
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,14 @@
parameter(omp_control_tool_kind=omp_integer_kind)
integer omp_control_tool_result_kind
parameter(omp_control_tool_result_kind=omp_integer_kind)
integer omp_allocator_kind
parameter(omp_allocator_kind=int_ptr_kind())
integer omp_allocator_handle_kind
parameter(omp_allocator_handle_kind=int_ptr_kind())
integer omp_memspace_handle_kind
parameter(omp_memspace_handle_kind=int_ptr_kind())
integer omp_alloctrait_key_kind
parameter(omp_alloctrait_key_kind=omp_integer_kind)
integer omp_alloctrait_val_kind
parameter(omp_alloctrait_val_kind=int_ptr_kind())
integer omp_pause_resource_kind
parameter(omp_pause_resource_kind=omp_integer_kind)

Expand Down Expand Up @@ -119,24 +125,99 @@
integer(omp_control_tool_result_kind)omp_control_tool_ignored
parameter(omp_control_tool_ignored=1)

integer(kind=omp_allocator_kind)omp_null_allocator
integer(kind=omp_alloctrait_key_kind)omp_atk_threadmodel
parameter(omp_atk_threadmodel=1)
integer(kind=omp_alloctrait_key_kind)omp_atk_alignment
parameter(omp_atk_alignment=2)
integer(kind=omp_alloctrait_key_kind)omp_atk_access
parameter(omp_atk_access=3)
integer(kind=omp_alloctrait_key_kind)omp_atk_pool_size
parameter(omp_atk_pool_size=4)
integer(kind=omp_alloctrait_key_kind)omp_atk_fallback
parameter(omp_atk_fallback=5)
integer(kind=omp_alloctrait_key_kind)omp_atk_fb_data
parameter(omp_atk_fb_data=6)
integer(kind=omp_alloctrait_key_kind)omp_atk_pinned
parameter(omp_atk_pinned=7)
integer(kind=omp_alloctrait_key_kind)omp_atk_partition
parameter(omp_atk_partition=8)

! Reserved for future use
integer(kind=omp_alloctrait_val_kind)omp_atv_false
parameter(omp_atv_false=0)
! Reserved for future use
integer(kind=omp_alloctrait_val_kind)omp_atv_true
parameter(omp_atv_true=1)
integer(kind=omp_alloctrait_val_kind)omp_atv_default
parameter(omp_atv_default=2)
integer(kind=omp_alloctrait_val_kind)omp_atv_contended
parameter(omp_atv_contended=3)
integer(kind=omp_alloctrait_val_kind)omp_atv_uncontended
parameter(omp_atv_uncontended=4)
integer(kind=omp_alloctrait_val_kind)omp_atv_sequential
parameter(omp_atv_sequential=5)
integer(kind=omp_alloctrait_val_kind)omp_atv_private
parameter(omp_atv_private=6)
integer(kind=omp_alloctrait_val_kind)omp_atv_all
parameter(omp_atv_all=7)
integer(kind=omp_alloctrait_val_kind)omp_atv_thread
parameter(omp_atv_thread=8)
integer(kind=omp_alloctrait_val_kind)omp_atv_pteam
parameter(omp_atv_pteam=9)
integer(kind=omp_alloctrait_val_kind)omp_atv_cgroup
parameter(omp_atv_cgroup=10)
integer(kind=omp_alloctrait_val_kind)omp_atv_default_mem_fb
parameter(omp_atv_default_mem_fb=11)
integer(kind=omp_alloctrait_val_kind)omp_atv_null_fb
parameter(omp_atv_null_fb=12)
integer(kind=omp_alloctrait_val_kind)omp_atv_abort_fb
parameter(omp_atv_abort_fb=13)
integer(kind=omp_alloctrait_val_kind)omp_atv_allocator_fb
parameter(omp_atv_allocator_fb=14)
integer(kind=omp_alloctrait_val_kind)omp_atv_environment
parameter(omp_atv_environment=15)
integer(kind=omp_alloctrait_val_kind)omp_atv_nearest
parameter(omp_atv_nearest=16)
integer(kind=omp_alloctrait_val_kind)omp_atv_blocked
parameter(omp_atv_blocked=17)
integer(kind=omp_alloctrait_val_kind)omp_atv_interleaved
parameter(omp_atv_interleaved=18)

type omp_alloctrait
integer (kind=omp_alloctrait_key_kind) key
integer (kind=omp_alloctrait_val_kind) value
end type omp_alloctrait

integer(kind=omp_allocator_handle_kind)omp_null_allocator
parameter(omp_null_allocator=0)
integer(kind=omp_allocator_kind)omp_default_mem_alloc
integer(kind=omp_allocator_handle_kind)omp_default_mem_alloc
parameter(omp_default_mem_alloc=1)
integer(kind=omp_allocator_kind)omp_large_cap_mem_alloc
integer(kind=omp_allocator_handle_kind)omp_large_cap_mem_alloc
parameter(omp_large_cap_mem_alloc=2)
integer(kind=omp_allocator_kind)omp_const_mem_alloc
integer(kind=omp_allocator_handle_kind)omp_const_mem_alloc
parameter(omp_const_mem_alloc=3)
integer(kind=omp_allocator_kind)omp_high_bw_mem_alloc
integer(kind=omp_allocator_handle_kind)omp_high_bw_mem_alloc
parameter(omp_high_bw_mem_alloc=4)
integer(kind=omp_allocator_kind)omp_low_lat_mem_alloc
integer(kind=omp_allocator_handle_kind)omp_low_lat_mem_alloc
parameter(omp_low_lat_mem_alloc=5)
integer(kind=omp_allocator_kind)omp_cgroup_mem_alloc
integer(kind=omp_allocator_handle_kind)omp_cgroup_mem_alloc
parameter(omp_cgroup_mem_alloc=6)
integer(kind=omp_allocator_kind)omp_pteam_mem_alloc
integer(kind=omp_allocator_handle_kind)omp_pteam_mem_alloc
parameter(omp_pteam_mem_alloc=7)
integer(kind=omp_allocator_kind)omp_thread_mem_alloc
integer(kind=omp_allocator_handle_kind)omp_thread_mem_alloc
parameter(omp_thread_mem_alloc=8)

integer(kind=omp_memspace_handle_kind)omp_default_mem_space
parameter(omp_default_mem_space=0)
integer(kind=omp_memspace_handle_kind)omp_large_cap_mem_space
parameter(omp_large_cap_mem_space=1)
integer(kind=omp_memspace_handle_kind)omp_const_mem_space
parameter(omp_const_mem_space=2)
integer(kind=omp_memspace_handle_kind)omp_high_bw_mem_space
parameter(omp_high_bw_mem_space=3)
integer(kind=omp_memspace_handle_kind)omp_low_lat_mem_space
parameter(omp_low_lat_mem_space=4)

integer(kind=omp_pause_resource_kind)omp_pause_resume
parameter(omp_pause_resume=0)
integer(kind=omp_pause_resource_kind)omp_pause_soft
Expand Down Expand Up @@ -444,14 +525,27 @@
integer (kind=omp_integer_kind) omp_get_max_task_priority
end function omp_get_max_task_priority

subroutine omp_set_default_allocator(svar) bind(c)
function omp_init_allocator(memspace, ntraits, traits)
import
integer (omp_allocator_handle_kind) omp_init_allocator
integer (omp_memspace_handle_kind) :: memspace
integer (omp_integer_kind) :: ntraits
type(omp_alloctrait), intent(in) :: traits(*)
end function omp_init_allocator

subroutine omp_destroy_allocator(allocator) bind(c)
import
integer (omp_allocator_handle_kind), value :: allocator
end subroutine omp_destroy_allocator

subroutine omp_set_default_allocator(allocator) bind(c)
import
integer (kind=omp_allocator_kind), value :: svar
integer (omp_allocator_handle_kind), value :: allocator
end subroutine omp_set_default_allocator

function omp_get_default_allocator() bind(c)
import
integer (kind=omp_allocator_kind) omp_get_default_allocator
integer (omp_allocator_handle_kind) omp_get_default_allocator
end function omp_get_default_allocator

subroutine omp_set_affinity_format(format)
Expand Down
109 changes: 90 additions & 19 deletions openmp/runtime/src/kmp.h
Original file line number Diff line number Diff line change
Expand Up @@ -858,24 +858,95 @@ extern int __kmp_hws_abs_flag; // absolute or per-item number requested

#if OMP_50_ENABLED
/* OpenMP 5.0 Memory Management support */

#ifndef __OMP_H
// Duplicate type definitios from omp.h
typedef uintptr_t omp_uintptr_t;

typedef enum {
OMP_ATK_THREADMODEL = 1,
OMP_ATK_ALIGNMENT = 2,
OMP_ATK_ACCESS = 3,
OMP_ATK_POOL_SIZE = 4,
OMP_ATK_FALLBACK = 5,
OMP_ATK_FB_DATA = 6,
OMP_ATK_PINNED = 7,
OMP_ATK_PARTITION = 8
} omp_alloctrait_key_t;

typedef enum {
OMP_ATV_FALSE = 0,
OMP_ATV_TRUE = 1,
OMP_ATV_DEFAULT = 2,
OMP_ATV_CONTENDED = 3,
OMP_ATV_UNCONTENDED = 4,
OMP_ATV_SEQUENTIAL = 5,
OMP_ATV_PRIVATE = 6,
OMP_ATV_ALL = 7,
OMP_ATV_THREAD = 8,
OMP_ATV_PTEAM = 9,
OMP_ATV_CGROUP = 10,
OMP_ATV_DEFAULT_MEM_FB = 11,
OMP_ATV_NULL_FB = 12,
OMP_ATV_ABORT_FB = 13,
OMP_ATV_ALLOCATOR_FB = 14,
OMP_ATV_ENVIRONMENT = 15,
OMP_ATV_NEAREST = 16,
OMP_ATV_BLOCKED = 17,
OMP_ATV_INTERLEAVED = 18
} omp_alloctrait_value_t;

typedef void *omp_memspace_handle_t;
extern omp_memspace_handle_t const omp_default_mem_space;
extern omp_memspace_handle_t const omp_large_cap_mem_space;
extern omp_memspace_handle_t const omp_const_mem_space;
extern omp_memspace_handle_t const omp_high_bw_mem_space;
extern omp_memspace_handle_t const omp_low_lat_mem_space;

typedef struct {
omp_alloctrait_key_t key;
omp_uintptr_t value;
} omp_alloctrait_t;

typedef void *omp_allocator_handle_t;
extern omp_allocator_handle_t const omp_null_allocator;
extern omp_allocator_handle_t const omp_default_mem_alloc;
extern omp_allocator_handle_t const omp_large_cap_mem_alloc;
extern omp_allocator_handle_t const omp_const_mem_alloc;
extern omp_allocator_handle_t const omp_high_bw_mem_alloc;
extern omp_allocator_handle_t const omp_low_lat_mem_alloc;
extern omp_allocator_handle_t const omp_cgroup_mem_alloc;
extern omp_allocator_handle_t const omp_pteam_mem_alloc;
extern omp_allocator_handle_t const omp_thread_mem_alloc;
extern omp_allocator_handle_t const kmp_max_mem_alloc;
extern omp_allocator_handle_t __kmp_def_allocator;

// end of duplicate type definitios from omp.h
#endif

extern int __kmp_memkind_available;
extern int __kmp_hbw_mem_available;
typedef void *omp_allocator_t;
extern const omp_allocator_t *OMP_NULL_ALLOCATOR;
extern const omp_allocator_t *omp_default_mem_alloc;
extern const omp_allocator_t *omp_large_cap_mem_alloc;
extern const omp_allocator_t *omp_const_mem_alloc;
extern const omp_allocator_t *omp_high_bw_mem_alloc;
extern const omp_allocator_t *omp_low_lat_mem_alloc;
extern const omp_allocator_t *omp_cgroup_mem_alloc;
extern const omp_allocator_t *omp_pteam_mem_alloc;
extern const omp_allocator_t *omp_thread_mem_alloc;
extern const omp_allocator_t *__kmp_def_allocator;

extern void __kmpc_set_default_allocator(int gtid, const omp_allocator_t *al);
extern const omp_allocator_t *__kmpc_get_default_allocator(int gtid);
extern void *__kmpc_alloc(int gtid, size_t sz, const omp_allocator_t *al);
extern void __kmpc_free(int gtid, void *ptr, const omp_allocator_t *al);

typedef omp_memspace_handle_t kmp_memspace_t; // placeholder

typedef struct kmp_allocator_t {
omp_memspace_handle_t memspace;
void **memkind; // pointer to memkind
int alignment;
omp_alloctrait_value_t fb;
kmp_allocator_t *fb_data;
kmp_uint64 pool_size;
kmp_uint64 pool_used;
} kmp_allocator_t;

extern omp_allocator_handle_t __kmpc_init_allocator(int gtid,
omp_memspace_handle_t,
int ntraits,
omp_alloctrait_t traits[]);
extern void __kmpc_destroy_allocator(int gtid, omp_allocator_handle_t al);
extern void __kmpc_set_default_allocator(int gtid, omp_allocator_handle_t al);
extern omp_allocator_handle_t __kmpc_get_default_allocator(int gtid);
extern void *__kmpc_alloc(int gtid, size_t sz, omp_allocator_handle_t al);
extern void __kmpc_free(int gtid, void *ptr, omp_allocator_handle_t al);

extern void __kmp_init_memkind();
extern void __kmp_fini_memkind();
Expand Down Expand Up @@ -2357,7 +2428,7 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
kmp_affin_mask_t *th_affin_mask; /* thread's current affinity mask */
#endif
#if OMP_50_ENABLED
void *const *th_def_allocator; /* per implicit task default allocator */
omp_allocator_handle_t th_def_allocator; /* default allocator */
#endif
/* The data set by the master at reinit, then R/W by the worker */
KMP_ALIGN_CACHE int
Expand Down Expand Up @@ -2581,7 +2652,7 @@ typedef struct KMP_ALIGN_CACHE kmp_base_team {
int t_size_changed; // team size was changed?: 0: no, 1: yes, -1: changed via
// omp_set_num_threads() call
#if OMP_50_ENABLED
void *const *t_def_allocator; /* per implicit task default allocator */
omp_allocator_handle_t t_def_allocator; /* default allocator */
#endif

// Read/write by workers as well
Expand Down
385 changes: 322 additions & 63 deletions openmp/runtime/src/kmp_alloc.cpp

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions openmp/runtime/src/kmp_csupport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4205,6 +4205,15 @@ void __kmpc_doacross_fini(ident_t *loc, int gtid) {
#endif

#if OMP_50_ENABLED
/* omp_alloc/omp_free only defined for C/C++, not for Fortran */
void *omp_alloc(size_t size, omp_allocator_handle_t allocator) {
return __kmpc_alloc(__kmp_entry_gtid(), size, allocator);
}

void omp_free(void *ptr, omp_allocator_handle_t allocator) {
__kmpc_free(__kmp_entry_gtid(), ptr, allocator);
}

int __kmpc_get_target_offload(void) {
if (!__kmp_init_serial) {
__kmp_serial_initialize();
Expand Down
33 changes: 17 additions & 16 deletions openmp/runtime/src/kmp_ftn_entry.h
Original file line number Diff line number Diff line change
Expand Up @@ -368,35 +368,36 @@ int FTN_STDCALL FTN_CONTROL_TOOL(int command, int modifier, void *arg) {
}

/* OpenMP 5.0 Memory Management support */
void FTN_STDCALL FTN_SET_DEFAULT_ALLOCATOR(const omp_allocator_t *allocator) {
#ifndef KMP_STUB
__kmpc_set_default_allocator(__kmp_entry_gtid(), allocator);
#endif
}
const omp_allocator_t *FTN_STDCALL FTN_GET_DEFAULT_ALLOCATOR(void) {
omp_allocator_handle_t FTN_STDCALL
FTN_INIT_ALLOCATOR(omp_memspace_handle_t KMP_DEREF m, int KMP_DEREF ntraits,
omp_alloctrait_t tr[]) {
#ifdef KMP_STUB
return NULL;
#else
return __kmpc_get_default_allocator(__kmp_entry_gtid());
return __kmpc_init_allocator(__kmp_entry_gtid(), KMP_DEREF m,
KMP_DEREF ntraits, tr);
#endif
}
void *FTN_STDCALL FTN_ALLOC(size_t size, const omp_allocator_t *allocator) {
#ifdef KMP_STUB
return malloc(size);
#else
return __kmpc_alloc(__kmp_entry_gtid(), size, allocator);

void FTN_STDCALL FTN_DESTROY_ALLOCATOR(omp_allocator_handle_t al) {
#ifndef KMP_STUB
__kmpc_destroy_allocator(__kmp_entry_gtid(), al);
#endif
}
void FTN_STDCALL FTN_SET_DEFAULT_ALLOCATOR(omp_allocator_handle_t al) {
#ifndef KMP_STUB
__kmpc_set_default_allocator(__kmp_entry_gtid(), al);
#endif
}
void FTN_STDCALL FTN_FREE(void *ptr, const omp_allocator_t *allocator) {
omp_allocator_handle_t FTN_STDCALL FTN_GET_DEFAULT_ALLOCATOR(void) {
#ifdef KMP_STUB
free(ptr);
return NULL;
#else
__kmpc_free(__kmp_entry_gtid(), ptr, allocator);
return __kmpc_get_default_allocator(__kmp_entry_gtid());
#endif
}

/* OpenMP 5.0 affinity format support */

#ifndef KMP_STUB
static void __kmp_fortran_strncpy_truncate(char *buffer, size_t buf_size,
char const *csrc, size_t csrc_size) {
Expand Down
12 changes: 8 additions & 4 deletions openmp/runtime/src/kmp_ftn_os.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,10 @@

#if OMP_50_ENABLED
#define FTN_CONTROL_TOOL omp_control_tool
#define FTN_INIT_ALLOCATOR omp_init_allocator
#define FTN_DESTROY_ALLOCATOR omp_destroy_allocator
#define FTN_SET_DEFAULT_ALLOCATOR omp_set_default_allocator
#define FTN_GET_DEFAULT_ALLOCATOR omp_get_default_allocator
#define FTN_ALLOC omp_alloc
#define FTN_FREE omp_free
#define FTN_GET_DEVICE_NUM omp_get_device_num
#define FTN_SET_AFFINITY_FORMAT omp_set_affinity_format
#define FTN_GET_AFFINITY_FORMAT omp_get_affinity_format
Expand Down Expand Up @@ -264,6 +264,8 @@

#if OMP_50_ENABLED
#define FTN_CONTROL_TOOL omp_control_tool_
#define FTN_INIT_ALLOCATOR omp_init_allocator_
#define FTN_DESTROY_ALLOCATOR omp_destroy_allocator_
#define FTN_SET_DEFAULT_ALLOCATOR omp_set_default_allocator_
#define FTN_GET_DEFAULT_ALLOCATOR omp_get_default_allocator_
#define FTN_ALLOC omp_alloc_
Expand Down Expand Up @@ -396,10 +398,10 @@

#if OMP_50_ENABLED
#define FTN_CONTROL_TOOL OMP_CONTROL_TOOL
#define FTN_INIT_ALLOCATOR OMP_INIT_ALLOCATOR
#define FTN_DESTROY_ALLOCATOR OMP_DESTROY_ALLOCATOR
#define FTN_SET_DEFAULT_ALLOCATOR OMP_SET_DEFAULT_ALLOCATOR
#define FTN_GET_DEFAULT_ALLOCATOR OMP_GET_DEFAULT_ALLOCATOR
#define FTN_ALLOC OMP_ALLOC
#define FTN_FREE OMP_FREE
#define FTN_GET_DEVICE_NUM OMP_GET_DEVICE_NUM
#define FTN_SET_AFFINITY_FORMAT OMP_SET_AFFINITY_FORMAT
#define FTN_GET_AFFINITY_FORMAT OMP_GET_AFFINITY_FORMAT
Expand Down Expand Up @@ -528,6 +530,8 @@

#if OMP_50_ENABLED
#define FTN_CONTROL_TOOL OMP_CONTROL_TOOL_
#define FTN_INIT_ALLOCATOR OMP_INIT_ALLOCATOR_
#define FTN_DESTROY_ALLOCATOR OMP_DESTROY_ALLOCATOR_
#define FTN_SET_DEFAULT_ALLOCATOR OMP_SET_DEFAULT_ALLOCATOR_
#define FTN_GET_DEFAULT_ALLOCATOR OMP_GET_DEFAULT_ALLOCATOR_
#define FTN_ALLOC OMP_ALLOC_
Expand Down
42 changes: 31 additions & 11 deletions openmp/runtime/src/kmp_global.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -300,17 +300,37 @@ kmp_uint64 __kmp_taskloop_min_tasks = 0;

#if OMP_50_ENABLED
int __kmp_memkind_available = 0;
int __kmp_hbw_mem_available = 0;
const omp_allocator_t *OMP_NULL_ALLOCATOR = NULL;
const omp_allocator_t *omp_default_mem_alloc = (const omp_allocator_t *)1;
const omp_allocator_t *omp_large_cap_mem_alloc = (const omp_allocator_t *)2;
const omp_allocator_t *omp_const_mem_alloc = (const omp_allocator_t *)3;
const omp_allocator_t *omp_high_bw_mem_alloc = (const omp_allocator_t *)4;
const omp_allocator_t *omp_low_lat_mem_alloc = (const omp_allocator_t *)5;
const omp_allocator_t *omp_cgroup_mem_alloc = (const omp_allocator_t *)6;
const omp_allocator_t *omp_pteam_mem_alloc = (const omp_allocator_t *)7;
const omp_allocator_t *omp_thread_mem_alloc = (const omp_allocator_t *)8;
void *const *__kmp_def_allocator = omp_default_mem_alloc;
omp_allocator_handle_t const omp_null_allocator = NULL;
omp_allocator_handle_t const omp_default_mem_alloc =
(omp_allocator_handle_t const)1;
omp_allocator_handle_t const omp_large_cap_mem_alloc =
(omp_allocator_handle_t const)2;
omp_allocator_handle_t const omp_const_mem_alloc =
(omp_allocator_handle_t const)3;
omp_allocator_handle_t const omp_high_bw_mem_alloc =
(omp_allocator_handle_t const)4;
omp_allocator_handle_t const omp_low_lat_mem_alloc =
(omp_allocator_handle_t const)5;
omp_allocator_handle_t const omp_cgroup_mem_alloc =
(omp_allocator_handle_t const)6;
omp_allocator_handle_t const omp_pteam_mem_alloc =
(omp_allocator_handle_t const)7;
omp_allocator_handle_t const omp_thread_mem_alloc =
(omp_allocator_handle_t const)8;
omp_allocator_handle_t const kmp_max_mem_alloc =
(omp_allocator_handle_t const)1024;
omp_allocator_handle_t __kmp_def_allocator = omp_default_mem_alloc;

omp_memspace_handle_t const omp_default_mem_space =
(omp_memspace_handle_t const)0;
omp_memspace_handle_t const omp_large_cap_mem_space =
(omp_memspace_handle_t const)1;
omp_memspace_handle_t const omp_const_mem_space =
(omp_memspace_handle_t const)2;
omp_memspace_handle_t const omp_high_bw_mem_space =
(omp_memspace_handle_t const)3;
omp_memspace_handle_t const omp_low_lat_mem_space =
(omp_memspace_handle_t const)4;
#endif

/* This check ensures that the compiler is passing the correct data type for the
Expand Down
4 changes: 2 additions & 2 deletions openmp/runtime/src/kmp_settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3357,7 +3357,7 @@ static void __kmp_stg_parse_allocator(char const *name, char const *value,
KMP_ASSERT(num > 0);
switch (num) {
case 4:
if (__kmp_hbw_mem_available) {
if (__kmp_memkind_available) {
__kmp_def_allocator = omp_high_bw_mem_alloc;
} else {
__kmp_msg(kmp_ms_warning,
Expand Down Expand Up @@ -3406,7 +3406,7 @@ static void __kmp_stg_parse_allocator(char const *name, char const *value,
}
next = buf;
if (__kmp_match_str("omp_high_bw_mem_alloc", buf, &next)) {
if (__kmp_hbw_mem_available) {
if (__kmp_memkind_available) {
__kmp_def_allocator = omp_high_bw_mem_alloc;
} else {
__kmp_msg(kmp_ms_warning,
Expand Down
47 changes: 38 additions & 9 deletions openmp/runtime/src/kmp_stub.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -344,15 +344,44 @@ double __kmps_get_wtick(void) {

#if OMP_50_ENABLED
/* OpenMP 5.0 Memory Management */
const omp_allocator_t *OMP_NULL_ALLOCATOR = NULL;
const omp_allocator_t *omp_default_mem_alloc = (const omp_allocator_t *)1;
const omp_allocator_t *omp_large_cap_mem_alloc = (const omp_allocator_t *)2;
const omp_allocator_t *omp_const_mem_alloc = (const omp_allocator_t *)3;
const omp_allocator_t *omp_high_bw_mem_alloc = (const omp_allocator_t *)4;
const omp_allocator_t *omp_low_lat_mem_alloc = (const omp_allocator_t *)5;
const omp_allocator_t *omp_cgroup_mem_alloc = (const omp_allocator_t *)6;
const omp_allocator_t *omp_pteam_mem_alloc = (const omp_allocator_t *)7;
const omp_allocator_t *omp_thread_mem_alloc = (const omp_allocator_t *)8;
#if KMP_OS_WINDOWS
omp_allocator_handle_t const omp_null_allocator = 0;
omp_allocator_handle_t const omp_default_mem_alloc =
(omp_allocator_handle_t const)1;
omp_allocator_handle_t const omp_large_cap_mem_alloc =
(omp_allocator_handle_t const)2;
omp_allocator_handle_t const omp_const_mem_alloc =
(omp_allocator_handle_t const)3;
omp_allocator_handle_t const omp_high_bw_mem_alloc =
(omp_allocator_handle_t const)4;
omp_allocator_handle_t const omp_low_lat_mem_alloc =
(omp_allocator_handle_t const)5;
omp_allocator_handle_t const omp_cgroup_mem_alloc =
(omp_allocator_handle_t const)6;
omp_allocator_handle_t const omp_pteam_mem_alloc =
(omp_allocator_handle_t const)7;
omp_allocator_handle_t const omp_thread_mem_alloc =
(omp_allocator_handle_t const)8;

omp_memspace_handle_t const omp_default_mem_space =
(omp_memspace_handle_t const)0;
omp_memspace_handle_t const omp_large_cap_mem_space =
(omp_memspace_handle_t const)1;
omp_memspace_handle_t const omp_const_mem_space =
(omp_memspace_handle_t const)2;
omp_memspace_handle_t const omp_high_bw_mem_space =
(omp_memspace_handle_t const)3;
omp_memspace_handle_t const omp_low_lat_mem_space =
(omp_memspace_handle_t const)4;
#endif /* KMP_OS_WINDOWS */
void *omp_alloc(size_t size, const omp_allocator_handle_t allocator) {
i;
return malloc(size);
}
void omp_free(void *ptr, const omp_allocator_handle_t allocator) {
i;
free(ptr);
}
/* OpenMP 5.0 Affinity Format */
void omp_set_affinity_format(char const *format) { i; }
size_t omp_get_affinity_format(char *buffer, size_t size) {
Expand Down
81 changes: 0 additions & 81 deletions openmp/runtime/test/api/omp_alloc.c

This file was deleted.

32 changes: 32 additions & 0 deletions openmp/runtime/test/api/omp_alloc_def_fb.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// RUN: %libomp-compile-and-run

#include <stdio.h>
#include <omp.h>

int main() {
omp_alloctrait_t at[2];
omp_allocator_handle_t a;
void *p[2];
at[0].key = OMP_ATK_POOL_SIZE;
at[0].value = 2 * 1024 * 1024;
at[1].key = OMP_ATK_FALLBACK;
at[1].value = OMP_ATV_DEFAULT_MEM_FB;
a = omp_init_allocator(omp_large_cap_mem_space, 2, at);
printf("allocator large created: %p\n", a);
#pragma omp parallel num_threads(2)
{
int i = omp_get_thread_num();
p[i] = omp_alloc(1024 * 1024, a);
#pragma omp barrier
printf("th %d, ptr %p\n", i, p[i]);
omp_free(p[i], a);
}
// Both pointers should be non-NULL
if (p[0] != NULL && p[1] != NULL) {
printf("passed\n");
return 0;
} else {
printf("failed: pointers %p %p\n", p[0], p[1]);
return 1;
}
}
45 changes: 45 additions & 0 deletions openmp/runtime/test/api/omp_alloc_hbw.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// RUN: %libomp-compile-and-run

#include <stdio.h>
#include <omp.h>

int main() {
omp_alloctrait_t at[2];
omp_allocator_handle_t a;
void *p[2];
at[0].key = OMP_ATK_POOL_SIZE;
at[0].value = 2 * 1024 * 1024;
at[1].key = OMP_ATK_FALLBACK;
at[1].value = OMP_ATV_NULL_FB;
a = omp_init_allocator(omp_high_bw_mem_space, 2, at);
printf("allocator hbw created: %p\n", a);
#pragma omp parallel num_threads(2)
{
int i = omp_get_thread_num();
p[i] = omp_alloc(1024 * 1024, a);
#pragma omp barrier
printf("th %d, ptr %p\n", i, p[i]);
omp_free(p[i], a);
}
if (a != omp_null_allocator) {
// As an allocator has some small memory overhead
// exactly one of the two pointers should be NULL
// because of NULL fallback requested
if ((p[0] == NULL && p[1] != NULL) || (p[0] != NULL && p[1] == NULL)) {
printf("passed\n");
return 0;
} else {
printf("failed: pointers %p %p\n", p[0], p[1]);
return 1;
}
} else {
// NULL allocator should cause default allocations
if (p[0] != NULL && p[1] != NULL) {
printf("passed\n");
return 0;
} else {
printf("failed: pointers %p %p\n", p[0], p[1]);
return 1;
}
}
}
35 changes: 35 additions & 0 deletions openmp/runtime/test/api/omp_alloc_null_fb.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// RUN: %libomp-compile-and-run

#include <stdio.h>
#include <omp.h>

int main() {
omp_alloctrait_t at[2];
omp_allocator_handle_t a;
void *p[2];
at[0].key = OMP_ATK_POOL_SIZE;
at[0].value = 2 * 1024 * 1024;
at[1].key = OMP_ATK_FALLBACK;
at[1].value = OMP_ATV_NULL_FB;
a = omp_init_allocator(omp_large_cap_mem_space, 2, at);
printf("allocator large created: %p\n", a);
#pragma omp parallel num_threads(2)
{
int i = omp_get_thread_num();
#pragma omp barrier
p[i] = omp_alloc(1024 * 1024, a);
#pragma omp barrier
printf("th %d, ptr %p\n", i, p[i]);
omp_free(p[i], a);
}
// As an allocator has some small memory overhead
// exactly one of the two pointers should be NULL
// because of NULL fallback requested
if ((p[0] == NULL && p[1] != NULL) || (p[0] != NULL && p[1] == NULL)) {
printf("passed\n");
return 0;
} else {
printf("failed: pointers %p %p\n", p[0], p[1]);
return 1;
}
}
3 changes: 2 additions & 1 deletion openmp/runtime/tools/generate-def.pl
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ (\%)
foreach my $entry ( keys( %$entries ) ) {
if ( not $entries->{ $entry }->{ obsolete } ) {
my $ordinal = $entries->{ $entry }->{ ordinal };
if ( $entry =~ m{\A[ok]mp_} ) {
# omp_alloc and omp_free are C/C++ only functions, skip "1000+ordinal" for them
if ( $entry =~ m{\A[ok]mp_} and $entry ne "omp_alloc" and $entry ne "omp_free" ) {
if ( not defined( $ordinal ) ) {
runtime_error(
"Bad entry \"$entry\": ordinal number is not specified."
Expand Down