2 * kmp_stub.cpp -- stub versions of user-callable OpenMP RT functions.
5 //===----------------------------------------------------------------------===//
7 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8 // See https://llvm.org/LICENSE.txt for license information.
9 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
11 //===----------------------------------------------------------------------===//
18 #include "omp.h" // omp_* declarations, must be included before "kmp.h"
19 #include "kmp.h" // KMP_DEFAULT_STKSIZE
29 #define omp_set_max_active_levels ompc_set_max_active_levels
30 #define omp_set_schedule ompc_set_schedule
31 #define omp_get_ancestor_thread_num ompc_get_ancestor_thread_num
32 #define omp_get_team_size ompc_get_team_size
34 #define omp_set_num_threads ompc_set_num_threads
35 #define omp_set_dynamic ompc_set_dynamic
36 #define omp_set_nested ompc_set_nested
37 #define omp_set_affinity_format ompc_set_affinity_format
38 #define omp_get_affinity_format ompc_get_affinity_format
39 #define omp_display_affinity ompc_display_affinity
40 #define omp_capture_affinity ompc_capture_affinity
41 #define kmp_set_stacksize kmpc_set_stacksize
42 #define kmp_set_stacksize_s kmpc_set_stacksize_s
43 #define kmp_set_blocktime kmpc_set_blocktime
44 #define kmp_set_library kmpc_set_library
45 #define kmp_set_defaults kmpc_set_defaults
46 #define kmp_set_disp_num_buffers kmpc_set_disp_num_buffers
47 #define kmp_malloc kmpc_malloc
48 #define kmp_aligned_malloc kmpc_aligned_malloc
49 #define kmp_calloc kmpc_calloc
50 #define kmp_realloc kmpc_realloc
51 #define kmp_free kmpc_free
54 static double frequency
= 0.0;
58 static size_t __kmps_init() {
59 static int initialized
= 0;
60 static size_t dummy
= 0;
62 // TODO: Analyze KMP_VERSION environment variable, print
63 // __kmp_version_copyright and __kmp_version_build_time.
64 // WARNING: Do not use "fprintf(stderr, ...)" because it will cause
65 // unresolved "__iob" symbol (see C70080). We need to extract __kmp_printf()
66 // stuff from kmp_runtime.cpp and use it.
68 // Trick with dummy variable forces linker to keep __kmp_version_copyright
69 // and __kmp_version_build_time strings in executable file (in case of
70 // static linkage). When KMP_VERSION analysis is implemented, dummy
71 // variable should be deleted, function should return void.
72 dummy
= __kmp_version_copyright
- __kmp_version_build_time
;
76 BOOL status
= QueryPerformanceFrequency(&freq
);
78 frequency
= double(freq
.QuadPart
);
87 #define i __kmps_init();
89 /* set API functions */
90 void omp_set_num_threads(omp_int_t num_threads
) { i
; }
91 void omp_set_dynamic(omp_int_t dynamic
) {
93 __kmps_set_dynamic(dynamic
);
95 void omp_set_nested(omp_int_t nested
) {
97 __kmps_set_nested(nested
);
99 void omp_set_max_active_levels(omp_int_t max_active_levels
) { i
; }
100 void omp_set_schedule(omp_sched_t kind
, omp_int_t modifier
) {
102 __kmps_set_schedule((kmp_sched_t
)kind
, modifier
);
104 int omp_get_ancestor_thread_num(omp_int_t level
) {
106 return (level
) ? (-1) : (0);
108 int omp_get_team_size(omp_int_t level
) {
110 return (level
) ? (-1) : (1);
112 int kmpc_set_affinity_mask_proc(int proc
, void **mask
) {
116 int kmpc_unset_affinity_mask_proc(int proc
, void **mask
) {
120 int kmpc_get_affinity_mask_proc(int proc
, void **mask
) {
125 /* kmp API functions */
126 void kmp_set_stacksize(omp_int_t arg
) {
128 __kmps_set_stacksize((size_t)arg
);
130 void kmp_set_stacksize_s(size_t arg
) {
132 __kmps_set_stacksize(arg
);
134 void kmp_set_blocktime(omp_int_t arg
) {
136 __kmps_set_blocktime(arg
);
138 void kmp_set_library(omp_int_t arg
) {
140 __kmps_set_library(arg
);
142 void kmp_set_defaults(char const *str
) { i
; }
143 void kmp_set_disp_num_buffers(omp_int_t arg
) { i
; }
145 /* KMP memory management functions. */
146 void *kmp_malloc(size_t size
) {
150 // If successful returns a pointer to the memory block, otherwise returns
152 // Sets errno to ENOMEM or EINVAL if memory allocation failed or parameter
153 // validation failed.
154 res
= _aligned_malloc(size
, 1);
160 void *kmp_aligned_malloc(size_t sz
, size_t a
) {
164 res
= _aligned_malloc(sz
, a
);
167 if ((err
= posix_memalign(&res
, a
, sz
))) {
168 errno
= err
; // can be EINVAL or ENOMEM
174 void *kmp_calloc(size_t nelem
, size_t elsize
) {
178 res
= _aligned_recalloc(NULL
, nelem
, elsize
, 1);
180 res
= calloc(nelem
, elsize
);
184 void *kmp_realloc(void *ptr
, size_t size
) {
188 res
= _aligned_realloc(ptr
, size
, 1);
190 res
= realloc(ptr
, size
);
194 void kmp_free(void *ptr
) {
203 static int __kmps_blocktime
= INT_MAX
;
205 void __kmps_set_blocktime(int arg
) {
207 __kmps_blocktime
= arg
;
208 } // __kmps_set_blocktime
210 int __kmps_get_blocktime(void) {
212 return __kmps_blocktime
;
213 } // __kmps_get_blocktime
215 static int __kmps_dynamic
= 0;
217 void __kmps_set_dynamic(int arg
) {
219 __kmps_dynamic
= arg
;
220 } // __kmps_set_dynamic
222 int __kmps_get_dynamic(void) {
224 return __kmps_dynamic
;
225 } // __kmps_get_dynamic
227 static int __kmps_library
= 1000;
229 void __kmps_set_library(int arg
) {
231 __kmps_library
= arg
;
232 } // __kmps_set_library
234 int __kmps_get_library(void) {
236 return __kmps_library
;
237 } // __kmps_get_library
239 static int __kmps_nested
= 0;
241 void __kmps_set_nested(int arg
) {
244 } // __kmps_set_nested
246 int __kmps_get_nested(void) {
248 return __kmps_nested
;
249 } // __kmps_get_nested
251 static size_t __kmps_stacksize
= KMP_DEFAULT_STKSIZE
;
253 void __kmps_set_stacksize(size_t arg
) {
255 __kmps_stacksize
= arg
;
256 } // __kmps_set_stacksize
258 size_t __kmps_get_stacksize(void) {
260 return __kmps_stacksize
;
261 } // __kmps_get_stacksize
263 static kmp_sched_t __kmps_sched_kind
= kmp_sched_default
;
264 static int __kmps_sched_modifier
= 0;
266 void __kmps_set_schedule(kmp_sched_t kind
, int modifier
) {
268 __kmps_sched_kind
= kind
;
269 __kmps_sched_modifier
= modifier
;
270 } // __kmps_set_schedule
272 void __kmps_get_schedule(kmp_sched_t
*kind
, int *modifier
) {
274 *kind
= __kmps_sched_kind
;
275 *modifier
= __kmps_sched_modifier
;
276 } // __kmps_get_schedule
278 kmp_proc_bind_t
__kmps_get_proc_bind(void) {
280 return proc_bind_false
;
281 } // __kmps_get_proc_bind
283 double __kmps_get_wtime(void) {
284 // Elapsed wall clock time (in second) from "sometime in the past".
288 if (frequency
> 0.0) {
290 BOOL status
= QueryPerformanceCounter(&now
);
292 wtime
= double(now
.QuadPart
) / frequency
;
296 // gettimeofday() returns seconds and microseconds since the Epoch.
299 rc
= gettimeofday(&tval
, NULL
);
301 wtime
= (double)(tval
.tv_sec
) + 1.0E-06 * (double)(tval
.tv_usec
);
303 // TODO: Assert or abort here.
307 } // __kmps_get_wtime
309 double __kmps_get_wtick(void) {
310 // Number of seconds between successive clock ticks.
319 rc
= GetSystemTimeAdjustment(&adjustment
, &increment
, &disabled
);
321 wtick
= 1.0E-07 * (double)(disabled
? increment
: adjustment
);
323 // TODO: Assert or abort here.
328 // TODO: gettimeofday() returns in microseconds, but what the precision?
332 } // __kmps_get_wtick
334 /* OpenMP 5.0 Memory Management */
336 omp_allocator_handle_t
const omp_null_allocator
= 0;
337 omp_allocator_handle_t
const omp_default_mem_alloc
=
338 (omp_allocator_handle_t
const)1;
339 omp_allocator_handle_t
const omp_large_cap_mem_alloc
=
340 (omp_allocator_handle_t
const)2;
341 omp_allocator_handle_t
const omp_const_mem_alloc
=
342 (omp_allocator_handle_t
const)3;
343 omp_allocator_handle_t
const omp_high_bw_mem_alloc
=
344 (omp_allocator_handle_t
const)4;
345 omp_allocator_handle_t
const omp_low_lat_mem_alloc
=
346 (omp_allocator_handle_t
const)5;
347 omp_allocator_handle_t
const omp_cgroup_mem_alloc
=
348 (omp_allocator_handle_t
const)6;
349 omp_allocator_handle_t
const omp_pteam_mem_alloc
=
350 (omp_allocator_handle_t
const)7;
351 omp_allocator_handle_t
const omp_thread_mem_alloc
=
352 (omp_allocator_handle_t
const)8;
353 omp_allocator_handle_t
const llvm_omp_target_host_mem_alloc
=
354 (omp_allocator_handle_t
const)100;
355 omp_allocator_handle_t
const llvm_omp_target_shared_mem_alloc
=
356 (omp_allocator_handle_t
const)101;
357 omp_allocator_handle_t
const llvm_omp_target_device_mem_alloc
=
358 (omp_allocator_handle_t
const)102;
360 omp_memspace_handle_t
const omp_default_mem_space
=
361 (omp_memspace_handle_t
const)0;
362 omp_memspace_handle_t
const omp_large_cap_mem_space
=
363 (omp_memspace_handle_t
const)1;
364 omp_memspace_handle_t
const omp_const_mem_space
=
365 (omp_memspace_handle_t
const)2;
366 omp_memspace_handle_t
const omp_high_bw_mem_space
=
367 (omp_memspace_handle_t
const)3;
368 omp_memspace_handle_t
const omp_low_lat_mem_space
=
369 (omp_memspace_handle_t
const)4;
370 omp_memspace_handle_t
const llvm_omp_target_host_mem_space
=
371 (omp_memspace_handle_t
const)100;
372 omp_memspace_handle_t
const llvm_omp_target_shared_mem_space
=
373 (omp_memspace_handle_t
const)101;
374 omp_memspace_handle_t
const llvm_omp_target_device_mem_space
=
375 (omp_memspace_handle_t
const)102;
376 #endif /* KMP_OS_WINDOWS */
378 void *omp_alloc(size_t size
, omp_allocator_handle_t allocator
) {
382 // Returns a pointer to the memory block, or NULL if failed.
383 // Sets errno to ENOMEM or EINVAL if memory allocation failed or parameter
384 // validation failed.
385 res
= _aligned_malloc(size
, 1);
392 void *omp_aligned_alloc(size_t a
, size_t size
, omp_allocator_handle_t al
) {
396 res
= _aligned_malloc(size
, a
);
399 if ((err
= posix_memalign(&res
, a
, size
))) {
400 errno
= err
; // can be EINVAL or ENOMEM
407 void *omp_calloc(size_t nmemb
, size_t size
, omp_allocator_handle_t al
) {
411 res
= _aligned_recalloc(NULL
, nmemb
, size
, 1);
413 res
= calloc(nmemb
, size
);
418 void *omp_aligned_calloc(size_t a
, size_t nmemb
, size_t size
,
419 omp_allocator_handle_t al
) {
423 res
= _aligned_recalloc(NULL
, nmemb
, size
, a
);
426 if ((err
= posix_memalign(&res
, a
, nmemb
* size
))) {
427 errno
= err
; // can be EINVAL or ENOMEM
430 memset(res
, 0x00, size
);
435 void *omp_realloc(void *ptr
, size_t size
, omp_allocator_handle_t al
,
436 omp_allocator_handle_t free_al
) {
440 res
= _aligned_realloc(ptr
, size
, 1);
442 res
= realloc(ptr
, size
);
447 void omp_free(void *ptr
, omp_allocator_handle_t allocator
) {
456 /* OpenMP 5.0 Affinity Format */
457 void omp_set_affinity_format(char const *format
) { i
; }
458 size_t omp_get_affinity_format(char *buffer
, size_t size
) {
462 void omp_display_affinity(char const *format
) { i
; }
463 size_t omp_capture_affinity(char *buffer
, size_t buf_size
, char const *format
) {