brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.5 KiB · e98df73 Raw
562 lines · plain
1/*2 * include/omp.h.var3 */4 5 6//===----------------------------------------------------------------------===//7//8// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.9// See https://llvm.org/LICENSE.txt for license information.10// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception11//12//===----------------------------------------------------------------------===//13 14 15#ifndef __OMP_H16#   define __OMP_H17 18#   ifndef __has_include19#   define __has_include(x) 020#   endif21 22#   include <stddef.h>23#   if (__has_include(<stdlib.h>))24#     include <stdlib.h>25#   endif26#   include <stdint.h>27 28#   define KMP_VERSION_MAJOR    @LIBOMP_VERSION_MAJOR@29#   define KMP_VERSION_MINOR    @LIBOMP_VERSION_MINOR@30#   define KMP_VERSION_BUILD    @LIBOMP_VERSION_BUILD@31#   define KMP_BUILD_DATE       "@LIBOMP_BUILD_DATE@"32 33#   ifdef __cplusplus34    extern "C" {35#   endif36 37#   define omp_set_affinity_format   ompc_set_affinity_format38#   define omp_get_affinity_format   ompc_get_affinity_format39#   define omp_display_affinity      ompc_display_affinity40#   define omp_capture_affinity      ompc_capture_affinity41 42#   if defined(_WIN32)43#       define __KAI_KMPC_CONVENTION __cdecl44#       ifndef __KMP_IMP45#           define __KMP_IMP __declspec(dllimport)46#       endif47#   else48#       define __KAI_KMPC_CONVENTION49#       ifndef __KMP_IMP50#           define __KMP_IMP51#       endif52#   endif53 54    /* schedule kind constants */55    typedef enum omp_sched_t {56        omp_sched_static  = 1,57        omp_sched_dynamic = 2,58        omp_sched_guided  = 3,59        omp_sched_auto    = 4,60        omp_sched_monotonic = 0x8000000061    } omp_sched_t;62 63    /* set API functions */64    extern void   __KAI_KMPC_CONVENTION  omp_set_num_threads (int);65    extern void   __KAI_KMPC_CONVENTION  omp_set_dynamic     (int);66    extern void   __KAI_KMPC_CONVENTION  omp_set_nested      (int);67    extern void   __KAI_KMPC_CONVENTION  omp_set_max_active_levels (int);68    extern void   __KAI_KMPC_CONVENTION  omp_set_schedule          (omp_sched_t, int);69 70    /* query API functions */71    extern int    __KAI_KMPC_CONVENTION  omp_get_num_threads  (void);72    extern int    __KAI_KMPC_CONVENTION  omp_get_dynamic      (void);73    extern int    __KAI_KMPC_CONVENTION  omp_get_nested       (void);74    extern int    __KAI_KMPC_CONVENTION  omp_get_max_threads  (void);75    extern int    __KAI_KMPC_CONVENTION  omp_get_thread_num   (void);76    extern int    __KAI_KMPC_CONVENTION  omp_get_num_procs    (void);77    extern int    __KAI_KMPC_CONVENTION  omp_in_parallel      (void);78    extern int    __KAI_KMPC_CONVENTION  omp_in_final         (void);79    extern int    __KAI_KMPC_CONVENTION  omp_get_active_level        (void);80    extern int    __KAI_KMPC_CONVENTION  omp_get_level               (void);81    extern int    __KAI_KMPC_CONVENTION  omp_get_ancestor_thread_num (int);82    extern int    __KAI_KMPC_CONVENTION  omp_get_team_size           (int);83    extern int    __KAI_KMPC_CONVENTION  omp_get_thread_limit        (void);84    extern int    __KAI_KMPC_CONVENTION  omp_get_max_active_levels   (void);85    extern void   __KAI_KMPC_CONVENTION  omp_get_schedule            (omp_sched_t *, int *);86    extern int    __KAI_KMPC_CONVENTION  omp_get_max_task_priority   (void);87 88    /* lock API functions */89    typedef struct omp_lock_t {90        void * _lk;91    } omp_lock_t;92 93    extern void   __KAI_KMPC_CONVENTION  omp_init_lock    (omp_lock_t *);94    extern void   __KAI_KMPC_CONVENTION  omp_set_lock     (omp_lock_t *);95    extern void   __KAI_KMPC_CONVENTION  omp_unset_lock   (omp_lock_t *);96    extern void   __KAI_KMPC_CONVENTION  omp_destroy_lock (omp_lock_t *);97    extern int    __KAI_KMPC_CONVENTION  omp_test_lock    (omp_lock_t *);98 99    /* nested lock API functions */100    typedef struct omp_nest_lock_t {101        void * _lk;102    } omp_nest_lock_t;103 104    extern void   __KAI_KMPC_CONVENTION  omp_init_nest_lock    (omp_nest_lock_t *);105    extern void   __KAI_KMPC_CONVENTION  omp_set_nest_lock     (omp_nest_lock_t *);106    extern void   __KAI_KMPC_CONVENTION  omp_unset_nest_lock   (omp_nest_lock_t *);107    extern void   __KAI_KMPC_CONVENTION  omp_destroy_nest_lock (omp_nest_lock_t *);108    extern int    __KAI_KMPC_CONVENTION  omp_test_nest_lock    (omp_nest_lock_t *);109 110    /* OpenMP 5.0  Synchronization hints*/111    typedef enum omp_sync_hint_t {112        omp_sync_hint_none           = 0,113        omp_lock_hint_none           = omp_sync_hint_none,114        omp_sync_hint_uncontended    = 1,115        omp_lock_hint_uncontended    = omp_sync_hint_uncontended,116        omp_sync_hint_contended      = (1<<1),117        omp_lock_hint_contended      = omp_sync_hint_contended,118        omp_sync_hint_nonspeculative = (1<<2),119        omp_lock_hint_nonspeculative = omp_sync_hint_nonspeculative,120        omp_sync_hint_speculative    = (1<<3),121        omp_lock_hint_speculative    = omp_sync_hint_speculative,122        kmp_lock_hint_hle            = (1<<16),123        kmp_lock_hint_rtm            = (1<<17),124        kmp_lock_hint_adaptive       = (1<<18)125    } omp_sync_hint_t;126 127    /* lock hint type for dynamic user lock */128    typedef omp_sync_hint_t omp_lock_hint_t;129 130    /* hinted lock initializers */131    extern void __KAI_KMPC_CONVENTION omp_init_lock_with_hint(omp_lock_t *, omp_lock_hint_t);132    extern void __KAI_KMPC_CONVENTION omp_init_nest_lock_with_hint(omp_nest_lock_t *, omp_lock_hint_t);133 134    /* time API functions */135    extern double __KAI_KMPC_CONVENTION  omp_get_wtime (void);136    extern double __KAI_KMPC_CONVENTION  omp_get_wtick (void);137 138    /* OpenMP 4.0 */139    extern int  __KAI_KMPC_CONVENTION  omp_get_default_device (void);140    extern void __KAI_KMPC_CONVENTION  omp_set_default_device (int);141    extern int  __KAI_KMPC_CONVENTION  omp_is_initial_device (void);142    extern int  __KAI_KMPC_CONVENTION  omp_get_num_devices (void);143    extern int  __KAI_KMPC_CONVENTION  omp_get_num_teams (void);144    extern int  __KAI_KMPC_CONVENTION  omp_get_team_num (void);145    extern int  __KAI_KMPC_CONVENTION  omp_get_cancellation (void);146 147    /* OpenMP 4.5 */148    extern int   __KAI_KMPC_CONVENTION  omp_get_initial_device (void);149    extern void* __KAI_KMPC_CONVENTION  omp_target_alloc(size_t, int);150    extern void  __KAI_KMPC_CONVENTION  omp_target_free(void *, int);151    extern int   __KAI_KMPC_CONVENTION  omp_target_is_present(const void *, int);152    extern int   __KAI_KMPC_CONVENTION  omp_target_memcpy(void *, const void *, size_t, size_t, size_t, int, int);153    extern int   __KAI_KMPC_CONVENTION  omp_target_memcpy_rect(void *, const void *, size_t, int, const size_t *,154                                            const size_t *, const size_t *, const size_t *, const size_t *, int, int);155    extern int   __KAI_KMPC_CONVENTION  omp_target_associate_ptr(const void *, const void *, size_t, size_t, int);156    extern int   __KAI_KMPC_CONVENTION  omp_target_disassociate_ptr(const void *, int);157 158    /* OpenMP 5.0 */159    extern int   __KAI_KMPC_CONVENTION  omp_get_device_num (void);160    typedef void * omp_depend_t;161 162    /* OpenMP 5.1 interop */163    typedef intptr_t omp_intptr_t;164 165    extern void __KAI_KMPC_CONVENTION ompx_dump_mapping_tables(void);166 167    /* 0..omp_get_num_interop_properties()-1 are reserved for implementation-defined properties */168    typedef enum omp_interop_property {169        omp_ipr_fr_id = -1,170        omp_ipr_fr_name = -2,171        omp_ipr_vendor = -3,172        omp_ipr_vendor_name = -4,173        omp_ipr_device_num = -5,174        omp_ipr_platform = -6,175        omp_ipr_device = -7,176        omp_ipr_device_context = -8,177        omp_ipr_targetsync = -9,178        omp_ipr_first = -9179    } omp_interop_property_t;180 181    #define omp_interop_none 0182 183    typedef enum omp_interop_rc {184        omp_irc_no_value = 1,185        omp_irc_success = 0,186        omp_irc_empty = -1,187        omp_irc_out_of_range = -2,188        omp_irc_type_int = -3,189        omp_irc_type_ptr = -4,190        omp_irc_type_str = -5,191        omp_irc_other = -6192    } omp_interop_rc_t;193 194    typedef enum omp_interop_fr {195        omp_ifr_cuda = 1,196        omp_ifr_cuda_driver = 2,197        omp_ifr_opencl = 3,198        omp_ifr_sycl = 4,199        omp_ifr_hip = 5,200        omp_ifr_level_zero = 6,201        omp_ifr_last = 7202    } omp_interop_fr_t;203 204    typedef void * omp_interop_t;205 206    /*!207     * The `omp_get_num_interop_properties` routine retrieves the number of implementation-defined properties available for an `omp_interop_t` object.208     */209    extern int          __KAI_KMPC_CONVENTION  omp_get_num_interop_properties(const omp_interop_t);210    /*!211     * The `omp_get_interop_int` routine retrieves an integer property from an `omp_interop_t` object.212     */213    extern omp_intptr_t __KAI_KMPC_CONVENTION  omp_get_interop_int(const omp_interop_t, omp_interop_property_t, int *);214    /*!215     * The `omp_get_interop_ptr` routine retrieves a pointer property from an `omp_interop_t` object.216     */217    extern void *       __KAI_KMPC_CONVENTION  omp_get_interop_ptr(const omp_interop_t, omp_interop_property_t, int *);218    /*!219     * The `omp_get_interop_str` routine retrieves a string property from an `omp_interop_t` object.220     */221    extern const char * __KAI_KMPC_CONVENTION  omp_get_interop_str(const omp_interop_t, omp_interop_property_t, int *);222    /*!223     * The `omp_get_interop_name` routine retrieves a property name from an `omp_interop_t` object.224     */225    extern const char * __KAI_KMPC_CONVENTION  omp_get_interop_name(const omp_interop_t, omp_interop_property_t);226    /*!227     * The `omp_get_interop_type_desc` routine retrieves a description of the type of a property associated with an `omp_interop_t` object.228     */229    extern const char * __KAI_KMPC_CONVENTION  omp_get_interop_type_desc(const omp_interop_t, omp_interop_property_t);230    /*!231     * The `omp_get_interop_rc_desc` routine retrieves a description of the return code associated with an `omp_interop_t` object.232     */233    extern const char * __KAI_KMPC_CONVENTION  omp_get_interop_rc_desc(const omp_interop_t, omp_interop_rc_t);234 235    /* OpenMP 5.1 device memory routines */236 237    /*!238     * The `omp_target_memcpy_async` routine asynchronously performs a copy between any combination of host and device pointers.239     */240    extern int    __KAI_KMPC_CONVENTION  omp_target_memcpy_async(void *, const void *, size_t, size_t, size_t, int,241                                             int, int, omp_depend_t *);242    /*!243     * The `omp_target_memcpy_rect_async` routine asynchronously performs a copy between any combination of host and device pointers.244     */245    extern int    __KAI_KMPC_CONVENTION  omp_target_memcpy_rect_async(void *, const void *, size_t, int, const size_t *,246                                             const size_t *, const size_t *, const size_t *, const size_t *, int, int,247                                             int, omp_depend_t *);248 249    /* OpenMP 6.0 device memory routines */250    extern void * __KAI_KMPC_CONVENTION omp_target_memset(void *, int, size_t, int);251    extern void * __KAI_KMPC_CONVENTION omp_target_memset_async(void *, int, size_t, int, int, omp_depend_t *);252 253    /*!254     * The `omp_get_mapped_ptr` routine returns the device pointer that is associated with a host pointer for a given device.255     */256    extern void * __KAI_KMPC_CONVENTION  omp_get_mapped_ptr(const void *, int);257    extern int    __KAI_KMPC_CONVENTION  omp_target_is_accessible(const void *, size_t, int);258 259    /* kmp API functions */260    extern int    __KAI_KMPC_CONVENTION  kmp_get_stacksize          (void);261    extern void   __KAI_KMPC_CONVENTION  kmp_set_stacksize          (int);262    extern size_t __KAI_KMPC_CONVENTION  kmp_get_stacksize_s        (void);263    extern void   __KAI_KMPC_CONVENTION  kmp_set_stacksize_s        (size_t);264    extern int    __KAI_KMPC_CONVENTION  kmp_get_blocktime          (void);265    extern int    __KAI_KMPC_CONVENTION  kmp_get_library            (void);266    extern void   __KAI_KMPC_CONVENTION  kmp_set_blocktime          (int);267    extern void   __KAI_KMPC_CONVENTION  kmp_set_library            (int);268    extern void   __KAI_KMPC_CONVENTION  kmp_set_library_serial     (void);269    extern void   __KAI_KMPC_CONVENTION  kmp_set_library_turnaround (void);270    extern void   __KAI_KMPC_CONVENTION  kmp_set_library_throughput (void);271    extern void   __KAI_KMPC_CONVENTION  kmp_set_defaults           (char const *);272    extern void   __KAI_KMPC_CONVENTION  kmp_set_disp_num_buffers   (int);273 274    /* Intel affinity API */275    typedef void * kmp_affinity_mask_t;276 277    extern int    __KAI_KMPC_CONVENTION  kmp_set_affinity             (kmp_affinity_mask_t *);278    extern int    __KAI_KMPC_CONVENTION  kmp_get_affinity             (kmp_affinity_mask_t *);279    extern int    __KAI_KMPC_CONVENTION  kmp_get_affinity_max_proc    (void);280    extern void   __KAI_KMPC_CONVENTION  kmp_create_affinity_mask     (kmp_affinity_mask_t *);281    extern void   __KAI_KMPC_CONVENTION  kmp_destroy_affinity_mask    (kmp_affinity_mask_t *);282    extern int    __KAI_KMPC_CONVENTION  kmp_set_affinity_mask_proc   (int, kmp_affinity_mask_t *);283    extern int    __KAI_KMPC_CONVENTION  kmp_unset_affinity_mask_proc (int, kmp_affinity_mask_t *);284    extern int    __KAI_KMPC_CONVENTION  kmp_get_affinity_mask_proc   (int, kmp_affinity_mask_t *);285 286    /* OpenMP 4.0 affinity API */287    typedef enum omp_proc_bind_t {288        omp_proc_bind_false = 0,289        omp_proc_bind_true = 1,290        omp_proc_bind_master = 2,291        omp_proc_bind_close = 3,292        omp_proc_bind_spread = 4293    } omp_proc_bind_t;294 295    extern omp_proc_bind_t __KAI_KMPC_CONVENTION omp_get_proc_bind (void);296 297    /* OpenMP 4.5 affinity API */298    extern int  __KAI_KMPC_CONVENTION omp_get_num_places (void);299    extern int  __KAI_KMPC_CONVENTION omp_get_place_num_procs (int);300    extern void __KAI_KMPC_CONVENTION omp_get_place_proc_ids (int, int *);301    extern int  __KAI_KMPC_CONVENTION omp_get_place_num (void);302    extern int  __KAI_KMPC_CONVENTION omp_get_partition_num_places (void);303    extern void __KAI_KMPC_CONVENTION omp_get_partition_place_nums (int *);304 305    extern void * __KAI_KMPC_CONVENTION  kmp_malloc  (size_t);306    extern void * __KAI_KMPC_CONVENTION  kmp_aligned_malloc  (size_t, size_t);307    extern void * __KAI_KMPC_CONVENTION  kmp_calloc  (size_t, size_t);308    extern void * __KAI_KMPC_CONVENTION  kmp_realloc (void *, size_t);309    extern void   __KAI_KMPC_CONVENTION  kmp_free    (void *);310 311    extern void   __KAI_KMPC_CONVENTION  kmp_set_warnings_on(void);312    extern void   __KAI_KMPC_CONVENTION  kmp_set_warnings_off(void);313 314    /* OpenMP 5.0 Tool Control */315    typedef enum omp_control_tool_result_t {316        omp_control_tool_notool = -2,317        omp_control_tool_nocallback = -1,318        omp_control_tool_success = 0,319        omp_control_tool_ignored = 1320    } omp_control_tool_result_t;321 322    typedef enum omp_control_tool_t {323        omp_control_tool_start = 1,324        omp_control_tool_pause = 2,325        omp_control_tool_flush = 3,326        omp_control_tool_end = 4327    } omp_control_tool_t;328 329    extern int __KAI_KMPC_CONVENTION omp_control_tool(int, int, void*);330 331    /* OpenMP 5.0 Memory Management */332    typedef uintptr_t omp_uintptr_t;333 334    typedef enum {335        omp_atk_sync_hint = 1,336        omp_atk_alignment = 2,337        omp_atk_access = 3,338        omp_atk_pool_size = 4,339        omp_atk_fallback = 5,340        omp_atk_fb_data = 6,341        omp_atk_pinned = 7,342        omp_atk_partition = 8,343        omp_atk_pin_device = 9,344        omp_atk_preferred_device = 10,345        omp_atk_device_access = 11,346        omp_atk_target_access = 12,347        omp_atk_atomic_scope = 13,348        omp_atk_part_size = 14349    } omp_alloctrait_key_t;350 351    typedef enum {352        omp_atv_false = 0,353        omp_atv_true = 1,354        omp_atv_contended = 3,355        omp_atv_uncontended = 4,356        omp_atv_serialized = 5,357        omp_atv_sequential = omp_atv_serialized, // (deprecated)358        omp_atv_private = 6,359        omp_atv_device = 7,360        omp_atv_thread = 8,361        omp_atv_pteam = 9,362        omp_atv_cgroup = 10,363        omp_atv_default_mem_fb = 11,364        omp_atv_null_fb = 12,365        omp_atv_abort_fb = 13,366        omp_atv_allocator_fb = 14,367        omp_atv_environment = 15,368        omp_atv_nearest = 16,369        omp_atv_blocked = 17,370        omp_atv_interleaved = 18,371        omp_atv_all = 19,372        omp_atv_single = 20,373        omp_atv_multiple = 21,374        omp_atv_memspace = 22375    } omp_alloctrait_value_t;376    #define omp_atv_default ((omp_uintptr_t)-1)377 378    typedef struct {379        omp_alloctrait_key_t key;380        omp_uintptr_t value;381    } omp_alloctrait_t;382 383#   if defined(_WIN32)384    // On Windows cl and icl do not support 64-bit enum, let's use integer then.385    typedef omp_uintptr_t omp_allocator_handle_t;386    extern __KMP_IMP omp_allocator_handle_t const omp_null_allocator;387    extern __KMP_IMP omp_allocator_handle_t const omp_default_mem_alloc;388    extern __KMP_IMP omp_allocator_handle_t const omp_large_cap_mem_alloc;389    extern __KMP_IMP omp_allocator_handle_t const omp_const_mem_alloc;390    extern __KMP_IMP omp_allocator_handle_t const omp_high_bw_mem_alloc;391    extern __KMP_IMP omp_allocator_handle_t const omp_low_lat_mem_alloc;392    extern __KMP_IMP omp_allocator_handle_t const omp_cgroup_mem_alloc;393    extern __KMP_IMP omp_allocator_handle_t const omp_pteam_mem_alloc;394    extern __KMP_IMP omp_allocator_handle_t const omp_thread_mem_alloc;395    extern __KMP_IMP omp_allocator_handle_t const llvm_omp_target_host_mem_alloc;396    extern __KMP_IMP omp_allocator_handle_t const llvm_omp_target_shared_mem_alloc;397    extern __KMP_IMP omp_allocator_handle_t const llvm_omp_target_device_mem_alloc;398 399    typedef omp_uintptr_t omp_memspace_handle_t;400    extern __KMP_IMP omp_memspace_handle_t const omp_null_mem_space;401    extern __KMP_IMP omp_memspace_handle_t const omp_default_mem_space;402    extern __KMP_IMP omp_memspace_handle_t const omp_large_cap_mem_space;403    extern __KMP_IMP omp_memspace_handle_t const omp_const_mem_space;404    extern __KMP_IMP omp_memspace_handle_t const omp_high_bw_mem_space;405    extern __KMP_IMP omp_memspace_handle_t const omp_low_lat_mem_space;406    extern __KMP_IMP omp_memspace_handle_t const llvm_omp_target_host_mem_space;407    extern __KMP_IMP omp_memspace_handle_t const llvm_omp_target_shared_mem_space;408    extern __KMP_IMP omp_memspace_handle_t const llvm_omp_target_device_mem_space;409#   else410#       if __cplusplus >= 201103411    typedef enum omp_allocator_handle_t : omp_uintptr_t412#       else413    typedef enum omp_allocator_handle_t414#       endif415    {416      omp_null_allocator = 0,417      omp_default_mem_alloc = 1,418      omp_large_cap_mem_alloc = 2,419      omp_const_mem_alloc = 3,420      omp_high_bw_mem_alloc = 4,421      omp_low_lat_mem_alloc = 5,422      omp_cgroup_mem_alloc = 6,423      omp_pteam_mem_alloc = 7,424      omp_thread_mem_alloc = 8,425      llvm_omp_target_host_mem_alloc = 100,426      llvm_omp_target_shared_mem_alloc = 101,427      llvm_omp_target_device_mem_alloc = 102,428      KMP_ALLOCATOR_MAX_HANDLE = UINTPTR_MAX429    } omp_allocator_handle_t;430#       if __cplusplus >= 201103431    typedef enum omp_memspace_handle_t : omp_uintptr_t432#       else433    typedef enum omp_memspace_handle_t434#       endif435    {436      omp_null_mem_space = 0,437      omp_default_mem_space = 99,438      omp_large_cap_mem_space = 1,439      omp_const_mem_space = 2,440      omp_high_bw_mem_space = 3,441      omp_low_lat_mem_space = 4,442      llvm_omp_target_host_mem_space = 100,443      llvm_omp_target_shared_mem_space = 101,444      llvm_omp_target_device_mem_space = 102,445      KMP_MEMSPACE_MAX_HANDLE = UINTPTR_MAX446    } omp_memspace_handle_t;447#   endif448    extern omp_allocator_handle_t __KAI_KMPC_CONVENTION omp_init_allocator(omp_memspace_handle_t m,449                                                       int ntraits, omp_alloctrait_t traits[]);450    extern void __KAI_KMPC_CONVENTION omp_destroy_allocator(omp_allocator_handle_t allocator);451 452    extern void __KAI_KMPC_CONVENTION omp_set_default_allocator(omp_allocator_handle_t a);453    extern omp_allocator_handle_t __KAI_KMPC_CONVENTION omp_get_default_allocator(void);454#   ifdef __cplusplus455    extern void *__KAI_KMPC_CONVENTION omp_alloc(size_t size, omp_allocator_handle_t a = omp_null_allocator);456    extern void *__KAI_KMPC_CONVENTION omp_aligned_alloc(size_t align, size_t size,457                                                         omp_allocator_handle_t a = omp_null_allocator);458    extern void *__KAI_KMPC_CONVENTION omp_calloc(size_t nmemb, size_t size,459                                                  omp_allocator_handle_t a = omp_null_allocator);460    extern void *__KAI_KMPC_CONVENTION omp_aligned_calloc(size_t align, size_t nmemb, size_t size,461                                                          omp_allocator_handle_t a = omp_null_allocator);462    extern void *__KAI_KMPC_CONVENTION omp_realloc(void *ptr, size_t size,463                                                   omp_allocator_handle_t allocator = omp_null_allocator,464                                                   omp_allocator_handle_t free_allocator = omp_null_allocator);465    extern void __KAI_KMPC_CONVENTION omp_free(void * ptr, omp_allocator_handle_t a = omp_null_allocator);466#   else467    extern void *__KAI_KMPC_CONVENTION omp_alloc(size_t size, omp_allocator_handle_t a);468    extern void *__KAI_KMPC_CONVENTION omp_aligned_alloc(size_t align, size_t size,469                                                         omp_allocator_handle_t a);470    extern void *__KAI_KMPC_CONVENTION omp_calloc(size_t nmemb, size_t size, omp_allocator_handle_t a);471    extern void *__KAI_KMPC_CONVENTION omp_aligned_calloc(size_t align, size_t nmemb, size_t size,472                                                          omp_allocator_handle_t a);473    extern void *__KAI_KMPC_CONVENTION omp_realloc(void *ptr, size_t size, omp_allocator_handle_t allocator,474                                                   omp_allocator_handle_t free_allocator);475    extern void __KAI_KMPC_CONVENTION omp_free(void *ptr, omp_allocator_handle_t a);476#   endif477 478    /* OpenMP TR11 routines to get memory spaces and allocators */479    extern omp_memspace_handle_t omp_get_devices_memspace(int ndevs, const int *devs, omp_memspace_handle_t memspace);480    extern omp_memspace_handle_t omp_get_device_memspace(int dev, omp_memspace_handle_t memspace);481    extern omp_memspace_handle_t omp_get_devices_and_host_memspace(int ndevs, const int *devs, omp_memspace_handle_t memspace);482    extern omp_memspace_handle_t omp_get_device_and_host_memspace(int dev, omp_memspace_handle_t memspace);483    extern omp_memspace_handle_t omp_get_devices_all_memspace(omp_memspace_handle_t memspace);484    extern omp_allocator_handle_t omp_get_devices_allocator(int ndevs, const int *devs, omp_memspace_handle_t memspace);485    extern omp_allocator_handle_t omp_get_device_allocator(int dev, omp_memspace_handle_t memspace);486    extern omp_allocator_handle_t omp_get_devices_and_host_allocator(int ndevs, const int *devs, omp_memspace_handle_t memspace);487    extern omp_allocator_handle_t omp_get_device_and_host_allocator(int dev, omp_memspace_handle_t memspace);488    extern omp_allocator_handle_t omp_get_devices_all_allocator(omp_memspace_handle_t memspace);489    extern int omp_get_memspace_num_resources(omp_memspace_handle_t memspace);490    extern omp_memspace_handle_t omp_get_submemspace(omp_memspace_handle_t memspace, int num_resources, int *resources);491 492    /* OpenMP 5.0 Affinity Format */493    extern void __KAI_KMPC_CONVENTION omp_set_affinity_format(char const *);494    extern size_t __KAI_KMPC_CONVENTION omp_get_affinity_format(char *, size_t);495    extern void __KAI_KMPC_CONVENTION omp_display_affinity(char const *);496    extern size_t __KAI_KMPC_CONVENTION omp_capture_affinity(char *, size_t, char const *);497 498    /* OpenMP 5.0 events */499#   if defined(_WIN32)500    // On Windows cl and icl do not support 64-bit enum, let's use integer then.501    typedef omp_uintptr_t omp_event_handle_t;502#   else503    typedef enum omp_event_handle_t { KMP_EVENT_MAX_HANDLE = UINTPTR_MAX } omp_event_handle_t;504#   endif505    extern void __KAI_KMPC_CONVENTION omp_fulfill_event ( omp_event_handle_t event );506 507    /* OpenMP 5.0 Pause Resources */508    typedef enum omp_pause_resource_t {509      omp_pause_resume = 0,510      omp_pause_soft = 1,511      omp_pause_hard = 2,512      omp_pause_stop_tool = 3513    } omp_pause_resource_t;514    extern int __KAI_KMPC_CONVENTION omp_pause_resource(omp_pause_resource_t, int);515    extern int __KAI_KMPC_CONVENTION omp_pause_resource_all(omp_pause_resource_t);516 517    extern int __KAI_KMPC_CONVENTION omp_get_supported_active_levels(void);518 519    /* OpenMP 5.1 */520    extern void __KAI_KMPC_CONVENTION omp_set_num_teams(int num_teams);521    extern int __KAI_KMPC_CONVENTION omp_get_max_teams(void);522    extern void __KAI_KMPC_CONVENTION omp_set_teams_thread_limit(int limit);523    extern int __KAI_KMPC_CONVENTION omp_get_teams_thread_limit(void);524 525    /* OpenMP 5.1 Display Environment */526    extern void omp_display_env(int verbose);527 528#   if defined(_OPENMP) && _OPENMP >= 201811529    #pragma omp begin declare variant match(device={kind(host)})530    static inline int omp_is_initial_device(void) { return 1; }531    #pragma omp end declare variant532    #pragma omp begin declare variant match(device={kind(nohost)})533    static inline int omp_is_initial_device(void) { return 0; }534    #pragma omp end declare variant535#   endif536 537    /* OpenMP 5.2 */538    extern int __KAI_KMPC_CONVENTION omp_in_explicit_task(void);539    #define omp_invalid_device -2540 541    /* OpenMP 6.0 */542    extern int   __KAI_KMPC_CONVENTION  omp_get_device_from_uid(const char *DeviceUid);543    extern const char *   __KAI_KMPC_CONVENTION  omp_get_uid_from_device(int DeviceNum);544 545    /* LLVM Extensions */546    extern void *llvm_omp_target_dynamic_shared_alloc(void);547 548#   undef __KAI_KMPC_CONVENTION549#   undef __KMP_IMP550 551    /* Warning:552       The following typedefs are not standard, deprecated and will be removed in a future release.553    */554    typedef int     omp_int_t;555    typedef double  omp_wtime_t;556 557#   ifdef __cplusplus558    }559#   endif560 561#endif /* __OMP_H */562