Skip to content

Commit 7f91e18

Browse files
hansangbaesaiislam
authored andcommitted
[OpenMP] 6.0 (TR11) Memory Management Update (llvm#97106)
TR11 introduced changes to support target memory management in a unified way by defining a series of API routines and additional traits. Host runtime is oblivious to how actual memory resources are mapped when using the new API routines, so it can only support how the composed memory space is maintained, and the offload backend must handle which memory resources are actually used to allocate memory from the memory space. Here is summary of the implementation. * Implemented 12 API routines to get/mainpulate memory space/allocator. * Memory space composed with a list of devices has a state with resource description, and runtime is responsible for maintaining the allocated memory space objects. * Defined interface with offload runtime to access memory resource list, and to redirect calls to omp_alloc/omp_free since it requires backend-specific information. * Value of omp_default_mem_space changed from 0 to 99, and omp_null_mem_space took the value 0 as defined in the language. * New allocator traits were introduced, but how to use them is up to the offload backend. * Added basic tests for the new API routines.
1 parent 9ff42de commit 7f91e18

File tree

12 files changed

+1001
-16
lines changed

12 files changed

+1001
-16
lines changed

openmp/runtime/src/dllexports

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,18 @@ kmp_set_disp_num_buffers 890
536536
omp_destroy_allocator 898
537537
omp_get_memory_space 900
538538
omp_destroy_memory_space 901
539+
omp_get_devices_memspace 810
540+
omp_get_device_memspace 811
541+
omp_get_devices_and_host_memspace 812
542+
omp_get_device_and_host_memspace 813
543+
omp_get_devices_all_memspace 814
544+
omp_get_devices_allocator 815
545+
omp_get_device_allocator 816
546+
omp_get_devices_and_host_allocator 817
547+
omp_get_device_and_host_allocator 818
548+
omp_get_devices_all_allocator 819
549+
omp_get_memspace_num_resources 820
550+
omp_get_submemspace 821
539551
%ifndef stub
540552
__kmpc_set_default_allocator
541553
__kmpc_get_default_allocator
@@ -607,6 +619,7 @@ kmp_set_disp_num_buffers 890
607619
llvm_omp_target_host_mem_space DATA
608620
llvm_omp_target_shared_mem_space DATA
609621
llvm_omp_target_device_mem_space DATA
622+
omp_null_mem_space DATA
610623

611624
%ifndef stub
612625
# Ordinals between 900 and 999 are reserved

openmp/runtime/src/include/omp.h.var

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,13 @@
358358
omp_atk_fallback = 5,
359359
omp_atk_fb_data = 6,
360360
omp_atk_pinned = 7,
361-
omp_atk_partition = 8
361+
omp_atk_partition = 8,
362+
omp_atk_pin_device = 9,
363+
omp_atk_preferred_device = 10,
364+
omp_atk_device_access = 11,
365+
omp_atk_target_access = 12,
366+
omp_atk_atomic_scope = 13,
367+
omp_atk_part_size = 14
362368
} omp_alloctrait_key_t;
363369

364370
typedef enum {
@@ -369,7 +375,7 @@
369375
omp_atv_serialized = 5,
370376
omp_atv_sequential = omp_atv_serialized, // (deprecated)
371377
omp_atv_private = 6,
372-
omp_atv_all = 7,
378+
omp_atv_device = 7,
373379
omp_atv_thread = 8,
374380
omp_atv_pteam = 9,
375381
omp_atv_cgroup = 10,
@@ -380,7 +386,11 @@
380386
omp_atv_environment = 15,
381387
omp_atv_nearest = 16,
382388
omp_atv_blocked = 17,
383-
omp_atv_interleaved = 18
389+
omp_atv_interleaved = 18,
390+
omp_atv_all = 19,
391+
omp_atv_single = 20,
392+
omp_atv_multiple = 21,
393+
omp_atv_memspace = 22
384394
} omp_alloctrait_value_t;
385395
#define omp_atv_default ((omp_uintptr_t)-1)
386396

@@ -408,6 +418,7 @@
408418
extern __KMP_IMP omp_allocator_handle_t const ompx_pinned_mem_alloc;
409419

410420
typedef omp_uintptr_t omp_memspace_handle_t;
421+
extern __KMP_IMP omp_memspace_handle_t const omp_null_mem_space;
411422
extern __KMP_IMP omp_memspace_handle_t const omp_default_mem_space;
412423
extern __KMP_IMP omp_memspace_handle_t const omp_large_cap_mem_space;
413424
extern __KMP_IMP omp_memspace_handle_t const omp_const_mem_space;
@@ -445,7 +456,8 @@
445456
typedef enum omp_memspace_handle_t
446457
# endif
447458
{
448-
omp_default_mem_space = 0,
459+
omp_null_mem_space = 0,
460+
omp_default_mem_space = 99,
449461
omp_large_cap_mem_space = 1,
450462
omp_const_mem_space = 2,
451463
omp_high_bw_mem_space = 3,
@@ -488,6 +500,20 @@
488500
extern void __KAI_KMPC_CONVENTION omp_free(void *ptr, omp_allocator_handle_t a);
489501
# endif
490502

503+
/* OpenMP TR11 routines to get memory spaces and allocators */
504+
extern omp_memspace_handle_t omp_get_devices_memspace(int ndevs, const int *devs, omp_memspace_handle_t memspace);
505+
extern omp_memspace_handle_t omp_get_device_memspace(int dev, omp_memspace_handle_t memspace);
506+
extern omp_memspace_handle_t omp_get_devices_and_host_memspace(int ndevs, const int *devs, omp_memspace_handle_t memspace);
507+
extern omp_memspace_handle_t omp_get_device_and_host_memspace(int dev, omp_memspace_handle_t memspace);
508+
extern omp_memspace_handle_t omp_get_devices_all_memspace(omp_memspace_handle_t memspace);
509+
extern omp_allocator_handle_t omp_get_devices_allocator(int ndevs, const int *devs, omp_memspace_handle_t memspace);
510+
extern omp_allocator_handle_t omp_get_device_allocator(int dev, omp_memspace_handle_t memspace);
511+
extern omp_allocator_handle_t omp_get_devices_and_host_allocator(int ndevs, const int *devs, omp_memspace_handle_t memspace);
512+
extern omp_allocator_handle_t omp_get_device_and_host_allocator(int dev, omp_memspace_handle_t memspace);
513+
extern omp_allocator_handle_t omp_get_devices_all_allocator(omp_memspace_handle_t memspace);
514+
extern int omp_get_memspace_num_resources(omp_memspace_handle_t memspace);
515+
extern omp_memspace_handle_t omp_get_submemspace(omp_memspace_handle_t memspace, int num_resources, int *resources);
516+
491517
/* OpenMP 5.0 Affinity Format */
492518
extern void __KAI_KMPC_CONVENTION omp_set_affinity_format(char const *);
493519
extern size_t __KAI_KMPC_CONVENTION omp_get_affinity_format(char *, size_t);

openmp/runtime/src/include/omp_lib.F90.var

Lines changed: 104 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,12 @@
145145
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_fb_data = 6
146146
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_pinned = 7
147147
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_partition = 8
148+
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_pin_device = 9
149+
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_preferred_device = 10
150+
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_device_access = 11
151+
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_target_access = 12
152+
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_atomic_scope = 13
153+
integer (kind=omp_alloctrait_key_kind), parameter, public :: omp_atk_part_size = 14
148154

149155
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_default = -1
150156
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_false = 0
@@ -154,7 +160,7 @@
154160
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_serialized = 5
155161
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_sequential = omp_atv_serialized
156162
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_private = 6
157-
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_all = 7
163+
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_device = 7
158164
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_thread = 8
159165
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_pteam = 9
160166
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_cgroup = 10
@@ -166,6 +172,10 @@
166172
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_nearest = 16
167173
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_blocked = 17
168174
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_interleaved = 18
175+
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_all = 19
176+
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_single = 20
177+
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_multiple = 21
178+
integer (kind=omp_alloctrait_val_kind), parameter, public :: omp_atv_memspace = 22
169179

170180
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_null_allocator = 0
171181
integer (kind=omp_allocator_handle_kind), parameter, public :: omp_default_mem_alloc = 1
@@ -182,7 +192,8 @@
182192
! Preview of pinned memory support
183193
integer (kind=omp_allocator_handle_kind), parameter :: ompx_pinned_mem_alloc = 120
184194

185-
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_default_mem_space = 0
195+
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_null_mem_space = 0
196+
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_default_mem_space = 99
186197
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_large_cap_mem_space = 1
187198
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_const_mem_space = 2
188199
integer (kind=omp_memspace_handle_kind), parameter, public :: omp_high_bw_mem_space = 3
@@ -834,6 +845,97 @@
834845
logical (kind=omp_logical_kind) omp_in_explicit_task
835846
end function omp_in_explicit_task
836847

848+
function omp_get_devices_memspace(ndevs, devs, memspace)
849+
use omp_lib_kinds
850+
integer(omp_memspace_handle_kind) :: omp_get_devices_memspace
851+
integer, intent(in) :: ndevs
852+
integer, intent(in) :: devs(*)
853+
integer(omp_memspace_handle_kind), intent(in) :: memspace
854+
end function omp_get_devices_memspace
855+
856+
function omp_get_device_memspace(dev, memspace)
857+
use omp_lib_kinds
858+
integer(omp_memspace_handle_kind) :: omp_get_device_memspace
859+
integer, intent(in) :: dev
860+
integer(omp_memspace_handle_kind), intent(in) :: memspace
861+
end function omp_get_device_memspace
862+
863+
function omp_get_devices_and_host_memspace(ndevs, devs, memspace)
864+
use omp_lib_kinds
865+
integer(omp_memspace_handle_kind) :: &
866+
omp_get_devices_and_host_memspace
867+
integer, intent(in) :: ndevs
868+
integer, intent(in) :: devs(*)
869+
integer(omp_memspace_handle_kind), intent(in) :: memspace
870+
end function omp_get_devices_and_host_memspace
871+
872+
function omp_get_device_and_host_memspace(dev, memspace)
873+
use omp_lib_kinds
874+
integer(omp_memspace_handle_kind) :: &
875+
omp_get_device_and_host_memspace
876+
integer, intent(in) :: dev
877+
integer(omp_memspace_handle_kind), intent(in) :: memspace
878+
end function omp_get_device_and_host_memspace
879+
880+
function omp_get_devices_all_memspace(memspace)
881+
use omp_lib_kinds
882+
integer(omp_memspace_handle_kind) :: omp_get_devices_all_memspace
883+
integer(omp_memspace_handle_kind), intent(in) :: memspace
884+
end function omp_get_devices_all_memspace
885+
886+
function omp_get_devices_allocator(ndevs, devs, memspace)
887+
use omp_lib_kinds
888+
integer(omp_allocator_handle_kind) :: omp_get_devices_allocator
889+
integer, intent(in) :: ndevs
890+
integer, intent(in) :: devs(*)
891+
integer(omp_memspace_handle_kind), intent(in) :: memspace
892+
end function omp_get_devices_allocator
893+
894+
function omp_get_device_allocator(dev, memspace)
895+
use omp_lib_kinds
896+
integer(omp_allocator_handle_kind) :: omp_get_device_allocator
897+
integer, intent(in) :: dev
898+
integer(omp_memspace_handle_kind), intent(in) :: memspace
899+
end function omp_get_device_allocator
900+
901+
function omp_get_devices_and_host_allocator(ndevs, devs, memspace)
902+
use omp_lib_kinds
903+
integer(omp_allocator_handle_kind) :: &
904+
omp_get_devices_and_host_allocator
905+
integer, intent(in) :: ndevs
906+
integer, intent(in) :: devs(*)
907+
integer(omp_memspace_handle_kind), intent(in) :: memspace
908+
end function omp_get_devices_and_host_allocator
909+
910+
function omp_get_device_and_host_allocator(dev, memspace)
911+
use omp_lib_kinds
912+
integer(omp_allocator_handle_kind) :: &
913+
omp_get_device_and_host_allocator
914+
integer, intent(in) :: dev
915+
integer(omp_memspace_handle_kind), intent(in) :: memspace
916+
end function omp_get_device_and_host_allocator
917+
918+
function omp_get_devices_all_allocator(memspace)
919+
use omp_lib_kinds
920+
integer(omp_allocator_handle_kind) :: &
921+
omp_get_devices_all_allocator
922+
integer(omp_memspace_handle_kind), intent(in) :: memspace
923+
end function omp_get_devices_all_allocator
924+
925+
function omp_get_memspace_num_resources(memspace)
926+
use omp_lib_kinds
927+
integer omp_get_memspace_num_resources
928+
integer(omp_memspace_handle_kind), intent(in) :: memspace
929+
end function omp_get_memspace_num_resources
930+
931+
function omp_get_submemspace(memspace, num_resources, resources)
932+
use omp_lib_kinds
933+
integer(omp_memspace_handle_kind) omp_get_submemspace
934+
integer(omp_memspace_handle_kind), intent(in) :: memspace
935+
integer, intent(in) :: num_resources
936+
integer, intent(in) :: resources(*)
937+
end function omp_get_submemspace
938+
837939
! ***
838940
! *** kmp_* entry points
839941
! ***

openmp/runtime/src/include/omp_lib.h.var

Lines changed: 117 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,18 @@
151151
parameter(omp_atk_pinned=7)
152152
integer(kind=omp_alloctrait_key_kind)omp_atk_partition
153153
parameter(omp_atk_partition=8)
154+
integer(kind=omp_alloctrait_key_kind)omp_atk_pin_device
155+
parameter(omp_atk_pin_device=9)
156+
integer(kind=omp_alloctrait_key_kind)omp_atk_preferred_device
157+
parameter(omp_atk_preferred_device=10)
158+
integer(kind=omp_alloctrait_key_kind)omp_atk_device_access
159+
parameter(omp_atk_device_access=11)
160+
integer(kind=omp_alloctrait_key_kind)omp_atk_target_access
161+
parameter(omp_atk_target_access=12)
162+
integer(kind=omp_alloctrait_key_kind)omp_atk_atomic_scope
163+
parameter(omp_atk_atomic_scope=13)
164+
integer(kind=omp_alloctrait_key_kind)omp_atk_part_size
165+
parameter(omp_atk_part_size=14)
154166

155167
integer(kind=omp_alloctrait_val_kind)omp_atv_default
156168
parameter(omp_atv_default=-1)
@@ -170,8 +182,8 @@
170182
parameter(omp_atv_sequential=5)
171183
integer(kind=omp_alloctrait_val_kind)omp_atv_private
172184
parameter(omp_atv_private=6)
173-
integer(kind=omp_alloctrait_val_kind)omp_atv_all
174-
parameter(omp_atv_all=7)
185+
integer(kind=omp_alloctrait_val_kind)omp_atv_device
186+
parameter(omp_atv_device=7)
175187
integer(kind=omp_alloctrait_val_kind)omp_atv_thread
176188
parameter(omp_atv_thread=8)
177189
integer(kind=omp_alloctrait_val_kind)omp_atv_pteam
@@ -194,6 +206,14 @@
194206
parameter(omp_atv_blocked=17)
195207
integer(kind=omp_alloctrait_val_kind)omp_atv_interleaved
196208
parameter(omp_atv_interleaved=18)
209+
integer(kind=omp_alloctrait_val_kind)omp_atv_all
210+
parameter(omp_atv_all=19)
211+
integer(kind=omp_alloctrait_val_kind)omp_atv_single
212+
parameter(omp_atv_single=20)
213+
integer(kind=omp_alloctrait_val_kind)omp_atv_multiple
214+
parameter(omp_atv_multiple=21)
215+
integer(kind=omp_alloctrait_val_kind)omp_atv_memspace
216+
parameter(omp_atv_memspace=22)
197217

198218
type omp_alloctrait
199219
integer (kind=omp_alloctrait_key_kind) key
@@ -228,8 +248,10 @@
228248
integer(kind=omp_allocator_handle_kind)ompx_pinned_mem_alloc
229249
parameter(ompx_pinned_mem_alloc=120)
230250

251+
integer(kind=omp_memspace_handle_kind)omp_null_mem_space
252+
parameter(omp_null_mem_space=0)
231253
integer(kind=omp_memspace_handle_kind)omp_default_mem_space
232-
parameter(omp_default_mem_space=0)
254+
parameter(omp_default_mem_space=99)
233255
integer(kind=omp_memspace_handle_kind)omp_large_cap_mem_space
234256
parameter(omp_large_cap_mem_space=1)
235257
integer(kind=omp_memspace_handle_kind)omp_const_mem_space
@@ -896,6 +918,98 @@
896918
logical (kind=omp_logical_kind) omp_in_explicit_task
897919
end function omp_in_explicit_task
898920

921+
function omp_get_devices_memspace(ndevs, devs, memspace)
922+
import
923+
integer(omp_memspace_handle_kind) :: omp_get_devices_memspace
924+
integer, intent(in) :: ndevs
925+
integer, intent(in) :: devs(*)
926+
integer(omp_memspace_handle_kind), intent(in) :: memspace
927+
end function omp_get_devices_memspace
928+
929+
function omp_get_device_memspace(dev, memspace)
930+
import
931+
integer(omp_memspace_handle_kind) :: omp_get_device_memspace
932+
integer, intent(in) :: dev
933+
integer(omp_memspace_handle_kind), intent(in) :: memspace
934+
end function omp_get_device_memspace
935+
936+
function omp_get_devices_and_host_memspace(ndevs,devs,memspace)
937+
import
938+
integer(omp_memspace_handle_kind) :: &
939+
& omp_get_devices_and_host_memspace
940+
integer, intent(in) :: ndevs
941+
integer, intent(in) :: devs(*)
942+
integer(omp_memspace_handle_kind), intent(in) :: memspace
943+
end function omp_get_devices_and_host_memspace
944+
945+
function omp_get_device_and_host_memspace(dev, memspace)
946+
import
947+
integer(omp_memspace_handle_kind) :: &
948+
& omp_get_device_and_host_memspace
949+
integer, intent(in) :: dev
950+
integer(omp_memspace_handle_kind), intent(in) :: memspace
951+
end function omp_get_device_and_host_memspace
952+
953+
function omp_get_devices_all_memspace(memspace)
954+
import
955+
integer(omp_memspace_handle_kind)::omp_get_devices_all_memspace
956+
integer(omp_memspace_handle_kind), intent(in) :: memspace
957+
end function omp_get_devices_all_memspace
958+
959+
function omp_get_devices_allocator(ndevs, devs, memspace)
960+
import
961+
integer(omp_allocator_handle_kind)::omp_get_devices_allocator
962+
integer, intent(in) :: ndevs
963+
integer, intent(in) :: devs(*)
964+
integer(omp_memspace_handle_kind), intent(in) :: memspace
965+
end function omp_get_devices_allocator
966+
967+
function omp_get_device_allocator(dev, memspace)
968+
import
969+
integer(omp_allocator_handle_kind) :: omp_get_device_allocator
970+
integer, intent(in) :: dev
971+
integer(omp_memspace_handle_kind), intent(in) :: memspace
972+
end function omp_get_device_allocator
973+
974+
function omp_get_devices_and_host_allocator(ndevs,devs,memspace)
975+
import
976+
integer(omp_allocator_handle_kind) :: &
977+
& omp_get_devices_and_host_allocator
978+
integer, intent(in) :: ndevs
979+
integer, intent(in) :: devs(*)
980+
integer(omp_memspace_handle_kind), intent(in) :: memspace
981+
end function omp_get_devices_and_host_allocator
982+
983+
function omp_get_device_and_host_allocator(dev, memspace)
984+
import
985+
integer(omp_allocator_handle_kind) :: &
986+
& omp_get_device_and_host_allocator
987+
integer, intent(in) :: dev
988+
integer(omp_memspace_handle_kind), intent(in) :: memspace
989+
end function omp_get_device_and_host_allocator
990+
991+
function omp_get_devices_all_allocator(memspace)
992+
import
993+
integer(omp_allocator_handle_kind) :: &
994+
& omp_get_devices_all_allocator
995+
integer(omp_memspace_handle_kind), intent(in) :: memspace
996+
end function omp_get_devices_all_allocator
997+
998+
function omp_get_memspace_num_resources(memspace)
999+
import
1000+
integer omp_get_memspace_num_resources
1001+
integer(omp_memspace_handle_kind), intent(in) :: memspace
1002+
end function omp_get_memspace_num_resources
1003+
1004+
function omp_get_submemspace(memspace, num_resources, resources)
1005+
import
1006+
integer(omp_memspace_handle_kind) omp_get_submemspace
1007+
integer(omp_memspace_handle_kind), intent(in) :: memspace
1008+
integer, intent(in) :: num_resources
1009+
integer, intent(in) :: resources(*)
1010+
end function omp_get_submemspace
1011+
1012+
8991013
! ***
9001014
! *** kmp_* entry points
9011015
! ***

0 commit comments

Comments
 (0)