LLVM OpenMP
kmp_stub.cpp
Go to the documentation of this file.
1/*
2 * kmp_stub.cpp -- stub versions of user-callable OpenMP RT functions.
3 */
4
5//===----------------------------------------------------------------------===//
6//
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
10//
11//===----------------------------------------------------------------------===//
12
13#include <errno.h>
14#include <limits.h>
15#include <stdlib.h>
16
17#define __KMP_IMP
18#include "omp.h" // omp_* declarations, must be included before "kmp.h"
19#include "kmp.h" // KMP_DEFAULT_STKSIZE
20#include "kmp_stub.h"
21
22#if KMP_OS_WINDOWS
23#include <windows.h>
24#else
25#include <sys/time.h>
26#endif
27
28// Moved from omp.h
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
33
34#define omp_set_num_threads ompc_set_num_threads
35#define kmp_set_num_threads_8 kmpc_set_num_threads_8
36#define omp_set_dynamic ompc_set_dynamic
37#define omp_set_nested ompc_set_nested
38#define omp_set_affinity_format ompc_set_affinity_format
39#define omp_get_affinity_format ompc_get_affinity_format
40#define omp_display_affinity ompc_display_affinity
41#define omp_capture_affinity ompc_capture_affinity
42#define kmp_set_stacksize kmpc_set_stacksize
43#define kmp_set_stacksize_s kmpc_set_stacksize_s
44#define kmp_set_blocktime kmpc_set_blocktime
45#define kmp_set_library kmpc_set_library
46#define kmp_set_defaults kmpc_set_defaults
47#define kmp_set_disp_num_buffers kmpc_set_disp_num_buffers
48#define kmp_malloc kmpc_malloc
49#define kmp_aligned_malloc kmpc_aligned_malloc
50#define kmp_calloc kmpc_calloc
51#define kmp_realloc kmpc_realloc
52#define kmp_free kmpc_free
53
54#if KMP_OS_WINDOWS
55static double frequency = 0.0;
56#endif
57
58// Helper functions.
59static size_t __kmps_init() {
60 static int initialized = 0;
61 static size_t dummy = 0;
62 if (!initialized) {
63 // TODO: Analyze KMP_VERSION environment variable, print
64 // __kmp_version_copyright and __kmp_version_build_time.
65 // WARNING: Do not use "fprintf(stderr, ...)" because it will cause
66 // unresolved "__iob" symbol (see C70080). We need to extract __kmp_printf()
67 // stuff from kmp_runtime.cpp and use it.
68
69 // Trick with dummy variable forces linker to keep __kmp_version_copyright
70 // and __kmp_version_build_time strings in executable file (in case of
71 // static linkage). When KMP_VERSION analysis is implemented, dummy
72 // variable should be deleted, function should return void.
74
75#if KMP_OS_WINDOWS
76 LARGE_INTEGER freq;
77 BOOL status = QueryPerformanceFrequency(&freq);
78 if (status) {
79 frequency = double(freq.QuadPart);
80 }
81#endif
82
83 initialized = 1;
84 }
85 return dummy;
86} // __kmps_init
87
88#define i __kmps_init();
89
90/* set API functions */
91void omp_set_num_threads(omp_int_t num_threads) { i; }
92void kmp_set_num_threads_8(int64_t num_threads) { i; }
93void omp_set_dynamic(omp_int_t dynamic) {
94 i;
95 __kmps_set_dynamic(dynamic);
96}
97void omp_set_nested(omp_int_t nested) {
98 i;
99 __kmps_set_nested(nested);
100}
101void omp_set_max_active_levels(omp_int_t max_active_levels) { i; }
102void omp_set_schedule(omp_sched_t kind, omp_int_t modifier) {
103 i;
104 __kmps_set_schedule((kmp_sched_t)kind, modifier);
105}
107 i;
108 return (level) ? (-1) : (0);
109}
110int omp_get_team_size(omp_int_t level) {
111 i;
112 return (level) ? (-1) : (1);
113}
114int kmpc_set_affinity_mask_proc(int proc, void **mask) {
115 i;
116 return -1;
117}
118int kmpc_unset_affinity_mask_proc(int proc, void **mask) {
119 i;
120 return -1;
121}
122int kmpc_get_affinity_mask_proc(int proc, void **mask) {
123 i;
124 return -1;
125}
126
127/* kmp API functions */
128void kmp_set_stacksize(omp_int_t arg) {
129 i;
130 __kmps_set_stacksize((size_t)arg);
131}
132void kmp_set_stacksize_s(size_t arg) {
133 i;
135}
136void kmp_set_blocktime(omp_int_t arg) {
137 i;
139}
140void kmp_set_library(omp_int_t arg) {
141 i;
143}
144void kmp_set_defaults(char const *str) { i; }
145void kmp_set_disp_num_buffers(omp_int_t arg) { i; }
146
147/* KMP memory management functions. */
148void *kmp_malloc(size_t size) {
149 i;
150 void *res;
151#if KMP_OS_WINDOWS
152 // If successful returns a pointer to the memory block, otherwise returns
153 // NULL.
154 // Sets errno to ENOMEM or EINVAL if memory allocation failed or parameter
155 // validation failed.
156 res = _aligned_malloc(size, 1);
157#else
158 res = malloc(size);
159#endif
160 return res;
161}
162void *kmp_aligned_malloc(size_t sz, size_t a) {
163 i;
164 void *res;
165#if KMP_OS_WINDOWS
166 res = _aligned_malloc(sz, a);
167#else
168 int err;
169 if ((err = posix_memalign(&res, a, sz))) {
170 errno = err; // can be EINVAL or ENOMEM
171 res = NULL;
172 }
173#endif
174 return res;
175}
176void *kmp_calloc(size_t nelem, size_t elsize) {
177 i;
178 void *res;
179#if KMP_OS_WINDOWS
180 res = _aligned_recalloc(NULL, nelem, elsize, 1);
181#else
182 res = calloc(nelem, elsize);
183#endif
184 return res;
185}
186void *kmp_realloc(void *ptr, size_t size) {
187 i;
188 void *res;
189#if KMP_OS_WINDOWS
190 res = _aligned_realloc(ptr, size, 1);
191#else
192 res = realloc(ptr, size);
193#endif
194 return res;
195}
196void kmp_free(void *ptr) {
197 i;
198#if KMP_OS_WINDOWS
199 _aligned_free(ptr);
200#else
201 free(ptr);
202#endif
203}
204
205static int __kmps_blocktime = INT_MAX;
206
207void __kmps_set_blocktime(int arg) {
208 i;
209 __kmps_blocktime = arg;
210} // __kmps_set_blocktime
211
213 i;
214 return __kmps_blocktime;
215} // __kmps_get_blocktime
216
217static int __kmps_dynamic = 0;
218
219void __kmps_set_dynamic(int arg) {
220 i;
221 __kmps_dynamic = arg;
222} // __kmps_set_dynamic
223
225 i;
226 return __kmps_dynamic;
227} // __kmps_get_dynamic
228
229static int __kmps_library = 1000;
230
231void __kmps_set_library(int arg) {
232 i;
233 __kmps_library = arg;
234} // __kmps_set_library
235
237 i;
238 return __kmps_library;
239} // __kmps_get_library
240
241static int __kmps_nested = 0;
242
243void __kmps_set_nested(int arg) {
244 i;
245 __kmps_nested = arg;
246} // __kmps_set_nested
247
249 i;
250 return __kmps_nested;
251} // __kmps_get_nested
252
254
255void __kmps_set_stacksize(size_t arg) {
256 i;
257 __kmps_stacksize = arg;
258} // __kmps_set_stacksize
259
261 i;
262 return __kmps_stacksize;
263} // __kmps_get_stacksize
264
267
268void __kmps_set_schedule(kmp_sched_t kind, int modifier) {
269 i;
270 __kmps_sched_kind = kind;
271 __kmps_sched_modifier = modifier;
272} // __kmps_set_schedule
273
274void __kmps_get_schedule(kmp_sched_t *kind, int *modifier) {
275 i;
276 *kind = __kmps_sched_kind;
277 *modifier = __kmps_sched_modifier;
278} // __kmps_get_schedule
279
281 i;
282 return proc_bind_false;
283} // __kmps_get_proc_bind
284
285double __kmps_get_wtime(void) {
286 // Elapsed wall clock time (in second) from "sometime in the past".
287 double wtime = 0.0;
288 i;
289#if KMP_OS_WINDOWS
290 if (frequency > 0.0) {
291 LARGE_INTEGER now;
292 BOOL status = QueryPerformanceCounter(&now);
293 if (status) {
294 wtime = double(now.QuadPart) / frequency;
295 }
296 }
297#else
298 // gettimeofday() returns seconds and microseconds since the Epoch.
299 struct timeval tval;
300 int rc;
301 rc = gettimeofday(&tval, NULL);
302 if (rc == 0) {
303 wtime = (double)(tval.tv_sec) + 1.0E-06 * (double)(tval.tv_usec);
304 } else {
305 // TODO: Assert or abort here.
306 }
307#endif
308 return wtime;
309} // __kmps_get_wtime
310
311double __kmps_get_wtick(void) {
312 // Number of seconds between successive clock ticks.
313 double wtick = 0.0;
314 i;
315#if KMP_OS_WINDOWS
316 {
317 DWORD increment;
318 DWORD adjustment;
319 BOOL disabled;
320 BOOL rc;
321 rc = GetSystemTimeAdjustment(&adjustment, &increment, &disabled);
322 if (rc) {
323 wtick = 1.0E-07 * (double)(disabled ? increment : adjustment);
324 } else {
325 // TODO: Assert or abort here.
326 wtick = 1.0E-03;
327 }
328 }
329#else
330 // TODO: gettimeofday() returns in microseconds, but what the precision?
331 wtick = 1.0E-06;
332#endif
333 return wtick;
334} // __kmps_get_wtick
335
336/* OpenMP 5.0 Memory Management */
337#if KMP_OS_WINDOWS
340 (omp_allocator_handle_t const)1;
342 (omp_allocator_handle_t const)2;
344 (omp_allocator_handle_t const)3;
346 (omp_allocator_handle_t const)4;
348 (omp_allocator_handle_t const)5;
350 (omp_allocator_handle_t const)6;
352 (omp_allocator_handle_t const)7;
354 (omp_allocator_handle_t const)8;
356 (omp_allocator_handle_t const)100;
358 (omp_allocator_handle_t const)101;
360 (omp_allocator_handle_t const)102;
361
364 (omp_memspace_handle_t const)99;
366 (omp_memspace_handle_t const)1;
368 (omp_memspace_handle_t const)2;
370 (omp_memspace_handle_t const)3;
372 (omp_memspace_handle_t const)4;
374 (omp_memspace_handle_t const)5;
376 (omp_memspace_handle_t const)100;
378 (omp_memspace_handle_t const)101;
380 (omp_memspace_handle_t const)102;
381#endif /* KMP_OS_WINDOWS */
382
383void *omp_alloc(size_t size, omp_allocator_handle_t allocator) {
384 i;
385 void *res;
386#if KMP_OS_WINDOWS
387 // Returns a pointer to the memory block, or NULL if failed.
388 // Sets errno to ENOMEM or EINVAL if memory allocation failed or parameter
389 // validation failed.
390 res = _aligned_malloc(size, 1);
391#else
392 res = malloc(size);
393#endif
394 return res;
395}
396
398 i;
399 void *res;
400#if KMP_OS_WINDOWS
401 res = _aligned_malloc(size, a);
402#else
403 int err;
404 if ((err = posix_memalign(&res, a, size))) {
405 errno = err; // can be EINVAL or ENOMEM
406 res = NULL;
407 }
408#endif
409 return res;
410}
411
412void *omp_calloc(size_t nmemb, size_t size, omp_allocator_handle_t al) {
413 i;
414 void *res;
415#if KMP_OS_WINDOWS
416 res = _aligned_recalloc(NULL, nmemb, size, 1);
417#else
418 res = calloc(nmemb, size);
419#endif
420 return res;
421}
422
423void *omp_aligned_calloc(size_t a, size_t nmemb, size_t size,
425 i;
426 void *res;
427#if KMP_OS_WINDOWS
428 res = _aligned_recalloc(NULL, nmemb, size, a);
429#else
430 int err;
431 if ((err = posix_memalign(&res, a, nmemb * size))) {
432 errno = err; // can be EINVAL or ENOMEM
433 res = NULL;
434 }
435 memset(res, 0x00, size);
436#endif
437 return res;
438}
439
440void *omp_realloc(void *ptr, size_t size, omp_allocator_handle_t al,
441 omp_allocator_handle_t free_al) {
442 i;
443 void *res;
444#if KMP_OS_WINDOWS
445 res = _aligned_realloc(ptr, size, 1);
446#else
447 res = realloc(ptr, size);
448#endif
449 return res;
450}
451
452void omp_free(void *ptr, omp_allocator_handle_t allocator) {
453 i;
454#if KMP_OS_WINDOWS
455 _aligned_free(ptr);
456#else
457 free(ptr);
458#endif
459}
460
461void *omp_get_dyn_gprivate_ptr(size_t offset, omp_access_t access_group) {
462 i;
463 return NULL;
464}
465
466void *omp_get_dyn_gprivate_nofb_ptr(size_t offset, omp_access_t access_group) {
467 i;
468 return NULL;
469}
470
471size_t omp_get_dyn_gprivate_size(omp_access_t access_group) {
472 i;
473 return 0;
474}
475
477 i;
478 return omp_null_mem_space;
479}
480
481size_t omp_get_gprivate_limit(int device_num, omp_access_t access_group) {
482 i;
483 return 0;
484}
485
486/* OpenMP 5.0 Affinity Format */
487void omp_set_affinity_format(char const *format) { i; }
488size_t omp_get_affinity_format(char *buffer, size_t size) {
489 i;
490 return 0;
491}
492void omp_display_affinity(char const *format) { i; }
493size_t omp_capture_affinity(char *buffer, size_t buf_size, char const *format) {
494 i;
495 return 0;
496}
497
498// end of file //
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int mask
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int initialized
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
omp_memspace_handle_t const omp_default_mem_space
void * omp_memspace_handle_t
Definition kmp.h:1055
void * omp_allocator_handle_t
Definition kmp.h:1073
omp_allocator_handle_t const omp_cgroup_mem_alloc
omp_memspace_handle_t const llvm_omp_target_host_mem_space
omp_memspace_handle_t const omp_low_lat_mem_space
omp_allocator_handle_t const omp_default_mem_alloc
omp_allocator_handle_t const omp_large_cap_mem_alloc
omp_allocator_handle_t const omp_low_lat_mem_alloc
#define KMP_DEFAULT_STKSIZE
Definition kmp.h:1223
omp_allocator_handle_t const omp_high_bw_mem_alloc
omp_memspace_handle_t const omp_const_mem_space
omp_memspace_handle_t const omp_null_mem_space
omp_memspace_handle_t const omp_large_cap_mem_space
omp_memspace_handle_t const llvm_omp_target_shared_mem_space
omp_memspace_handle_t const omp_high_bw_mem_space
omp_allocator_handle_t const omp_const_mem_alloc
omp_allocator_handle_t const omp_pteam_mem_alloc
omp_allocator_handle_t const llvm_omp_target_host_mem_alloc
enum kmp_sched kmp_sched_t
omp_sched_t
Definition kmp.h:4489
omp_memspace_handle_t const omp_cgroup_mem_space
@ kmp_sched_default
Definition kmp.h:331
omp_allocator_handle_t const omp_thread_mem_alloc
kmp_proc_bind_t
Definition kmp.h:930
@ proc_bind_false
Definition kmp.h:931
omp_allocator_handle_t const llvm_omp_target_shared_mem_alloc
omp_memspace_handle_t const llvm_omp_target_device_mem_space
omp_allocator_handle_t const llvm_omp_target_device_mem_alloc
omp_allocator_handle_t const omp_null_allocator
KMP_ARCH_X86 KMP_ARCH_X86 long double
static volatile kmp_i18n_cat_status_t status
Definition kmp_i18n.cpp:48
static int __kmps_sched_modifier
Definition kmp_stub.cpp:266
#define kmp_set_disp_num_buffers
Definition kmp_stub.cpp:47
void __kmps_set_library(int arg)
Definition kmp_stub.cpp:231
#define i
Definition kmp_stub.cpp:88
static int __kmps_blocktime
Definition kmp_stub.cpp:205
#define omp_set_max_active_levels
Definition kmp_stub.cpp:29
void * omp_realloc(void *ptr, size_t size, omp_allocator_handle_t al, omp_allocator_handle_t free_al)
Definition kmp_stub.cpp:440
double __kmps_get_wtime(void)
Definition kmp_stub.cpp:285
#define omp_set_num_threads
Definition kmp_stub.cpp:34
#define omp_set_schedule
Definition kmp_stub.cpp:30
int kmpc_unset_affinity_mask_proc(int proc, void **mask)
Definition kmp_stub.cpp:118
void __kmps_set_nested(int arg)
Definition kmp_stub.cpp:243
int __kmps_get_blocktime(void)
Definition kmp_stub.cpp:212
void __kmps_set_schedule(kmp_sched_t kind, int modifier)
Definition kmp_stub.cpp:268
int __kmps_get_dynamic(void)
Definition kmp_stub.cpp:224
int __kmps_get_nested(void)
Definition kmp_stub.cpp:248
void * omp_get_dyn_gprivate_nofb_ptr(size_t offset, omp_access_t access_group)
Definition kmp_stub.cpp:466
#define omp_get_affinity_format
Definition kmp_stub.cpp:39
void * omp_calloc(size_t nmemb, size_t size, omp_allocator_handle_t al)
Definition kmp_stub.cpp:412
size_t omp_get_gprivate_limit(int device_num, omp_access_t access_group)
Definition kmp_stub.cpp:481
#define kmp_free
Definition kmp_stub.cpp:52
void * omp_aligned_alloc(size_t a, size_t size, omp_allocator_handle_t al)
Definition kmp_stub.cpp:397
#define kmp_set_num_threads_8
Definition kmp_stub.cpp:35
size_t omp_get_dyn_gprivate_size(omp_access_t access_group)
Definition kmp_stub.cpp:471
static size_t __kmps_stacksize
Definition kmp_stub.cpp:253
#define kmp_realloc
Definition kmp_stub.cpp:51
void __kmps_set_blocktime(int arg)
Definition kmp_stub.cpp:207
int kmpc_set_affinity_mask_proc(int proc, void **mask)
Definition kmp_stub.cpp:114
#define omp_get_team_size
Definition kmp_stub.cpp:32
#define omp_get_ancestor_thread_num
Definition kmp_stub.cpp:31
void __kmps_set_dynamic(int arg)
Definition kmp_stub.cpp:219
#define omp_set_dynamic
Definition kmp_stub.cpp:36
int __kmps_get_library(void)
Definition kmp_stub.cpp:236
static size_t __kmps_init()
Definition kmp_stub.cpp:59
#define kmp_set_blocktime
Definition kmp_stub.cpp:44
#define kmp_aligned_malloc
Definition kmp_stub.cpp:49
#define kmp_set_library
Definition kmp_stub.cpp:45
void * omp_get_dyn_gprivate_ptr(size_t offset, omp_access_t access_group)
Definition kmp_stub.cpp:461
static int __kmps_dynamic
Definition kmp_stub.cpp:217
#define omp_set_affinity_format
Definition kmp_stub.cpp:38
#define omp_display_affinity
Definition kmp_stub.cpp:40
void omp_free(void *ptr, omp_allocator_handle_t allocator)
Definition kmp_stub.cpp:452
double __kmps_get_wtick(void)
Definition kmp_stub.cpp:311
void __kmps_set_stacksize(size_t arg)
Definition kmp_stub.cpp:255
int kmpc_get_affinity_mask_proc(int proc, void **mask)
Definition kmp_stub.cpp:122
#define kmp_set_stacksize
Definition kmp_stub.cpp:42
#define omp_capture_affinity
Definition kmp_stub.cpp:41
#define kmp_set_stacksize_s
Definition kmp_stub.cpp:43
static int __kmps_nested
Definition kmp_stub.cpp:241
static int __kmps_library
Definition kmp_stub.cpp:229
#define kmp_calloc
Definition kmp_stub.cpp:50
void * omp_aligned_calloc(size_t a, size_t nmemb, size_t size, omp_allocator_handle_t al)
Definition kmp_stub.cpp:423
#define omp_set_nested
Definition kmp_stub.cpp:37
void __kmps_get_schedule(kmp_sched_t *kind, int *modifier)
Definition kmp_stub.cpp:274
#define kmp_malloc
Definition kmp_stub.cpp:48
#define kmp_set_defaults
Definition kmp_stub.cpp:46
static kmp_sched_t __kmps_sched_kind
Definition kmp_stub.cpp:265
kmp_proc_bind_t __kmps_get_proc_bind(void)
Definition kmp_stub.cpp:280
omp_memspace_handle_t omp_get_dyn_gprivate_memspace(omp_access_t access_group)
Definition kmp_stub.cpp:476
void * omp_alloc(size_t size, omp_allocator_handle_t allocator)
Definition kmp_stub.cpp:383
size_t __kmps_get_stacksize(void)
Definition kmp_stub.cpp:260
char const __kmp_version_build_time[]
char const __kmp_version_copyright[]
int a
#define res
static int err