blob: 58399f491190cd2271b55fafb765eff6830f3686 [file] [log] [blame]
Jim Cownie5e8470a2013-09-27 10:38:44 +00001/*
2 * kmp_ftn_entry.h -- Fortran entry linkage support for OpenMP.
Jim Cownie5e8470a2013-09-27 10:38:44 +00003 */
4
5
6//===----------------------------------------------------------------------===//
7//
8// The LLVM Compiler Infrastructure
9//
10// This file is dual licensed under the MIT and the University of Illinois Open
11// Source Licenses. See LICENSE.txt for details.
12//
13//===----------------------------------------------------------------------===//
14
15
16#ifndef FTN_STDCALL
17# error The support file kmp_ftn_entry.h should not be compiled by itself.
18#endif
19
20#ifdef KMP_STUB
21 #include "kmp_stub.h"
22#endif
23
24#include "kmp_i18n.h"
25
26#ifdef __cplusplus
27 extern "C" {
28#endif // __cplusplus
29
30/*
Alp Toker8f2d3f02014-02-24 10:40:15 +000031 * For compatibility with the Gnu/MS Open MP codegen, omp_set_num_threads(),
Jim Cownie5e8470a2013-09-27 10:38:44 +000032 * omp_set_nested(), and omp_set_dynamic() [in lowercase on MS, and w/o
33 * a trailing underscore on Linux* OS] take call by value integer arguments.
34 * + omp_set_max_active_levels()
35 * + omp_set_schedule()
36 *
Alp Toker8f2d3f02014-02-24 10:40:15 +000037 * For backward compatibility with 9.1 and previous Intel compiler, these
Jim Cownie5e8470a2013-09-27 10:38:44 +000038 * entry points take call by reference integer arguments.
39 */
40#ifdef KMP_GOMP_COMPAT
41# if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_UPPER)
42# define PASS_ARGS_BY_VALUE 1
43# endif
44#endif
45#if KMP_OS_WINDOWS
46# if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_APPEND)
47# define PASS_ARGS_BY_VALUE 1
48# endif
49#endif
50
51// This macro helps to reduce code duplication.
52#ifdef PASS_ARGS_BY_VALUE
53 #define KMP_DEREF
54#else
55 #define KMP_DEREF *
56#endif
57
58void FTN_STDCALL
59FTN_SET_STACKSIZE( int KMP_DEREF arg )
60{
61 #ifdef KMP_STUB
62 __kmps_set_stacksize( KMP_DEREF arg );
63 #else
64 // __kmp_aux_set_stacksize initializes the library if needed
65 __kmp_aux_set_stacksize( (size_t) KMP_DEREF arg );
66 #endif
67}
68
69void FTN_STDCALL
70FTN_SET_STACKSIZE_S( size_t KMP_DEREF arg )
71{
72 #ifdef KMP_STUB
73 __kmps_set_stacksize( KMP_DEREF arg );
74 #else
75 // __kmp_aux_set_stacksize initializes the library if needed
76 __kmp_aux_set_stacksize( KMP_DEREF arg );
77 #endif
78}
79
80int FTN_STDCALL
81FTN_GET_STACKSIZE( void )
82{
83 #ifdef KMP_STUB
84 return __kmps_get_stacksize();
85 #else
86 if ( ! __kmp_init_serial ) {
87 __kmp_serial_initialize();
88 };
89 return (int)__kmp_stksize;
90 #endif
91}
92
93size_t FTN_STDCALL
94FTN_GET_STACKSIZE_S( void )
95{
96 #ifdef KMP_STUB
97 return __kmps_get_stacksize();
98 #else
99 if ( ! __kmp_init_serial ) {
100 __kmp_serial_initialize();
101 };
102 return __kmp_stksize;
103 #endif
104}
105
106void FTN_STDCALL
107FTN_SET_BLOCKTIME( int KMP_DEREF arg )
108{
109 #ifdef KMP_STUB
110 __kmps_set_blocktime( KMP_DEREF arg );
111 #else
112 int gtid, tid;
113 kmp_info_t *thread;
114
115 gtid = __kmp_entry_gtid();
116 tid = __kmp_tid_from_gtid(gtid);
117 thread = __kmp_thread_from_gtid(gtid);
118
119 __kmp_aux_set_blocktime( KMP_DEREF arg, thread, tid );
120 #endif
121}
122
123int FTN_STDCALL
124FTN_GET_BLOCKTIME( void )
125{
126 #ifdef KMP_STUB
127 return __kmps_get_blocktime();
128 #else
129 int gtid, tid;
130 kmp_info_t *thread;
131 kmp_team_p *team;
132
133 gtid = __kmp_entry_gtid();
134 tid = __kmp_tid_from_gtid(gtid);
135 thread = __kmp_thread_from_gtid(gtid);
136 team = __kmp_threads[ gtid ] -> th.th_team;
137
138 /* These must match the settings used in __kmp_wait_sleep() */
139 if ( __kmp_dflt_blocktime == KMP_MAX_BLOCKTIME ) {
140 KF_TRACE(10, ( "kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n",
141 gtid, team->t.t_id, tid, KMP_MAX_BLOCKTIME) );
142 return KMP_MAX_BLOCKTIME;
143 }
144#ifdef KMP_ADJUST_BLOCKTIME
145 else if ( __kmp_zero_bt && !get__bt_set( team, tid ) ) {
146 KF_TRACE(10, ( "kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n",
147 gtid, team->t.t_id, tid, 0) );
148 return 0;
149 }
150#endif /* KMP_ADJUST_BLOCKTIME */
151 else {
152 KF_TRACE(10, ( "kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n",
153 gtid, team->t.t_id, tid, get__blocktime( team, tid ) ) );
154 return get__blocktime( team, tid );
155 };
156 #endif
157}
158
159void FTN_STDCALL
160FTN_SET_LIBRARY_SERIAL( void )
161{
162 #ifdef KMP_STUB
163 __kmps_set_library( library_serial );
164 #else
165 // __kmp_user_set_library initializes the library if needed
166 __kmp_user_set_library( library_serial );
167 #endif
168}
169
170void FTN_STDCALL
171FTN_SET_LIBRARY_TURNAROUND( void )
172{
173 #ifdef KMP_STUB
174 __kmps_set_library( library_turnaround );
175 #else
176 // __kmp_user_set_library initializes the library if needed
177 __kmp_user_set_library( library_turnaround );
178 #endif
179}
180
181void FTN_STDCALL
182FTN_SET_LIBRARY_THROUGHPUT( void )
183{
184 #ifdef KMP_STUB
185 __kmps_set_library( library_throughput );
186 #else
187 // __kmp_user_set_library initializes the library if needed
188 __kmp_user_set_library( library_throughput );
189 #endif
190}
191
192void FTN_STDCALL
193FTN_SET_LIBRARY( int KMP_DEREF arg )
194{
195 #ifdef KMP_STUB
196 __kmps_set_library( KMP_DEREF arg );
197 #else
198 enum library_type lib;
199 lib = (enum library_type) KMP_DEREF arg;
200 // __kmp_user_set_library initializes the library if needed
201 __kmp_user_set_library( lib );
202 #endif
203}
204
205int FTN_STDCALL
206FTN_GET_LIBRARY (void)
207{
208 #ifdef KMP_STUB
209 return __kmps_get_library();
210 #else
211 if ( ! __kmp_init_serial ) {
212 __kmp_serial_initialize();
213 }
214 return ((int) __kmp_library);
215 #endif
216}
217
Jim Cownie5e8470a2013-09-27 10:38:44 +0000218int FTN_STDCALL
219FTN_SET_AFFINITY( void **mask )
220{
Alp Toker763b9392014-02-28 09:42:41 +0000221 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000222 return -1;
223 #else
224 if ( ! TCR_4(__kmp_init_middle) ) {
225 __kmp_middle_initialize();
226 }
227 return __kmp_aux_set_affinity( mask );
228 #endif
229}
230
231int FTN_STDCALL
232FTN_GET_AFFINITY( void **mask )
233{
Alp Toker763b9392014-02-28 09:42:41 +0000234 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000235 return -1;
236 #else
237 if ( ! TCR_4(__kmp_init_middle) ) {
238 __kmp_middle_initialize();
239 }
240 return __kmp_aux_get_affinity( mask );
241 #endif
242}
243
244int FTN_STDCALL
245FTN_GET_AFFINITY_MAX_PROC( void )
246{
Alp Toker763b9392014-02-28 09:42:41 +0000247 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000248 return 0;
249 #else
250 //
251 // We really only NEED serial initialization here.
252 //
253 if ( ! TCR_4(__kmp_init_middle) ) {
254 __kmp_middle_initialize();
255 }
256 if ( ! ( KMP_AFFINITY_CAPABLE() ) ) {
257 return 0;
258 }
259
Jonathan Peyton01dcf362015-11-30 20:02:59 +0000260 #if KMP_GROUP_AFFINITY && !KMP_USE_HWLOC
Andrey Churbanov9ffc0982015-01-29 15:48:21 +0000261 if ( __kmp_num_proc_groups > 1 ) {
Jim Cownie3b81ce62014-08-05 09:32:28 +0000262 return (int)KMP_CPU_SETSIZE;
Jim Cownie5e8470a2013-09-27 10:38:44 +0000263 }
Andrey Churbanov7daf9802015-01-27 16:52:57 +0000264 #endif /* KMP_GROUP_AFFINITY */
Jim Cownie5e8470a2013-09-27 10:38:44 +0000265 return __kmp_xproc;
266 #endif
267}
268
269void FTN_STDCALL
270FTN_CREATE_AFFINITY_MASK( void **mask )
271{
Alp Toker763b9392014-02-28 09:42:41 +0000272 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000273 *mask = NULL;
274 #else
275 //
276 // We really only NEED serial initialization here.
277 //
278 if ( ! TCR_4(__kmp_init_middle) ) {
279 __kmp_middle_initialize();
280 }
Jonathan Peyton01dcf362015-11-30 20:02:59 +0000281 # if KMP_USE_HWLOC
282 *mask = (hwloc_cpuset_t)hwloc_bitmap_alloc();
283 # else
Jim Cownie5e8470a2013-09-27 10:38:44 +0000284 *mask = kmpc_malloc( __kmp_affin_mask_size );
Jonathan Peyton01dcf362015-11-30 20:02:59 +0000285 # endif
Jim Cownie5e8470a2013-09-27 10:38:44 +0000286 KMP_CPU_ZERO( (kmp_affin_mask_t *)(*mask) );
287 #endif
288}
289
290void FTN_STDCALL
291FTN_DESTROY_AFFINITY_MASK( void **mask )
292{
Alp Toker763b9392014-02-28 09:42:41 +0000293 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000294 // Nothing
295 #else
296 //
297 // We really only NEED serial initialization here.
298 //
299 if ( ! TCR_4(__kmp_init_middle) ) {
300 __kmp_middle_initialize();
301 }
302 if ( __kmp_env_consistency_check ) {
303 if ( *mask == NULL ) {
304 KMP_FATAL( AffinityInvalidMask, "kmp_destroy_affinity_mask" );
305 }
306 }
Jonathan Peyton01dcf362015-11-30 20:02:59 +0000307 # if KMP_USE_HWLOC
308 hwloc_bitmap_free((hwloc_cpuset_t)(*mask));
309 # else
Jim Cownie5e8470a2013-09-27 10:38:44 +0000310 kmpc_free( *mask );
Jonathan Peyton01dcf362015-11-30 20:02:59 +0000311 # endif
Jim Cownie5e8470a2013-09-27 10:38:44 +0000312 *mask = NULL;
313 #endif
314}
315
316int FTN_STDCALL
317FTN_SET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
318{
Alp Toker763b9392014-02-28 09:42:41 +0000319 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000320 return -1;
321 #else
322 if ( ! TCR_4(__kmp_init_middle) ) {
323 __kmp_middle_initialize();
324 }
325 return __kmp_aux_set_affinity_mask_proc( KMP_DEREF proc, mask );
326 #endif
327}
328
329int FTN_STDCALL
330FTN_UNSET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
331{
Alp Toker763b9392014-02-28 09:42:41 +0000332 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000333 return -1;
334 #else
335 if ( ! TCR_4(__kmp_init_middle) ) {
336 __kmp_middle_initialize();
337 }
338 return __kmp_aux_unset_affinity_mask_proc( KMP_DEREF proc, mask );
339 #endif
340}
341
342int FTN_STDCALL
343FTN_GET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
344{
Alp Toker763b9392014-02-28 09:42:41 +0000345 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
Jim Cownie5e8470a2013-09-27 10:38:44 +0000346 return -1;
347 #else
348 if ( ! TCR_4(__kmp_init_middle) ) {
349 __kmp_middle_initialize();
350 }
351 return __kmp_aux_get_affinity_mask_proc( KMP_DEREF proc, mask );
352 #endif
353}
354
Jim Cownie5e8470a2013-09-27 10:38:44 +0000355
356/* ------------------------------------------------------------------------ */
357
358/* sets the requested number of threads for the next parallel region */
359
360void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000361xexpand(FTN_SET_NUM_THREADS)( int KMP_DEREF arg )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000362{
363 #ifdef KMP_STUB
364 // Nothing.
365 #else
366 __kmp_set_num_threads( KMP_DEREF arg, __kmp_entry_gtid() );
367 #endif
368}
369
370
371/* returns the number of threads in current team */
372int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000373xexpand(FTN_GET_NUM_THREADS)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000374{
375 #ifdef KMP_STUB
376 return 1;
377 #else
378 // __kmpc_bound_num_threads initializes the library if needed
379 return __kmpc_bound_num_threads(NULL);
380 #endif
381}
382
383int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000384xexpand(FTN_GET_MAX_THREADS)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000385{
386 #ifdef KMP_STUB
387 return 1;
388 #else
389 int gtid;
390 kmp_info_t *thread;
391 if ( ! TCR_4(__kmp_init_middle) ) {
392 __kmp_middle_initialize();
393 }
394 gtid = __kmp_entry_gtid();
395 thread = __kmp_threads[ gtid ];
Jim Cownie5e8470a2013-09-27 10:38:44 +0000396 //return thread -> th.th_team -> t.t_current_task[ thread->th.th_info.ds.ds_tid ] -> icvs.nproc;
397 return thread -> th.th_current_task -> td_icvs.nproc;
Jim Cownie5e8470a2013-09-27 10:38:44 +0000398 #endif
399}
400
401int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000402xexpand(FTN_GET_THREAD_NUM)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000403{
404 #ifdef KMP_STUB
405 return 0;
406 #else
407 int gtid;
408
Joerg Sonnenberger1564f3c2015-09-21 20:02:45 +0000409 #if KMP_OS_DARWIN || KMP_OS_FREEBSD || KMP_OS_NETBSD
Jim Cownie5e8470a2013-09-27 10:38:44 +0000410 gtid = __kmp_entry_gtid();
411 #elif KMP_OS_WINDOWS
412 if (!__kmp_init_parallel ||
Jim Cownie3b81ce62014-08-05 09:32:28 +0000413 (gtid = (int)((kmp_intptr_t)TlsGetValue( __kmp_gtid_threadprivate_key ))) == 0) {
Jim Cownie5e8470a2013-09-27 10:38:44 +0000414 // Either library isn't initialized or thread is not registered
415 // 0 is the correct TID in this case
416 return 0;
417 }
418 --gtid; // We keep (gtid+1) in TLS
419 #elif KMP_OS_LINUX
420 #ifdef KMP_TDATA_GTID
421 if ( __kmp_gtid_mode >= 3 ) {
422 if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
423 return 0;
424 }
425 } else {
426 #endif
427 if (!__kmp_init_parallel ||
428 (gtid = (kmp_intptr_t)(pthread_getspecific( __kmp_gtid_threadprivate_key ))) == 0) {
429 return 0;
430 }
431 --gtid;
432 #ifdef KMP_TDATA_GTID
433 }
434 #endif
435 #else
436 #error Unknown or unsupported OS
437 #endif
438
439 return __kmp_tid_from_gtid( gtid );
440 #endif
441}
442
443int FTN_STDCALL
444FTN_GET_NUM_KNOWN_THREADS( void )
445{
446 #ifdef KMP_STUB
447 return 1;
448 #else
449 if ( ! __kmp_init_serial ) {
450 __kmp_serial_initialize();
451 }
452 /* NOTE: this is not syncronized, so it can change at any moment */
453 /* NOTE: this number also includes threads preallocated in hot-teams */
454 return TCR_4(__kmp_nth);
455 #endif
456}
457
458int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000459xexpand(FTN_GET_NUM_PROCS)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000460{
461 #ifdef KMP_STUB
462 return 1;
463 #else
Jim Cownie5e8470a2013-09-27 10:38:44 +0000464 if ( ! TCR_4(__kmp_init_middle) ) {
465 __kmp_middle_initialize();
466 }
467 return __kmp_avail_proc;
468 #endif
469}
470
471void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000472xexpand(FTN_SET_NESTED)( int KMP_DEREF flag )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000473{
474 #ifdef KMP_STUB
475 __kmps_set_nested( KMP_DEREF flag );
476 #else
477 kmp_info_t *thread;
478 /* For the thread-private internal controls implementation */
479 thread = __kmp_entry_thread();
480 __kmp_save_internal_controls( thread );
481 set__nested( thread, ( (KMP_DEREF flag) ? TRUE : FALSE ) );
482 #endif
483}
484
485
486int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000487xexpand(FTN_GET_NESTED)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000488{
489 #ifdef KMP_STUB
490 return __kmps_get_nested();
491 #else
492 kmp_info_t *thread;
493 thread = __kmp_entry_thread();
494 return get__nested( thread );
495 #endif
496}
497
498void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000499xexpand(FTN_SET_DYNAMIC)( int KMP_DEREF flag )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000500{
501 #ifdef KMP_STUB
502 __kmps_set_dynamic( KMP_DEREF flag ? TRUE : FALSE );
503 #else
504 kmp_info_t *thread;
505 /* For the thread-private implementation of the internal controls */
506 thread = __kmp_entry_thread();
507 // !!! What if foreign thread calls it?
508 __kmp_save_internal_controls( thread );
509 set__dynamic( thread, KMP_DEREF flag ? TRUE : FALSE );
510 #endif
511}
512
513
514int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000515xexpand(FTN_GET_DYNAMIC)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000516{
517 #ifdef KMP_STUB
518 return __kmps_get_dynamic();
519 #else
520 kmp_info_t *thread;
521 thread = __kmp_entry_thread();
522 return get__dynamic( thread );
523 #endif
524}
525
526int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000527xexpand(FTN_IN_PARALLEL)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000528{
529 #ifdef KMP_STUB
530 return 0;
531 #else
532 kmp_info_t *th = __kmp_entry_thread();
533#if OMP_40_ENABLED
Jim Cownie4cc4bb42014-10-07 16:25:50 +0000534 if ( th->th.th_teams_microtask ) {
Jim Cownie5e8470a2013-09-27 10:38:44 +0000535 // AC: r_in_parallel does not work inside teams construct
536 // where real parallel is inactive, but all threads have same root,
537 // so setting it in one team affects other teams.
538 // The solution is to use per-team nesting level
539 return ( th->th.th_team->t.t_active_level ? 1 : 0 );
540 }
541 else
542#endif /* OMP_40_ENABLED */
543 return ( th->th.th_root->r.r_in_parallel ? FTN_TRUE : FTN_FALSE );
544 #endif
545}
546
Jim Cownie5e8470a2013-09-27 10:38:44 +0000547void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000548xexpand(FTN_SET_SCHEDULE)( kmp_sched_t KMP_DEREF kind, int KMP_DEREF modifier )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000549{
550 #ifdef KMP_STUB
551 __kmps_set_schedule( KMP_DEREF kind, KMP_DEREF modifier );
552 #else
553 /* TO DO */
554 /* For the per-task implementation of the internal controls */
555 __kmp_set_schedule( __kmp_entry_gtid(), KMP_DEREF kind, KMP_DEREF modifier );
556 #endif
557}
558
559void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000560xexpand(FTN_GET_SCHEDULE)( kmp_sched_t * kind, int * modifier )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000561{
562 #ifdef KMP_STUB
563 __kmps_get_schedule( kind, modifier );
564 #else
565 /* TO DO */
566 /* For the per-task implementation of the internal controls */
567 __kmp_get_schedule( __kmp_entry_gtid(), kind, modifier );
568 #endif
569}
570
571void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000572xexpand(FTN_SET_MAX_ACTIVE_LEVELS)( int KMP_DEREF arg )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000573{
574 #ifdef KMP_STUB
575 // Nothing.
576 #else
577 /* TO DO */
578 /* We want per-task implementation of this internal control */
579 __kmp_set_max_active_levels( __kmp_entry_gtid(), KMP_DEREF arg );
580 #endif
581}
582
583int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000584xexpand(FTN_GET_MAX_ACTIVE_LEVELS)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000585{
586 #ifdef KMP_STUB
587 return 0;
588 #else
589 /* TO DO */
590 /* We want per-task implementation of this internal control */
591 return __kmp_get_max_active_levels( __kmp_entry_gtid() );
592 #endif
593}
594
595int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000596xexpand(FTN_GET_ACTIVE_LEVEL)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000597{
598 #ifdef KMP_STUB
599 return 0; // returns 0 if it is called from the sequential part of the program
600 #else
601 /* TO DO */
602 /* For the per-task implementation of the internal controls */
603 return __kmp_entry_thread() -> th.th_team -> t.t_active_level;
604 #endif
605}
606
607int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000608xexpand(FTN_GET_LEVEL)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000609{
610 #ifdef KMP_STUB
611 return 0; // returns 0 if it is called from the sequential part of the program
612 #else
613 /* TO DO */
614 /* For the per-task implementation of the internal controls */
615 return __kmp_entry_thread() -> th.th_team -> t.t_level;
616 #endif
617}
618
619int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000620xexpand(FTN_GET_ANCESTOR_THREAD_NUM)( int KMP_DEREF level )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000621{
622 #ifdef KMP_STUB
623 return ( KMP_DEREF level ) ? ( -1 ) : ( 0 );
624 #else
625 return __kmp_get_ancestor_thread_num( __kmp_entry_gtid(), KMP_DEREF level );
626 #endif
627}
628
629int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000630xexpand(FTN_GET_TEAM_SIZE)( int KMP_DEREF level )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000631{
632 #ifdef KMP_STUB
633 return ( KMP_DEREF level ) ? ( -1 ) : ( 1 );
634 #else
635 return __kmp_get_team_size( __kmp_entry_gtid(), KMP_DEREF level );
636 #endif
637}
638
639int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000640xexpand(FTN_GET_THREAD_LIMIT)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000641{
642 #ifdef KMP_STUB
643 return 1; // TO DO: clarify whether it returns 1 or 0?
644 #else
645 if ( ! __kmp_init_serial ) {
646 __kmp_serial_initialize();
647 };
648 /* global ICV */
649 return __kmp_max_nth;
650 #endif
651}
652
653int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000654xexpand(FTN_IN_FINAL)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000655{
656 #ifdef KMP_STUB
657 return 0; // TO DO: clarify whether it returns 1 or 0?
658 #else
659 if ( ! TCR_4(__kmp_init_parallel) ) {
660 return 0;
661 }
662 return __kmp_entry_thread() -> th.th_current_task -> td_flags.final;
663 #endif
664}
665
Jim Cownie5e8470a2013-09-27 10:38:44 +0000666#if OMP_40_ENABLED
667
668
669kmp_proc_bind_t FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000670xexpand(FTN_GET_PROC_BIND)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000671{
672 #ifdef KMP_STUB
673 return __kmps_get_proc_bind();
674 #else
675 return get__proc_bind( __kmp_entry_thread() );
676 #endif
677}
678
Jonathan Peyton2f7c0772016-02-25 18:49:52 +0000679#if OMP_41_ENABLED
680int FTN_STDCALL
681FTN_GET_NUM_PLACES( void )
682{
683 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
684 return 0;
685 #else
686 if ( ! TCR_4(__kmp_init_middle) ) {
687 __kmp_middle_initialize();
688 }
689 return __kmp_affinity_num_masks;
690 #endif
691}
692
693int FTN_STDCALL
694FTN_GET_PLACE_NUM_PROCS( int place_num )
695{
696 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
697 return 0;
698 #else
699 int i;
700 int retval = 0;
701 if ( ! TCR_4(__kmp_init_middle) ) {
702 __kmp_middle_initialize();
703 }
704 if ( place_num < 0 || place_num >= (int)__kmp_affinity_num_masks )
705 return 0;
706 kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity_masks, place_num);
707 KMP_CPU_SET_ITERATE(i, mask) {
708 if ( !KMP_CPU_ISSET(i, mask) )
709 continue;
710 ++retval;
711 }
712 return retval;
713 #endif
714}
715
716void FTN_STDCALL
717FTN_GET_PLACE_PROC_IDS( int place_num, int *ids )
718{
719 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
720 // Nothing.
721 #else
722 int i,j;
723 if ( ! TCR_4(__kmp_init_middle) ) {
724 __kmp_middle_initialize();
725 }
726 if ( place_num < 0 || place_num >= (int)__kmp_affinity_num_masks )
727 return;
728 kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity_masks, place_num);
729 j = 0;
730 KMP_CPU_SET_ITERATE(i, mask) {
731 if ( !KMP_CPU_ISSET(i, mask) )
732 continue;
733 ids[j++] = i;
734 }
735 #endif
736}
737
738int FTN_STDCALL
739FTN_GET_PLACE_NUM( void )
740{
741 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
742 return -1;
743 #else
744 int gtid;
745 kmp_info_t *thread;
746 if ( ! TCR_4(__kmp_init_middle) ) {
747 __kmp_middle_initialize();
748 }
749 gtid = __kmp_entry_gtid();
750 thread = __kmp_thread_from_gtid(gtid);
751 if ( thread->th.th_current_place < 0 )
752 return -1;
753 return thread->th.th_current_place;
754 #endif
755}
756
757int FTN_STDCALL
758FTN_GET_PARTITION_NUM_PLACES( void )
759{
760 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
761 return 0;
762 #else
763 int gtid, num_places, first_place, last_place;
764 kmp_info_t *thread;
765 if ( ! TCR_4(__kmp_init_middle) ) {
766 __kmp_middle_initialize();
767 }
768 gtid = __kmp_entry_gtid();
769 thread = __kmp_thread_from_gtid(gtid);
770 first_place = thread->th.th_first_place;
771 last_place = thread->th.th_last_place;
772 if ( first_place < 0 || last_place < 0 )
773 return 0;
774 if ( first_place <= last_place )
775 num_places = last_place - first_place + 1;
776 else
777 num_places = __kmp_affinity_num_masks - first_place + last_place + 1;
778 return num_places;
779 #endif
780}
781
782void FTN_STDCALL
783FTN_GET_PARTITION_PLACE_NUMS( int *place_nums ) {
784 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
785 // Nothing.
786 #else
787 int i, gtid, place_num, first_place, last_place, start, end;
788 kmp_info_t *thread;
789 if ( ! TCR_4(__kmp_init_middle) ) {
790 __kmp_middle_initialize();
791 }
792 gtid = __kmp_entry_gtid();
793 thread = __kmp_thread_from_gtid(gtid);
794 first_place = thread->th.th_first_place;
795 last_place = thread->th.th_last_place;
796 if ( first_place < 0 || last_place < 0 )
797 return;
798 if ( first_place <= last_place ) {
799 start = first_place;
800 end = last_place;
801 } else {
802 start = last_place;
803 end = first_place;
804 }
805 for (i = 0, place_num = start; place_num <= end; ++place_num, ++i) {
806 place_nums[i] = place_num;
807 }
808 #endif
809}
810#endif
811
Jim Cownie5e8470a2013-09-27 10:38:44 +0000812int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000813xexpand(FTN_GET_NUM_TEAMS)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000814{
815 #ifdef KMP_STUB
816 return 1;
817 #else
818 kmp_info_t *thr = __kmp_entry_thread();
Jim Cownie4cc4bb42014-10-07 16:25:50 +0000819 if ( thr->th.th_teams_microtask ) {
Jim Cownie5e8470a2013-09-27 10:38:44 +0000820 kmp_team_t *team = thr->th.th_team;
821 int tlevel = thr->th.th_teams_level;
822 int ii = team->t.t_level; // the level of the teams construct
823 int dd = team -> t.t_serialized;
824 int level = tlevel + 1;
825 KMP_DEBUG_ASSERT( ii >= tlevel );
826 while( ii > level )
827 {
828 for( dd = team -> t.t_serialized; ( dd > 0 ) && ( ii > level ); dd--, ii-- )
829 {
830 }
831 if( team -> t.t_serialized && ( !dd ) ) {
832 team = team->t.t_parent;
833 continue;
834 }
835 if( ii > level ) {
836 team = team->t.t_parent;
837 ii--;
838 }
839 }
840 if ( dd > 1 ) {
841 return 1; // teams region is serialized ( 1 team of 1 thread ).
842 } else {
843 return team->t.t_parent->t.t_nproc;
844 }
845 } else {
846 return 1;
847 }
848 #endif
849}
850
851int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +0000852xexpand(FTN_GET_TEAM_NUM)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +0000853{
854 #ifdef KMP_STUB
855 return 0;
856 #else
857 kmp_info_t *thr = __kmp_entry_thread();
Jim Cownie4cc4bb42014-10-07 16:25:50 +0000858 if ( thr->th.th_teams_microtask ) {
Jim Cownie5e8470a2013-09-27 10:38:44 +0000859 kmp_team_t *team = thr->th.th_team;
860 int tlevel = thr->th.th_teams_level; // the level of the teams construct
861 int ii = team->t.t_level;
862 int dd = team -> t.t_serialized;
863 int level = tlevel + 1;
864 KMP_DEBUG_ASSERT( ii >= tlevel );
865 while( ii > level )
866 {
867 for( dd = team -> t.t_serialized; ( dd > 0 ) && ( ii > level ); dd--, ii-- )
868 {
869 }
870 if( team -> t.t_serialized && ( !dd ) ) {
871 team = team->t.t_parent;
872 continue;
873 }
874 if( ii > level ) {
875 team = team->t.t_parent;
876 ii--;
877 }
878 }
879 if ( dd > 1 ) {
880 return 0; // teams region is serialized ( 1 team of 1 thread ).
881 } else {
882 return team->t.t_master_tid;
883 }
884 } else {
885 return 0;
886 }
887 #endif
888}
889
Jonathan Peyton50eae7f2016-05-27 15:51:14 +0000890#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
Jim Cownie5e8470a2013-09-27 10:38:44 +0000891
892int FTN_STDCALL
893FTN_GET_DEFAULT_DEVICE( void )
894{
Jonathan Peyton50eae7f2016-05-27 15:51:14 +0000895 return 0;
Jim Cownie5e8470a2013-09-27 10:38:44 +0000896}
897
898void FTN_STDCALL
899FTN_SET_DEFAULT_DEVICE( int KMP_DEREF arg )
900{
Jim Cownie5e8470a2013-09-27 10:38:44 +0000901}
902
903int FTN_STDCALL
904FTN_GET_NUM_DEVICES( void )
905{
906 return 0;
907}
908
Jonathan Peyton50eae7f2016-05-27 15:51:14 +0000909#endif // KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
Jim Cownie5e8470a2013-09-27 10:38:44 +0000910
Andrey Churbanov851563f2015-02-10 19:47:09 +0000911#if ! KMP_OS_LINUX
912
913int FTN_STDCALL
Jonathan Peytone70f8102015-05-15 19:57:36 +0000914xexpand(FTN_IS_INITIAL_DEVICE)( void )
Andrey Churbanov851563f2015-02-10 19:47:09 +0000915{
916 return 1;
917}
918
919#else
920
921// This internal function is used when the entry from the offload library
922// is not found.
923int _Offload_get_device_number( void ) __attribute__((weak));
924
925int FTN_STDCALL
926xexpand(FTN_IS_INITIAL_DEVICE)( void )
927{
928 if( _Offload_get_device_number ) {
929 return _Offload_get_device_number() == -1;
930 } else {
931 return 1;
932 }
933}
934
935#endif // ! KMP_OS_LINUX
936
Jim Cownie5e8470a2013-09-27 10:38:44 +0000937#endif // OMP_40_ENABLED
938
Jonathan Peyton50eae7f2016-05-27 15:51:14 +0000939#if OMP_41_ENABLED && defined(KMP_STUB)
940// OpenMP 4.5 entries for stubs library
941
942int FTN_STDCALL
943FTN_GET_INITIAL_DEVICE(void)
944{
945 return -1;
946}
947
948// As all *target* functions are C-only parameters always passed by value
949void * FTN_STDCALL
950FTN_TARGET_ALLOC(size_t size, int device_num)
951{
952 return 0;
953}
954
955void FTN_STDCALL
956FTN_TARGET_FREE(void * device_ptr, int device_num)
957{
958}
959
960int FTN_STDCALL
961FTN_TARGET_IS_PRESENT(void * ptr, int device_num)
962{
963 return 0;
964}
965
966int FTN_STDCALL
967FTN_TARGET_MEMCPY(void *dst, void *src, size_t length, size_t dst_offset,
968 size_t src_offset, int dst_device, int src_device)
969{
970 return -1;
971}
972
973int FTN_STDCALL
974FTN_TARGET_MEMCPY_RECT(void *dst, void *src, size_t element_size, int num_dims,
975 const size_t *volume, const size_t *dst_offsets,
976 const size_t *src_offsets, const size_t *dst_dimensions,
977 const size_t *src_dimensions, int dst_device, int src_device)
978{
979 return -1;
980}
981
982int FTN_STDCALL
983FTN_TARGET_ASSOCIATE_PTR(void *host_ptr, void *device_ptr, size_t size,
984 size_t device_offset, int device_num)
985{
986 return -1;
987}
988
989int FTN_STDCALL
990FTN_TARGET_DISASSOCIATE_PTR(void *host_ptr, int device_num)
991{
992 return -1;
993}
994#endif // OMP_41_ENABLED && defined(KMP_STUB)
995
Jim Cownie5e8470a2013-09-27 10:38:44 +0000996#ifdef KMP_STUB
997typedef enum { UNINIT = -1, UNLOCKED, LOCKED } kmp_stub_lock_t;
998#endif /* KMP_STUB */
999
Andrey Churbanov5c56fb52015-02-20 18:05:17 +00001000#if KMP_USE_DYNAMIC_LOCK
1001void FTN_STDCALL
Jonathan Peytonb87b5812015-12-11 22:04:05 +00001002FTN_INIT_LOCK_WITH_HINT( void **user_lock, uintptr_t KMP_DEREF hint )
Andrey Churbanov5c56fb52015-02-20 18:05:17 +00001003{
1004 #ifdef KMP_STUB
1005 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1006 #else
Jonathan Peytonb87b5812015-12-11 22:04:05 +00001007 __kmpc_init_lock_with_hint( NULL, __kmp_entry_gtid(), user_lock, KMP_DEREF hint );
Andrey Churbanov5c56fb52015-02-20 18:05:17 +00001008 #endif
1009}
1010
1011void FTN_STDCALL
Jonathan Peytonb87b5812015-12-11 22:04:05 +00001012FTN_INIT_NEST_LOCK_WITH_HINT( void **user_lock, uintptr_t KMP_DEREF hint )
Andrey Churbanov5c56fb52015-02-20 18:05:17 +00001013{
1014 #ifdef KMP_STUB
1015 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1016 #else
Jonathan Peytonb87b5812015-12-11 22:04:05 +00001017 __kmpc_init_nest_lock_with_hint( NULL, __kmp_entry_gtid(), user_lock, KMP_DEREF hint );
Andrey Churbanov5c56fb52015-02-20 18:05:17 +00001018 #endif
1019}
1020#endif
1021
Jim Cownie5e8470a2013-09-27 10:38:44 +00001022/* initialize the lock */
1023void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001024xexpand(FTN_INIT_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001025{
1026 #ifdef KMP_STUB
1027 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1028 #else
1029 __kmpc_init_lock( NULL, __kmp_entry_gtid(), user_lock );
1030 #endif
1031}
1032
1033/* initialize the lock */
1034void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001035xexpand(FTN_INIT_NEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001036{
1037 #ifdef KMP_STUB
1038 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1039 #else
1040 __kmpc_init_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
1041 #endif
1042}
1043
1044void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001045xexpand(FTN_DESTROY_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001046{
1047 #ifdef KMP_STUB
1048 *((kmp_stub_lock_t *)user_lock) = UNINIT;
1049 #else
1050 __kmpc_destroy_lock( NULL, __kmp_entry_gtid(), user_lock );
1051 #endif
1052}
1053
1054void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001055xexpand(FTN_DESTROY_NEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001056{
1057 #ifdef KMP_STUB
1058 *((kmp_stub_lock_t *)user_lock) = UNINIT;
1059 #else
1060 __kmpc_destroy_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
1061 #endif
1062}
1063
1064void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001065xexpand(FTN_SET_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001066{
1067 #ifdef KMP_STUB
1068 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
1069 // TODO: Issue an error.
1070 }; // if
1071 if ( *((kmp_stub_lock_t *)user_lock) != UNLOCKED ) {
1072 // TODO: Issue an error.
1073 }; // if
1074 *((kmp_stub_lock_t *)user_lock) = LOCKED;
1075 #else
1076 __kmpc_set_lock( NULL, __kmp_entry_gtid(), user_lock );
1077 #endif
1078}
1079
1080void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001081xexpand(FTN_SET_NEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001082{
1083 #ifdef KMP_STUB
1084 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
1085 // TODO: Issue an error.
1086 }; // if
1087 (*((int *)user_lock))++;
1088 #else
1089 __kmpc_set_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
1090 #endif
1091}
1092
1093void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001094xexpand(FTN_UNSET_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001095{
1096 #ifdef KMP_STUB
1097 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
1098 // TODO: Issue an error.
1099 }; // if
1100 if ( *((kmp_stub_lock_t *)user_lock) == UNLOCKED ) {
1101 // TODO: Issue an error.
1102 }; // if
1103 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1104 #else
1105 __kmpc_unset_lock( NULL, __kmp_entry_gtid(), user_lock );
1106 #endif
1107}
1108
1109void FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001110xexpand(FTN_UNSET_NEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001111{
1112 #ifdef KMP_STUB
1113 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
1114 // TODO: Issue an error.
1115 }; // if
1116 if ( *((kmp_stub_lock_t *)user_lock) == UNLOCKED ) {
1117 // TODO: Issue an error.
1118 }; // if
1119 (*((int *)user_lock))--;
1120 #else
1121 __kmpc_unset_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
1122 #endif
1123}
1124
1125int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001126xexpand(FTN_TEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001127{
1128 #ifdef KMP_STUB
1129 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
1130 // TODO: Issue an error.
1131 }; // if
1132 if ( *((kmp_stub_lock_t *)user_lock) == LOCKED ) {
1133 return 0;
1134 }; // if
1135 *((kmp_stub_lock_t *)user_lock) = LOCKED;
1136 return 1;
1137 #else
1138 return __kmpc_test_lock( NULL, __kmp_entry_gtid(), user_lock );
1139 #endif
1140}
1141
1142int FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001143xexpand(FTN_TEST_NEST_LOCK)( void **user_lock )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001144{
1145 #ifdef KMP_STUB
1146 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
1147 // TODO: Issue an error.
1148 }; // if
1149 return ++(*((int *)user_lock));
1150 #else
1151 return __kmpc_test_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
1152 #endif
1153}
1154
1155double FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001156xexpand(FTN_GET_WTIME)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001157{
1158 #ifdef KMP_STUB
1159 return __kmps_get_wtime();
1160 #else
1161 double data;
1162 #if ! KMP_OS_LINUX
1163 // We don't need library initialization to get the time on Linux* OS.
1164 // The routine can be used to measure library initialization time on Linux* OS now.
1165 if ( ! __kmp_init_serial ) {
1166 __kmp_serial_initialize();
1167 };
1168 #endif
1169 __kmp_elapsed( & data );
1170 return data;
1171 #endif
1172}
1173
1174double FTN_STDCALL
Jim Cownie181b4bb2013-12-23 17:28:57 +00001175xexpand(FTN_GET_WTICK)( void )
Jim Cownie5e8470a2013-09-27 10:38:44 +00001176{
1177 #ifdef KMP_STUB
1178 return __kmps_get_wtick();
1179 #else
1180 double data;
1181 if ( ! __kmp_init_serial ) {
1182 __kmp_serial_initialize();
1183 };
1184 __kmp_elapsed_tick( & data );
1185 return data;
1186 #endif
1187}
1188
1189/* ------------------------------------------------------------------------ */
1190
1191void * FTN_STDCALL
1192FTN_MALLOC( size_t KMP_DEREF size )
1193{
1194 // kmpc_malloc initializes the library if needed
1195 return kmpc_malloc( KMP_DEREF size );
1196}
1197
1198void * FTN_STDCALL
Jonathan Peytonf83ae312016-05-12 22:00:37 +00001199FTN_ALIGNED_MALLOC( size_t KMP_DEREF size, size_t KMP_DEREF alignment )
1200{
1201 // kmpc_aligned_malloc initializes the library if needed
1202 return kmpc_aligned_malloc( KMP_DEREF size, KMP_DEREF alignment );
1203}
1204
1205void * FTN_STDCALL
Jim Cownie5e8470a2013-09-27 10:38:44 +00001206FTN_CALLOC( size_t KMP_DEREF nelem, size_t KMP_DEREF elsize )
1207{
1208 // kmpc_calloc initializes the library if needed
1209 return kmpc_calloc( KMP_DEREF nelem, KMP_DEREF elsize );
1210}
1211
1212void * FTN_STDCALL
1213FTN_REALLOC( void * KMP_DEREF ptr, size_t KMP_DEREF size )
1214{
1215 // kmpc_realloc initializes the library if needed
1216 return kmpc_realloc( KMP_DEREF ptr, KMP_DEREF size );
1217}
1218
1219void FTN_STDCALL
1220FTN_FREE( void * KMP_DEREF ptr )
1221{
1222 // does nothing if the library is not initialized
1223 kmpc_free( KMP_DEREF ptr );
1224}
1225
1226void FTN_STDCALL
1227FTN_SET_WARNINGS_ON( void )
1228{
1229 #ifndef KMP_STUB
1230 __kmp_generate_warnings = kmp_warnings_explicit;
1231 #endif
1232}
1233
1234void FTN_STDCALL
1235FTN_SET_WARNINGS_OFF( void )
1236{
1237 #ifndef KMP_STUB
1238 __kmp_generate_warnings = FALSE;
1239 #endif
1240}
1241
1242void FTN_STDCALL
1243FTN_SET_DEFAULTS( char const * str
1244 #ifndef PASS_ARGS_BY_VALUE
1245 , int len
1246 #endif
1247)
1248{
1249 #ifndef KMP_STUB
1250 #ifdef PASS_ARGS_BY_VALUE
Andrey Churbanov74bf17b2015-04-02 13:27:08 +00001251 int len = (int)KMP_STRLEN( str );
Jim Cownie5e8470a2013-09-27 10:38:44 +00001252 #endif
1253 __kmp_aux_set_defaults( str, len );
1254 #endif
1255}
1256
1257/* ------------------------------------------------------------------------ */
1258
1259
Jim Cownie181b4bb2013-12-23 17:28:57 +00001260#if OMP_40_ENABLED
1261/* returns the status of cancellation */
1262int FTN_STDCALL
1263xexpand(FTN_GET_CANCELLATION)(void) {
1264#ifdef KMP_STUB
1265 return 0 /* false */;
1266#else
1267 // initialize the library if needed
1268 if ( ! __kmp_init_serial ) {
1269 __kmp_serial_initialize();
1270 }
1271 return __kmp_omp_cancellation;
1272#endif
1273}
1274
1275int FTN_STDCALL
1276FTN_GET_CANCELLATION_STATUS(int cancel_kind) {
1277#ifdef KMP_STUB
1278 return 0 /* false */;
1279#else
1280 return __kmp_get_cancellation_status(cancel_kind);
1281#endif
1282}
1283
1284#endif // OMP_40_ENABLED
1285
Jonathan Peyton28510722016-02-25 18:04:09 +00001286#if OMP_41_ENABLED
1287/* returns the maximum allowed task priority */
1288int FTN_STDCALL
1289FTN_GET_MAX_TASK_PRIORITY( void )
1290{
1291#ifdef KMP_STUB
1292 return 0;
1293#else
1294 if ( ! __kmp_init_serial ) {
1295 __kmp_serial_initialize();
1296 }
1297 return __kmp_max_task_priority;
1298#endif
1299}
1300#endif
1301
Jim Cownie181b4bb2013-12-23 17:28:57 +00001302// GCC compatibility (versioned symbols)
Jim Cownie4cc4bb42014-10-07 16:25:50 +00001303#ifdef KMP_USE_VERSION_SYMBOLS
Jim Cownie181b4bb2013-12-23 17:28:57 +00001304
1305/*
1306 These following sections create function aliases (dummy symbols) for the omp_* routines.
Jim Cownie4cc4bb42014-10-07 16:25:50 +00001307 These aliases will then be versioned according to how libgomp ``versions'' its
1308 symbols (OMP_1.0, OMP_2.0, OMP_3.0, ...) while also retaining the
Jonathan Peyton66338292015-06-01 02:37:28 +00001309 default version which libomp uses: VERSION (defined in exports_so.txt)
Jim Cownie4cc4bb42014-10-07 16:25:50 +00001310 If you want to see the versioned symbols for libgomp.so.1 then just type:
Jim Cownie181b4bb2013-12-23 17:28:57 +00001311
1312 objdump -T /path/to/libgomp.so.1 | grep omp_
1313
1314 Example:
Jim Cownie4cc4bb42014-10-07 16:25:50 +00001315 Step 1) Create __kmp_api_omp_set_num_threads_10_alias
Jim Cownie181b4bb2013-12-23 17:28:57 +00001316 which is alias of __kmp_api_omp_set_num_threads
1317 Step 2) Set __kmp_api_omp_set_num_threads_10_alias to version: omp_set_num_threads@OMP_1.0
1318 Step 2B) Set __kmp_api_omp_set_num_threads to default version : omp_set_num_threads@@VERSION
1319*/
1320
1321// OMP_1.0 aliases
1322xaliasify(FTN_SET_NUM_THREADS, 10);
1323xaliasify(FTN_GET_NUM_THREADS, 10);
1324xaliasify(FTN_GET_MAX_THREADS, 10);
1325xaliasify(FTN_GET_THREAD_NUM, 10);
1326xaliasify(FTN_GET_NUM_PROCS, 10);
1327xaliasify(FTN_IN_PARALLEL, 10);
1328xaliasify(FTN_SET_DYNAMIC, 10);
1329xaliasify(FTN_GET_DYNAMIC, 10);
1330xaliasify(FTN_SET_NESTED, 10);
1331xaliasify(FTN_GET_NESTED, 10);
1332xaliasify(FTN_INIT_LOCK, 10);
1333xaliasify(FTN_INIT_NEST_LOCK, 10);
1334xaliasify(FTN_DESTROY_LOCK, 10);
1335xaliasify(FTN_DESTROY_NEST_LOCK, 10);
1336xaliasify(FTN_SET_LOCK, 10);
1337xaliasify(FTN_SET_NEST_LOCK, 10);
1338xaliasify(FTN_UNSET_LOCK, 10);
1339xaliasify(FTN_UNSET_NEST_LOCK, 10);
1340xaliasify(FTN_TEST_LOCK, 10);
1341xaliasify(FTN_TEST_NEST_LOCK, 10);
1342
1343// OMP_2.0 aliases
1344xaliasify(FTN_GET_WTICK, 20);
1345xaliasify(FTN_GET_WTIME, 20);
1346
Jim Cownie181b4bb2013-12-23 17:28:57 +00001347// OMP_3.0 aliases
1348xaliasify(FTN_SET_SCHEDULE, 30);
1349xaliasify(FTN_GET_SCHEDULE, 30);
1350xaliasify(FTN_GET_THREAD_LIMIT, 30);
1351xaliasify(FTN_SET_MAX_ACTIVE_LEVELS, 30);
1352xaliasify(FTN_GET_MAX_ACTIVE_LEVELS, 30);
1353xaliasify(FTN_GET_LEVEL, 30);
1354xaliasify(FTN_GET_ANCESTOR_THREAD_NUM, 30);
1355xaliasify(FTN_GET_TEAM_SIZE, 30);
1356xaliasify(FTN_GET_ACTIVE_LEVEL, 30);
1357xaliasify(FTN_INIT_LOCK, 30);
1358xaliasify(FTN_INIT_NEST_LOCK, 30);
1359xaliasify(FTN_DESTROY_LOCK, 30);
1360xaliasify(FTN_DESTROY_NEST_LOCK, 30);
1361xaliasify(FTN_SET_LOCK, 30);
1362xaliasify(FTN_SET_NEST_LOCK, 30);
1363xaliasify(FTN_UNSET_LOCK, 30);
1364xaliasify(FTN_UNSET_NEST_LOCK, 30);
1365xaliasify(FTN_TEST_LOCK, 30);
1366xaliasify(FTN_TEST_NEST_LOCK, 30);
1367
1368// OMP_3.1 aliases
1369xaliasify(FTN_IN_FINAL, 31);
Jim Cownie181b4bb2013-12-23 17:28:57 +00001370
1371#if OMP_40_ENABLED
1372// OMP_4.0 aliases
1373xaliasify(FTN_GET_PROC_BIND, 40);
1374xaliasify(FTN_GET_NUM_TEAMS, 40);
1375xaliasify(FTN_GET_TEAM_NUM, 40);
1376xaliasify(FTN_GET_CANCELLATION, 40);
Andrey Churbanov851563f2015-02-10 19:47:09 +00001377xaliasify(FTN_IS_INITIAL_DEVICE, 40);
Jim Cownie181b4bb2013-12-23 17:28:57 +00001378#endif /* OMP_40_ENABLED */
1379
1380#if OMP_41_ENABLED
1381// OMP_4.1 aliases
1382#endif
1383
1384#if OMP_50_ENABLED
1385// OMP_5.0 aliases
1386#endif
1387
1388// OMP_1.0 versioned symbols
1389xversionify(FTN_SET_NUM_THREADS, 10, "OMP_1.0");
1390xversionify(FTN_GET_NUM_THREADS, 10, "OMP_1.0");
1391xversionify(FTN_GET_MAX_THREADS, 10, "OMP_1.0");
1392xversionify(FTN_GET_THREAD_NUM, 10, "OMP_1.0");
1393xversionify(FTN_GET_NUM_PROCS, 10, "OMP_1.0");
1394xversionify(FTN_IN_PARALLEL, 10, "OMP_1.0");
1395xversionify(FTN_SET_DYNAMIC, 10, "OMP_1.0");
1396xversionify(FTN_GET_DYNAMIC, 10, "OMP_1.0");
1397xversionify(FTN_SET_NESTED, 10, "OMP_1.0");
1398xversionify(FTN_GET_NESTED, 10, "OMP_1.0");
1399xversionify(FTN_INIT_LOCK, 10, "OMP_1.0");
1400xversionify(FTN_INIT_NEST_LOCK, 10, "OMP_1.0");
1401xversionify(FTN_DESTROY_LOCK, 10, "OMP_1.0");
1402xversionify(FTN_DESTROY_NEST_LOCK, 10, "OMP_1.0");
1403xversionify(FTN_SET_LOCK, 10, "OMP_1.0");
1404xversionify(FTN_SET_NEST_LOCK, 10, "OMP_1.0");
1405xversionify(FTN_UNSET_LOCK, 10, "OMP_1.0");
1406xversionify(FTN_UNSET_NEST_LOCK, 10, "OMP_1.0");
1407xversionify(FTN_TEST_LOCK, 10, "OMP_1.0");
1408xversionify(FTN_TEST_NEST_LOCK, 10, "OMP_1.0");
1409
1410// OMP_2.0 versioned symbols
1411xversionify(FTN_GET_WTICK, 20, "OMP_2.0");
1412xversionify(FTN_GET_WTIME, 20, "OMP_2.0");
1413
Jim Cownie181b4bb2013-12-23 17:28:57 +00001414// OMP_3.0 versioned symbols
1415xversionify(FTN_SET_SCHEDULE, 30, "OMP_3.0");
1416xversionify(FTN_GET_SCHEDULE, 30, "OMP_3.0");
1417xversionify(FTN_GET_THREAD_LIMIT, 30, "OMP_3.0");
1418xversionify(FTN_SET_MAX_ACTIVE_LEVELS, 30, "OMP_3.0");
1419xversionify(FTN_GET_MAX_ACTIVE_LEVELS, 30, "OMP_3.0");
1420xversionify(FTN_GET_ANCESTOR_THREAD_NUM, 30, "OMP_3.0");
1421xversionify(FTN_GET_LEVEL, 30, "OMP_3.0");
1422xversionify(FTN_GET_TEAM_SIZE, 30, "OMP_3.0");
1423xversionify(FTN_GET_ACTIVE_LEVEL, 30, "OMP_3.0");
1424
1425// the lock routines have a 1.0 and 3.0 version
1426xversionify(FTN_INIT_LOCK, 30, "OMP_3.0");
1427xversionify(FTN_INIT_NEST_LOCK, 30, "OMP_3.0");
1428xversionify(FTN_DESTROY_LOCK, 30, "OMP_3.0");
1429xversionify(FTN_DESTROY_NEST_LOCK, 30, "OMP_3.0");
1430xversionify(FTN_SET_LOCK, 30, "OMP_3.0");
1431xversionify(FTN_SET_NEST_LOCK, 30, "OMP_3.0");
1432xversionify(FTN_UNSET_LOCK, 30, "OMP_3.0");
1433xversionify(FTN_UNSET_NEST_LOCK, 30, "OMP_3.0");
1434xversionify(FTN_TEST_LOCK, 30, "OMP_3.0");
1435xversionify(FTN_TEST_NEST_LOCK, 30, "OMP_3.0");
1436
1437// OMP_3.1 versioned symbol
1438xversionify(FTN_IN_FINAL, 31, "OMP_3.1");
Jim Cownie181b4bb2013-12-23 17:28:57 +00001439
1440#if OMP_40_ENABLED
1441// OMP_4.0 versioned symbols
1442xversionify(FTN_GET_PROC_BIND, 40, "OMP_4.0");
1443xversionify(FTN_GET_NUM_TEAMS, 40, "OMP_4.0");
1444xversionify(FTN_GET_TEAM_NUM, 40, "OMP_4.0");
1445xversionify(FTN_GET_CANCELLATION, 40, "OMP_4.0");
Andrey Churbanov851563f2015-02-10 19:47:09 +00001446xversionify(FTN_IS_INITIAL_DEVICE, 40, "OMP_4.0");
Jim Cownie181b4bb2013-12-23 17:28:57 +00001447#endif /* OMP_40_ENABLED */
1448
1449#if OMP_41_ENABLED
1450// OMP_4.1 versioned symbols
1451#endif
1452
1453#if OMP_50_ENABLED
1454// OMP_5.0 versioned symbols
1455#endif
1456
Jim Cownie4cc4bb42014-10-07 16:25:50 +00001457#endif // KMP_USE_VERSION_SYMBOLS
Jim Cownie181b4bb2013-12-23 17:28:57 +00001458
Jim Cownie5e8470a2013-09-27 10:38:44 +00001459#ifdef __cplusplus
1460 } //extern "C"
1461#endif // __cplusplus
1462
1463// end of file //