Skip to content

[OpenMP] 6.0 (TR11) Memory Management Update #97106

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions openmp/runtime/src/dllexports
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,18 @@ kmp_set_disp_num_buffers 890
omp_get_device_num 896
omp_init_allocator 897
omp_destroy_allocator 898
omp_get_devices_memspace 810
omp_get_device_memspace 811
omp_get_devices_and_host_memspace 812
omp_get_device_and_host_memspace 813
omp_get_devices_all_memspace 814
omp_get_devices_allocator 815
omp_get_device_allocator 816
omp_get_devices_and_host_allocator 817
omp_get_device_and_host_allocator 818
omp_get_devices_all_allocator 819
omp_get_memspace_num_resources 820
omp_get_submemspace 821
%ifndef stub
__kmpc_set_default_allocator
__kmpc_get_default_allocator
Expand Down Expand Up @@ -592,6 +604,7 @@ kmp_set_disp_num_buffers 890
llvm_omp_target_host_mem_space DATA
llvm_omp_target_shared_mem_space DATA
llvm_omp_target_device_mem_space DATA
omp_null_mem_space DATA

%ifndef stub
# Ordinals between 900 and 999 are reserved
Expand Down
34 changes: 30 additions & 4 deletions openmp/runtime/src/include/omp.h.var
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,13 @@
omp_atk_fallback = 5,
omp_atk_fb_data = 6,
omp_atk_pinned = 7,
omp_atk_partition = 8
omp_atk_partition = 8,
omp_atk_pin_device = 9,
omp_atk_preferred_device = 10,
omp_atk_device_access = 11,
omp_atk_target_access = 12,
omp_atk_atomic_scope = 13,
omp_atk_part_size = 14
} omp_alloctrait_key_t;

typedef enum {
Expand All @@ -350,7 +356,7 @@
omp_atv_serialized = 5,
omp_atv_sequential = omp_atv_serialized, // (deprecated)
omp_atv_private = 6,
omp_atv_all = 7,
omp_atv_device = 7,
omp_atv_thread = 8,
omp_atv_pteam = 9,
omp_atv_cgroup = 10,
Expand All @@ -361,7 +367,11 @@
omp_atv_environment = 15,
omp_atv_nearest = 16,
omp_atv_blocked = 17,
omp_atv_interleaved = 18
omp_atv_interleaved = 18,
omp_atv_all = 19,
omp_atv_single = 20,
omp_atv_multiple = 21,
omp_atv_memspace = 22
} omp_alloctrait_value_t;
#define omp_atv_default ((omp_uintptr_t)-1)

Expand All @@ -387,6 +397,7 @@
extern __KMP_IMP omp_allocator_handle_t const llvm_omp_target_device_mem_alloc;

typedef omp_uintptr_t omp_memspace_handle_t;
extern __KMP_IMP omp_memspace_handle_t const omp_null_mem_space;
extern __KMP_IMP omp_memspace_handle_t const omp_default_mem_space;
extern __KMP_IMP omp_memspace_handle_t const omp_large_cap_mem_space;
extern __KMP_IMP omp_memspace_handle_t const omp_const_mem_space;
Expand Down Expand Up @@ -422,7 +433,8 @@
typedef enum omp_memspace_handle_t
# endif
{
omp_default_mem_space = 0,
omp_null_mem_space = 0,
omp_default_mem_space = 99,
omp_large_cap_mem_space = 1,
omp_const_mem_space = 2,
omp_high_bw_mem_space = 3,
Expand Down Expand Up @@ -463,6 +475,20 @@
extern void __KAI_KMPC_CONVENTION omp_free(void *ptr, omp_allocator_handle_t a);
# endif

/* OpenMP TR11 routines to get memory spaces and allocators */
extern omp_memspace_handle_t omp_get_devices_memspace(int ndevs, const int *devs, omp_memspace_handle_t memspace);
extern omp_memspace_handle_t omp_get_device_memspace(int dev, omp_memspace_handle_t memspace);
extern omp_memspace_handle_t omp_get_devices_and_host_memspace(int ndevs, const int *devs, omp_memspace_handle_t memspace);
extern omp_memspace_handle_t omp_get_device_and_host_memspace(int dev, omp_memspace_handle_t memspace);
extern omp_memspace_handle_t omp_get_devices_all_memspace(omp_memspace_handle_t memspace);
extern omp_allocator_handle_t omp_get_devices_allocator(int ndevs, const int *devs, omp_memspace_handle_t memspace);
extern omp_allocator_handle_t omp_get_device_allocator(int dev, omp_memspace_handle_t memspace);
extern omp_allocator_handle_t omp_get_devices_and_host_allocator(int ndevs, const int *devs, omp_memspace_handle_t memspace);
extern omp_allocator_handle_t omp_get_device_and_host_allocator(int dev, omp_memspace_handle_t memspace);
extern omp_allocator_handle_t omp_get_devices_all_allocator(omp_memspace_handle_t memspace);
extern int omp_get_memspace_num_resources(omp_memspace_handle_t memspace);
extern omp_memspace_handle_t omp_get_submemspace(omp_memspace_handle_t memspace, int num_resources, int *resources);

/* OpenMP 5.0 Affinity Format */
extern void __KAI_KMPC_CONVENTION omp_set_affinity_format(char const *);
extern size_t __KAI_KMPC_CONVENTION omp_get_affinity_format(char *, size_t);
Expand Down
106 changes: 104 additions & 2 deletions openmp/runtime/src/include/omp_lib.F90.var
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,12 @@
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_fb_data = 6
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_pinned = 7
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_partition = 8
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_pin_device = 9
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_preferred_device = 10
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_device_access = 11
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_target_access = 12
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_atomic_scope = 13
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_part_size = 14

integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_default = -1
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_false = 0
Expand All @@ -154,7 +160,7 @@
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_serialized = 5
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_sequential = omp_atv_serialized
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_private = 6
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_all = 7
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_device = 7
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_thread = 8
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_pteam = 9
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_cgroup = 10
Expand All @@ -166,6 +172,10 @@
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_nearest = 16
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_blocked = 17
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_interleaved = 18
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_all = 19
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_single = 20
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_multiple = 21
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_memspace = 22

integer (kind=omp_allocator_handle_kind), parameter, public :: omp_null_allocator = 0
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_default_mem_alloc = 1
Expand All @@ -180,7 +190,8 @@
integer (kind=omp_allocator_handle_kind), parameter, public :: llvm_omp_target_shared_mem_alloc = 101
integer (kind=omp_allocator_handle_kind), parameter, public :: llvm_omp_target_device_mem_alloc = 102

integer (kind=omp_memspace_handle_kind), parameter, public :: omp_default_mem_space = 0
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_null_mem_space = 0
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_default_mem_space = 99
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_large_cap_mem_space = 1
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_const_mem_space = 2
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_high_bw_mem_space = 3
Expand Down Expand Up @@ -802,6 +813,97 @@
logical (kind=omp_logical_kind) omp_in_explicit_task
end function omp_in_explicit_task

function omp_get_devices_memspace(ndevs, devs, memspace)
use omp_lib_kinds
integer(omp_memspace_handle_kind) :: omp_get_devices_memspace
integer, intent(in) :: ndevs
integer, intent(in) :: devs(*)
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_memspace

function omp_get_device_memspace(dev, memspace)
use omp_lib_kinds
integer(omp_memspace_handle_kind) :: omp_get_device_memspace
integer, intent(in) :: dev
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_device_memspace

function omp_get_devices_and_host_memspace(ndevs, devs, memspace)
use omp_lib_kinds
integer(omp_memspace_handle_kind) :: &
omp_get_devices_and_host_memspace
integer, intent(in) :: ndevs
integer, intent(in) :: devs(*)
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_and_host_memspace

function omp_get_device_and_host_memspace(dev, memspace)
use omp_lib_kinds
integer(omp_memspace_handle_kind) :: &
omp_get_device_and_host_memspace
integer, intent(in) :: dev
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_device_and_host_memspace

function omp_get_devices_all_memspace(memspace)
use omp_lib_kinds
integer(omp_memspace_handle_kind) :: omp_get_devices_all_memspace
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_all_memspace

function omp_get_devices_allocator(ndevs, devs, memspace)
use omp_lib_kinds
integer(omp_allocator_handle_kind) :: omp_get_devices_allocator
integer, intent(in) :: ndevs
integer, intent(in) :: devs(*)
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_allocator

function omp_get_device_allocator(dev, memspace)
use omp_lib_kinds
integer(omp_allocator_handle_kind) :: omp_get_device_allocator
integer, intent(in) :: dev
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_device_allocator

function omp_get_devices_and_host_allocator(ndevs, devs, memspace)
use omp_lib_kinds
integer(omp_allocator_handle_kind) :: &
omp_get_devices_and_host_allocator
integer, intent(in) :: ndevs
integer, intent(in) :: devs(*)
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_and_host_allocator

function omp_get_device_and_host_allocator(dev, memspace)
use omp_lib_kinds
integer(omp_allocator_handle_kind) :: &
omp_get_device_and_host_allocator
integer, intent(in) :: dev
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_device_and_host_allocator

function omp_get_devices_all_allocator(memspace)
use omp_lib_kinds
integer(omp_allocator_handle_kind) :: &
omp_get_devices_all_allocator
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_all_allocator

function omp_get_memspace_num_resources(memspace)
use omp_lib_kinds
integer omp_get_memspace_num_resources
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_memspace_num_resources

function omp_get_submemspace(memspace, num_resources, resources)
use omp_lib_kinds
integer(omp_memspace_handle_kind) omp_get_submemspace
integer(omp_memspace_handle_kind), intent(in) :: memspace
integer, intent(in) :: num_resources
integer, intent(in) :: resources(*)
end function omp_get_submemspace

! ***
! *** kmp_* entry points
! ***
Expand Down
120 changes: 117 additions & 3 deletions openmp/runtime/src/include/omp_lib.h.var
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,18 @@
parameter(omp_atk_pinned=7)
integer(kind=omp_alloctrait_key_kind)omp_atk_partition
parameter(omp_atk_partition=8)
integer(kind=omp_alloctrait_key_kind)omp_atk_pin_device
parameter(omp_atk_pin_device=9)
integer(kind=omp_alloctrait_key_kind)omp_atk_preferred_device
parameter(omp_atk_preferred_device=10)
integer(kind=omp_alloctrait_key_kind)omp_atk_device_access
parameter(omp_atk_device_access=11)
integer(kind=omp_alloctrait_key_kind)omp_atk_target_access
parameter(omp_atk_target_access=12)
integer(kind=omp_alloctrait_key_kind)omp_atk_atomic_scope
parameter(omp_atk_atomic_scope=13)
integer(kind=omp_alloctrait_key_kind)omp_atk_part_size
parameter(omp_atk_part_size=14)

integer(kind=omp_alloctrait_val_kind)omp_atv_default
parameter(omp_atv_default=-1)
Expand All @@ -170,8 +182,8 @@
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_device
parameter(omp_atv_device=7)
integer(kind=omp_alloctrait_val_kind)omp_atv_thread
parameter(omp_atv_thread=8)
integer(kind=omp_alloctrait_val_kind)omp_atv_pteam
Expand All @@ -194,6 +206,14 @@
parameter(omp_atv_blocked=17)
integer(kind=omp_alloctrait_val_kind)omp_atv_interleaved
parameter(omp_atv_interleaved=18)
integer(kind=omp_alloctrait_val_kind)omp_atv_all
parameter(omp_atv_all=19)
integer(kind=omp_alloctrait_val_kind)omp_atv_single
parameter(omp_atv_single=20)
integer(kind=omp_alloctrait_val_kind)omp_atv_multiple
parameter(omp_atv_multiple=21)
integer(kind=omp_alloctrait_val_kind)omp_atv_memspace
parameter(omp_atv_memspace=22)

type omp_alloctrait
integer (kind=omp_alloctrait_key_kind) key
Expand Down Expand Up @@ -225,8 +245,10 @@
integer(omp_allocator_handle_kind)llvm_omp_target_device_mem_alloc
parameter(llvm_omp_target_device_mem_alloc=102)

integer(kind=omp_memspace_handle_kind)omp_null_mem_space
parameter(omp_null_mem_space=0)
integer(kind=omp_memspace_handle_kind)omp_default_mem_space
parameter(omp_default_mem_space=0)
parameter(omp_default_mem_space=99)
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
Expand Down Expand Up @@ -863,6 +885,98 @@
logical (kind=omp_logical_kind) omp_in_explicit_task
end function omp_in_explicit_task

function omp_get_devices_memspace(ndevs, devs, memspace)
import
integer(omp_memspace_handle_kind) :: omp_get_devices_memspace
integer, intent(in) :: ndevs
integer, intent(in) :: devs(*)
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_memspace

function omp_get_device_memspace(dev, memspace)
import
integer(omp_memspace_handle_kind) :: omp_get_device_memspace
integer, intent(in) :: dev
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_device_memspace

function omp_get_devices_and_host_memspace(ndevs,devs,memspace)
import
integer(omp_memspace_handle_kind) :: &
& omp_get_devices_and_host_memspace
integer, intent(in) :: ndevs
integer, intent(in) :: devs(*)
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_and_host_memspace

function omp_get_device_and_host_memspace(dev, memspace)
import
integer(omp_memspace_handle_kind) :: &
& omp_get_device_and_host_memspace
integer, intent(in) :: dev
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_device_and_host_memspace

function omp_get_devices_all_memspace(memspace)
import
integer(omp_memspace_handle_kind)::omp_get_devices_all_memspace
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_all_memspace

function omp_get_devices_allocator(ndevs, devs, memspace)
import
integer(omp_allocator_handle_kind)::omp_get_devices_allocator
integer, intent(in) :: ndevs
integer, intent(in) :: devs(*)
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_allocator

function omp_get_device_allocator(dev, memspace)
import
integer(omp_allocator_handle_kind) :: omp_get_device_allocator
integer, intent(in) :: dev
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_device_allocator

function omp_get_devices_and_host_allocator(ndevs,devs,memspace)
import
integer(omp_allocator_handle_kind) :: &
& omp_get_devices_and_host_allocator
integer, intent(in) :: ndevs
integer, intent(in) :: devs(*)
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_and_host_allocator

function omp_get_device_and_host_allocator(dev, memspace)
import
integer(omp_allocator_handle_kind) :: &
& omp_get_device_and_host_allocator
integer, intent(in) :: dev
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_device_and_host_allocator

function omp_get_devices_all_allocator(memspace)
import
integer(omp_allocator_handle_kind) :: &
& omp_get_devices_all_allocator
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_devices_all_allocator

function omp_get_memspace_num_resources(memspace)
import
integer omp_get_memspace_num_resources
integer(omp_memspace_handle_kind), intent(in) :: memspace
end function omp_get_memspace_num_resources

function omp_get_submemspace(memspace, num_resources, resources)
import
integer(omp_memspace_handle_kind) omp_get_submemspace
integer(omp_memspace_handle_kind), intent(in) :: memspace
integer, intent(in) :: num_resources
integer, intent(in) :: resources(*)
end function omp_get_submemspace


! ***
! *** kmp_* entry points
! ***
Expand Down
Loading
Loading