1 !===-- module/omp_lib.h ------------------------------------------*- F90 -*-===! 2 ! 3 ! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 ! See https://llvm.org/LICENSE.txt for license information. 5 ! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 ! 7 !===------------------------------------------------------------------------===! 8 9 !dir$ free 10 11 integer, parameter :: omp_integer_kind = selected_int_kind(9) ! 32-bit int 12 integer, parameter :: omp_logical_kind = kind(.true.) 13 14 integer, parameter :: omp_sched_kind = omp_integer_kind 15 integer, parameter :: omp_proc_bind_kind = omp_integer_kind 16 integer, parameter :: omp_pause_resource_kind = omp_integer_kind 17 integer, parameter :: omp_sync_hint_kind = omp_integer_kind 18 integer, parameter :: omp_lock_hint_kind = omp_sync_hint_kind 19 integer, parameter :: omp_event_handle_kind = omp_integer_kind 20 integer, parameter :: omp_alloctrait_key_kind = omp_integer_kind 21 integer, parameter :: omp_alloctrait_val_kind = omp_integer_kind 22 integer, parameter :: omp_allocator_handle_kind = omp_integer_kind 23 integer, parameter :: omp_memspace_handle_kind = omp_integer_kind 24 integer, parameter :: omp_lock_kind = int_ptr_kind() 25 integer, parameter :: omp_nest_lock_kind = int_ptr_kind() 26 integer, parameter :: omp_depend_kind = omp_integer_kind 27 28 integer(kind=omp_sched_kind), parameter :: & 29 omp_sched_static = 1, & 30 omp_sched_dynamic = 2, & 31 omp_sched_guided = 3, & 32 omp_sched_auto = 4 33 34 integer(kind=omp_proc_bind_kind), parameter :: & 35 omp_proc_bind_false = 0, & 36 omp_proc_bind_true = 1, & 37 omp_proc_bind_master = 2, & 38 omp_proc_bind_close = 3, & 39 omp_proc_bind_spread = 4 40 41 integer(kind=omp_pause_resource_kind), parameter :: & 42 omp_pause_soft = 1, & 43 omp_pause_hard = 2 44 45 integer(kind=omp_sync_hint_kind), parameter :: & 46 omp_sync_hint_none = 0, & 47 omp_sync_hint_uncontended = 1, & 48 omp_sync_hint_contended = 2, & 49 omp_sync_hint_nonspeculative = 4, & 50 omp_sync_hint_speculative = 8 51 integer(kind=omp_lock_hint_kind), parameter :: & 52 omp_lock_hint_none = omp_sync_hint_none, & 53 omp_lock_hint_uncontended = omp_sync_hint_uncontended, & 54 omp_lock_hint_contended = omp_sync_hint_contended, & 55 omp_lock_hint_nonspeculative = omp_sync_hint_nonspeculative, & 56 omp_lock_hint_speculative = omp_sync_hint_speculative 57 58 integer(kind=omp_event_handle_kind), parameter :: & 59 omp_allow_completion_event = 0, & 60 omp_task_fulfill_event = 1 61 62 integer(kind=omp_alloctrait_key_kind), parameter :: & 63 omp_atk_sync_hint = 1, & 64 omp_atk_alignment = 2, & 65 omp_atk_access = 3, & 66 omp_atk_pool_size = 4, & 67 omp_atk_fallback = 5, & 68 omp_atk_fb_data = 6, & 69 omp_atk_pinned = 7, & 70 omp_atk_partition = 8 71 72 integer(kind=omp_alloctrait_val_kind), parameter :: & 73 omp_atv_false = 0, & 74 omp_atv_true = 1, & 75 omp_atv_default = 2, & 76 omp_atv_contended = 3, & 77 omp_atv_uncontended = 4, & 78 omp_atv_sequential = 5, & 79 omp_atv_private = 6, & 80 omp_atv_all = 7, & 81 omp_atv_thread = 8, & 82 omp_atv_pteam = 9, & 83 omp_atv_cgroup = 10, & 84 omp_atv_default_mem_fb = 11, & 85 omp_atv_null_fb = 12, & 86 omp_atv_abort_fb = 13, & 87 omp_atv_allocator_fb = 14, & 88 omp_atv_environment = 15, & 89 omp_atv_nearest = 16, & 90 omp_atv_blocked = 17, & 91 omp_atv_interleaved = 18 92 93 type :: omp_alloctrait 94 integer(kind=omp_alloctrait_key_kind) :: key, value 95 end type omp_alloctrait 96 97 integer(kind=omp_allocator_handle_kind), parameter :: omp_null_allocator = 0 98 99 integer(kind=omp_memspace_handle_kind), parameter :: & 100 omp_default_mem_space = 0, & 101 omp_large_cap_mem_space = 0, & 102 omp_const_mem_space = 0, & 103 omp_high_bw_mem_space = 0, & 104 omp_low_lat_mem_space = 0, & 105 omp_default_mem_alloc = 1, & 106 omp_large_cap_mem_alloc = omp_default_mem_alloc, & 107 omp_const_mem_alloc = 1, & 108 omp_high_bw_mem_alloc = 1, & 109 omp_low_lat_mem_alloc = 1, & 110 omp_thread_mem_alloc = omp_atv_thread, & 111 omp_pteam_mem_alloc = omp_atv_pteam, & 112 omp_cgroup_mem_alloc = omp_atv_cgroup 113 114 integer(kind=omp_integer_kind), parameter :: openmp_version = 200805 115 116 interface 117 118 subroutine omp_set_num_threads(nthreads) bind(c) 119 import 120 integer(kind=omp_integer_kind), value :: nthreads 121 end subroutine omp_set_num_threads 122 123 function omp_get_num_threads() bind(c) 124 import 125 integer(kind=omp_integer_kind) :: omp_get_num_threads 126 end function omp_get_num_threads 127 128 function omp_get_max_threads() bind(c) 129 import 130 integer(kind=omp_integer_kind) :: omp_get_max_threads 131 end function omp_get_max_threads 132 133 function omp_get_thread_num() bind(c) 134 import 135 integer(kind=omp_integer_kind) :: omp_get_thread_num 136 end function omp_get_thread_num 137 138 function omp_get_num_procs() bind(c) 139 import 140 integer(kind=omp_integer_kind) :: omp_get_num_procs 141 end function omp_get_num_procs 142 143 function omp_in_parallel() bind(c) 144 import 145 logical(kind=omp_logical_kind) :: omp_in_parallel 146 end function omp_in_parallel 147 148 subroutine omp_set_dynamic(enable) bind(c) 149 import 150 logical(kind=omp_logical_kind), value :: enable 151 end subroutine omp_set_dynamic 152 153 function omp_get_dynamic() bind(c) 154 import 155 logical(kind=omp_logical_kind) :: omp_get_dynamic 156 end function omp_get_dynamic 157 158 function omp_get_cancelation() bind(c) 159 import 160 logical(kind=omp_logical_kind) :: omp_get_cancelation 161 end function omp_get_cancelation 162 163 subroutine omp_set_nested(enable) bind(c) 164 import 165 logical(kind=omp_logical_kind), value :: enable 166 end subroutine omp_set_nested 167 168 function omp_get_nested() bind(c) 169 import 170 logical(kind=omp_logical_kind) ::omp_get_nested 171 end function omp_get_nested 172 173 subroutine omp_set_schedule(kind, modifier) bind(c) 174 import 175 integer(kind=omp_integer_kind), value :: kind, modifier 176 end subroutine omp_set_schedule 177 178 subroutine omp_get_schedule(kind, modifier) bind(c) 179 import 180 integer(kind=omp_integer_kind), intent(out) :: kind, modifier 181 end subroutine omp_get_schedule 182 183 function omp_get_thread_limit() bind(c) 184 import 185 integer(kind=omp_integer_kind) :: omp_get_thread_limit 186 end function omp_get_thread_limit 187 188 function omp_get_supported_active_levels() bind(c) 189 import 190 integer(kind=omp_integer_kind) :: omp_get_supported_active_levels 191 end function omp_get_supported_active_levels 192 193 subroutine omp_set_max_active_levels(max_levels) bind(c) 194 import 195 integer(kind=omp_integer_kind), value :: max_levels 196 end subroutine omp_set_max_active_levels 197 198 function omp_get_max_active_levels() bind(c) 199 import 200 integer(kind=omp_integer_kind) :: omp_get_max_active_levels 201 end function omp_get_max_active_levels 202 203 function omp_get_level() bind(c) 204 import 205 integer(kind=omp_integer_kind) :: omp_get_level 206 end function omp_get_level 207 208 function omp_get_ancestor_thread_num(level) bind(c) 209 import 210 integer(kind=omp_integer_kind), value :: level 211 integer(kind=omp_integer_kind) :: omp_get_ancestor_thread_num 212 end function omp_get_ancestor_thread_num 213 214 function omp_get_team_size(level) bind(c) 215 import 216 integer(kind=omp_integer_kind), value :: level 217 integer(kind=omp_integer_kind) :: omp_get_team_size 218 end function omp_get_team_size 219 220 function omp_get_active_level() bind(c) 221 import 222 integer(kind=omp_integer_kind) :: omp_get_active_level 223 end function omp_get_active_level 224 225 function omp_in_final() bind(c) 226 import 227 logical(kind=omp_logical_kind) :: omp_in_final 228 end function omp_in_final 229 230 function omp_get_proc_bind() bind(c) 231 import 232 integer(kind=omp_proc_bind_kind) :: omp_get_proc_bind 233 end function omp_get_proc_bind 234 235 function omp_get_num_places() bind(c) 236 import 237 integer(kind=omp_integer_kind) :: omp_get_num_places 238 end function omp_get_num_places 239 240 function omp_get_place_num_procs(place_num) bind(c) 241 import 242 integer(kind=omp_integer_kind), value :: place_num 243 integer(kind=omp_integer_kind) omp_get_place_num_procs 244 end function omp_get_place_num_procs 245 246 subroutine omp_get_place_proc_ids(place_num, ids) bind(c) 247 import 248 integer(kind=omp_integer_kind), value :: place_num 249 integer(kind=omp_integer_kind), intent(out) :: ids(*) 250 end subroutine omp_get_place_proc_ids 251 252 function omp_get_place_num() bind(c) 253 import 254 integer(kind=omp_integer_kind) :: omp_get_place_num 255 end function omp_get_place_num 256 257 function omp_get_partition_num_places() bind(c) 258 import 259 integer(kind=omp_integer_kind) :: omp_get_partition_num_places 260 end function omp_get_partition_num_places 261 262 subroutine omp_get_partition_place_nums(place_nums) bind(c) 263 import 264 integer(kind=omp_integer_kind), intent(out) :: place_nums(*) 265 end subroutine omp_get_partition_place_nums 266 267 subroutine omp_set_affinity_format(format) 268 import 269 character(len=*), intent(in) :: format 270 end subroutine omp_set_affinity_format 271 272 function omp_get_affinity_format(buffer) 273 import 274 character(len=*), intent(out) :: buffer 275 integer(kind=omp_integer_kind) :: omp_get_affinity_format 276 end function omp_get_affinity_format 277 278 subroutine omp_display_affinity(format) 279 import 280 character(len=*), intent(in) :: format 281 end subroutine omp_display_affinity 282 283 function omp_capture_affinity(buffer, format) 284 import 285 character(len=*), intent(out) :: buffer 286 character(len=*), intent(in) :: format 287 integer(kind=omp_integer_kind) omp_capture_affinity 288 end function omp_capture_affinity 289 290 subroutine omp_set_default_device(device_num) bind(c) 291 import 292 integer(kind=omp_integer_kind), value :: device_num 293 end subroutine omp_set_default_device 294 295 function omp_get_default_device() bind(c) 296 import 297 integer(kind=omp_integer_kind) :: omp_get_default_device 298 end function omp_get_default_device 299 300 function omp_get_num_devices() bind(c) 301 import 302 integer(kind=omp_integer_kind) :: omp_get_num_devices 303 end function omp_get_num_devices 304 305 function omp_get_device_num() bind(c) 306 import 307 integer(kind=omp_integer_kind) :: omp_get_device_num 308 end function omp_get_device_num 309 310 function omp_get_num_teams() bind(c) 311 import 312 integer(kind=omp_integer_kind) :: omp_get_num_teams 313 end function omp_get_num_teams 314 315 function omp_get_team_num() bind(c) 316 import 317 integer(kind=omp_integer_kind) :: omp_get_team_num 318 end function omp_get_team_num 319 320 function omp_is_initial_device() bind(c) 321 import 322 integer(kind=omp_logical_kind) :: omp_is_initial_device ! TODO: should this be LOGICAL? 323 end function omp_is_initial_device 324 325 function omp_get_initial_device() bind(c) 326 import 327 integer(kind=omp_integer_kind) :: omp_get_initial_device 328 end function omp_get_initial_device 329 330 function omp_get_max_task_priority() bind(c) 331 import 332 integer(kind=omp_integer_kind) :: omp_get_max_task_priority 333 end function omp_get_max_task_priority 334 335 function omp_pause_resource(kind, device_num) bind(c) 336 import 337 integer(kind=omp_pause_resource_kind), value :: kind 338 integer(kind=omp_integer_kind), value :: device_num 339 integer(kind=omp_integer_kind) :: omp_pause_resource 340 end function omp_pause_resource 341 342 function omp_pause_resource_all(kind) 343 import 344 integer(kind=omp_pause_resource_kind), value :: kind 345 integer(kind=omp_integer_kind) :: omp_pause_resource_all 346 end function omp_pause_resource_all 347 348 ! Lock routines 349 subroutine omp_init_lock(lockvar) bind(c, name="omp_init_lock_") 350 import 351 integer(kind=omp_lock_kind), intent(out) :: lockvar 352 end subroutine omp_init_lock 353 354 subroutine omp_init_lock_with_hint(lockvar, hint) bind(c, name="omp_init_lock_with_hint_") 355 import 356 integer(kind=omp_lock_kind), intent(out) :: lockvar 357 integer(kind=omp_sync_hint_kind), value :: hint 358 end subroutine omp_init_lock_with_hint 359 360 subroutine omp_destroy_lock(lockvar) bind(c, name="omp_destroy_lock_") 361 import 362 integer(kind=omp_lock_kind), intent(inout) :: lockvar 363 end subroutine omp_destroy_lock 364 365 subroutine omp_set_lock(lockvar) bind(c, name="omp_set_lock_") 366 import 367 integer(kind=omp_lock_kind), intent(inout) :: lockvar 368 end subroutine omp_set_lock 369 370 subroutine omp_unset_lock(lockvar) bind(c, name="omp_unset_lock_") 371 import 372 integer(kind=omp_lock_kind), intent(inout) :: lockvar 373 end subroutine omp_unset_lock 374 375 function omp_test_lock(lockvar) bind(c, name="omp_test_lock_") 376 import 377 integer(kind=omp_lock_kind), intent(inout) :: lockvar 378 logical(kind=omp_logical_kind) :: omp_test_lock 379 end function omp_test_lock 380 381 subroutine omp_init_nest_lock(lockvar) bind(c, name="omp_init_nest_lock_") 382 import 383 integer(kind=omp_nest_lock_kind), intent(out) :: lockvar 384 end subroutine omp_init_nest_lock 385 386 subroutine omp_init_nest_lock_with_hint(lockvar, hint) bind(c, name="omp_init_nest_lock_with_hint_") 387 import 388 integer(kind=omp_nest_lock_kind), intent(out) :: lockvar 389 integer(kind=omp_sync_hint_kind), value :: hint 390 end subroutine omp_init_nest_lock_with_hint 391 392 subroutine omp_destroy_nest_lock(lockvar) bind(c, name="omp_destroy_nest_lock_") 393 import 394 integer(kind=omp_nest_lock_kind), intent(inout) :: lockvar 395 end subroutine omp_destroy_nest_lock 396 397 subroutine omp_set_nest_lock(lockvar) bind(c, name="omp_set_nest_lock_") 398 import 399 integer(kind=omp_nest_lock_kind), intent(inout) :: lockvar 400 end subroutine omp_set_nest_lock 401 402 subroutine omp_unset_nest_lock(lockvar) bind(c, name="omp_unset_nest_lock_") 403 import 404 integer(kind=omp_nest_lock_kind), intent(inout) :: lockvar 405 end subroutine omp_unset_nest_lock 406 407 function omp_test_nest_lock(lockvar) bind(c, name="omp_test_nest_lock_") 408 import 409 integer(kind=omp_integer_kind) :: omp_test_nest_lock 410 integer(kind=omp_nest_lock_kind), intent(inout) :: lockvar 411 end function omp_test_nest_lock 412 413 ! Timing routines 414 function omp_get_wtime() bind(c) 415 double precision omp_get_wtime 416 end function omp_get_wtime 417 418 function omp_get_wtick() bind(c) 419 double precision omp_get_wtick 420 end function omp_get_wtick 421 422 ! Event routine 423 subroutine omp_fullfill_event(event) bind(c) ! TODO: is this the correct spelling? 424 import 425 integer(kind=omp_event_handle_kind) :: event 426 end subroutine omp_fullfill_event 427 428 ! Device Memory Routines 429 430 ! Memory Management Routines 431 function omp_init_allocator(memspace, ntraits, traits) 432 import 433 integer(kind=omp_memspace_handle_kind), value :: memspace 434 integer, value :: ntraits 435 type(omp_alloctrait), intent(in) :: traits(*) 436 integer(kind=omp_allocator_handle_kind) :: omp_init_allocator 437 end function omp_init_allocator 438 439 subroutine omp_destroy_allocator(allocator) bind(c) 440 import 441 integer(kind=omp_allocator_handle_kind), value :: allocator 442 end subroutine omp_destroy_allocator 443 444 subroutine omp_set_default_allocator(allocator) bind(c) 445 import 446 integer(kind=omp_allocator_handle_kind), value :: allocator 447 end subroutine omp_set_default_allocator 448 449 function omp_get_default_allocator() 450 import 451 integer(kind=omp_allocator_handle_kind) :: omp_get_default_allocator 452 end function omp_get_default_allocator 453 454 end interface 455