1 /* Copyright (C) 2005-2021 Free Software Foundation, Inc.
2 Contributed by Jakub Jelinek <jakub@redhat.com>.
4 This file is part of the GNU Offloading and Multi Processing Library
7 Libgomp is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
21 You should have received a copy of the GNU General Public License and
22 a copy of the GCC Runtime Library Exception along with this program;
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 <http://www.gnu.org/licenses/>. */
26 /* This file contains Fortran wrapper routines. */
29 #include "libgomp_f.h"
35 #ifdef HAVE_ATTRIBUTE_ALIAS
36 /* Use internal aliases if possible. */
37 # ifndef LIBGOMP_GNU_SYMBOL_VERSIONING
38 ialias_redirect (omp_init_lock
)
39 ialias_redirect (omp_init_nest_lock
)
40 ialias_redirect (omp_destroy_lock
)
41 ialias_redirect (omp_destroy_nest_lock
)
42 ialias_redirect (omp_set_lock
)
43 ialias_redirect (omp_set_nest_lock
)
44 ialias_redirect (omp_unset_lock
)
45 ialias_redirect (omp_unset_nest_lock
)
46 ialias_redirect (omp_test_lock
)
47 ialias_redirect (omp_test_nest_lock
)
49 ialias_redirect (omp_set_dynamic
)
50 ialias_redirect (omp_get_dynamic
)
51 #pragma GCC diagnostic push
52 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
53 ialias_redirect (omp_set_nested
)
54 ialias_redirect (omp_get_nested
)
55 #pragma GCC diagnostic pop
56 ialias_redirect (omp_set_num_threads
)
57 ialias_redirect (omp_in_parallel
)
58 ialias_redirect (omp_get_max_threads
)
59 ialias_redirect (omp_get_num_procs
)
60 ialias_redirect (omp_get_num_threads
)
61 ialias_redirect (omp_get_thread_num
)
62 ialias_redirect (omp_get_wtick
)
63 ialias_redirect (omp_get_wtime
)
64 ialias_redirect (omp_set_schedule
)
65 ialias_redirect (omp_get_schedule
)
66 ialias_redirect (omp_get_thread_limit
)
67 ialias_redirect (omp_set_max_active_levels
)
68 ialias_redirect (omp_get_max_active_levels
)
69 ialias_redirect (omp_get_supported_active_levels
)
70 ialias_redirect (omp_set_num_teams
)
71 ialias_redirect (omp_get_max_teams
)
72 ialias_redirect (omp_set_teams_thread_limit
)
73 ialias_redirect (omp_get_teams_thread_limit
)
74 ialias_redirect (omp_get_level
)
75 ialias_redirect (omp_get_ancestor_thread_num
)
76 ialias_redirect (omp_get_team_size
)
77 ialias_redirect (omp_get_active_level
)
78 ialias_redirect (omp_in_final
)
79 ialias_redirect (omp_get_cancellation
)
80 ialias_redirect (omp_get_proc_bind
)
81 ialias_redirect (omp_get_num_places
)
82 ialias_redirect (omp_get_place_num_procs
)
83 ialias_redirect (omp_get_place_proc_ids
)
84 ialias_redirect (omp_get_place_num
)
85 ialias_redirect (omp_get_partition_num_places
)
86 ialias_redirect (omp_get_partition_place_nums
)
87 ialias_redirect (omp_set_default_device
)
88 ialias_redirect (omp_get_default_device
)
89 ialias_redirect (omp_get_num_devices
)
90 ialias_redirect (omp_get_device_num
)
91 ialias_redirect (omp_get_num_teams
)
92 ialias_redirect (omp_get_team_num
)
93 ialias_redirect (omp_is_initial_device
)
94 ialias_redirect (omp_get_initial_device
)
95 ialias_redirect (omp_get_max_task_priority
)
96 ialias_redirect (omp_pause_resource
)
97 ialias_redirect (omp_pause_resource_all
)
98 ialias_redirect (omp_init_allocator
)
99 ialias_redirect (omp_destroy_allocator
)
100 ialias_redirect (omp_set_default_allocator
)
101 ialias_redirect (omp_get_default_allocator
)
102 ialias_redirect (omp_display_env
)
103 ialias_redirect (omp_fulfill_event
)
106 #ifndef LIBGOMP_GNU_SYMBOL_VERSIONING
107 # define gomp_init_lock__30 omp_init_lock_
108 # define gomp_destroy_lock__30 omp_destroy_lock_
109 # define gomp_set_lock__30 omp_set_lock_
110 # define gomp_unset_lock__30 omp_unset_lock_
111 # define gomp_test_lock__30 omp_test_lock_
112 # define gomp_init_nest_lock__30 omp_init_nest_lock_
113 # define gomp_destroy_nest_lock__30 omp_destroy_nest_lock_
114 # define gomp_set_nest_lock__30 omp_set_nest_lock_
115 # define gomp_unset_nest_lock__30 omp_unset_nest_lock_
116 # define gomp_test_nest_lock__30 omp_test_nest_lock_
120 gomp_init_lock__30 (omp_lock_arg_t lock
)
122 #ifndef OMP_LOCK_DIRECT
123 omp_lock_arg (lock
) = malloc (sizeof (omp_lock_t
));
125 gomp_init_lock_30 (omp_lock_arg (lock
));
129 gomp_init_nest_lock__30 (omp_nest_lock_arg_t lock
)
131 #ifndef OMP_NEST_LOCK_DIRECT
132 omp_nest_lock_arg (lock
) = malloc (sizeof (omp_nest_lock_t
));
134 gomp_init_nest_lock_30 (omp_nest_lock_arg (lock
));
138 gomp_destroy_lock__30 (omp_lock_arg_t lock
)
140 gomp_destroy_lock_30 (omp_lock_arg (lock
));
141 #ifndef OMP_LOCK_DIRECT
142 free (omp_lock_arg (lock
));
143 omp_lock_arg (lock
) = NULL
;
148 gomp_destroy_nest_lock__30 (omp_nest_lock_arg_t lock
)
150 gomp_destroy_nest_lock_30 (omp_nest_lock_arg (lock
));
151 #ifndef OMP_NEST_LOCK_DIRECT
152 free (omp_nest_lock_arg (lock
));
153 omp_nest_lock_arg (lock
) = NULL
;
158 gomp_set_lock__30 (omp_lock_arg_t lock
)
160 gomp_set_lock_30 (omp_lock_arg (lock
));
164 gomp_set_nest_lock__30 (omp_nest_lock_arg_t lock
)
166 gomp_set_nest_lock_30 (omp_nest_lock_arg (lock
));
170 gomp_unset_lock__30 (omp_lock_arg_t lock
)
172 gomp_unset_lock_30 (omp_lock_arg (lock
));
176 gomp_unset_nest_lock__30 (omp_nest_lock_arg_t lock
)
178 gomp_unset_nest_lock_30 (omp_nest_lock_arg (lock
));
182 gomp_test_lock__30 (omp_lock_arg_t lock
)
184 return gomp_test_lock_30 (omp_lock_arg (lock
));
188 gomp_test_nest_lock__30 (omp_nest_lock_arg_t lock
)
190 return gomp_test_nest_lock_30 (omp_nest_lock_arg (lock
));
193 #ifdef LIBGOMP_GNU_SYMBOL_VERSIONING
195 gomp_init_lock__25 (omp_lock_25_arg_t lock
)
197 #ifndef OMP_LOCK_25_DIRECT
198 omp_lock_25_arg (lock
) = malloc (sizeof (omp_lock_25_t
));
200 gomp_init_lock_25 (omp_lock_25_arg (lock
));
204 gomp_init_nest_lock__25 (omp_nest_lock_25_arg_t lock
)
206 #ifndef OMP_NEST_LOCK_25_DIRECT
207 omp_nest_lock_25_arg (lock
) = malloc (sizeof (omp_nest_lock_25_t
));
209 gomp_init_nest_lock_25 (omp_nest_lock_25_arg (lock
));
213 gomp_destroy_lock__25 (omp_lock_25_arg_t lock
)
215 gomp_destroy_lock_25 (omp_lock_25_arg (lock
));
216 #ifndef OMP_LOCK_25_DIRECT
217 free (omp_lock_25_arg (lock
));
218 omp_lock_25_arg (lock
) = NULL
;
223 gomp_destroy_nest_lock__25 (omp_nest_lock_25_arg_t lock
)
225 gomp_destroy_nest_lock_25 (omp_nest_lock_25_arg (lock
));
226 #ifndef OMP_NEST_LOCK_25_DIRECT
227 free (omp_nest_lock_25_arg (lock
));
228 omp_nest_lock_25_arg (lock
) = NULL
;
233 gomp_set_lock__25 (omp_lock_25_arg_t lock
)
235 gomp_set_lock_25 (omp_lock_25_arg (lock
));
239 gomp_set_nest_lock__25 (omp_nest_lock_25_arg_t lock
)
241 gomp_set_nest_lock_25 (omp_nest_lock_25_arg (lock
));
245 gomp_unset_lock__25 (omp_lock_25_arg_t lock
)
247 gomp_unset_lock_25 (omp_lock_25_arg (lock
));
251 gomp_unset_nest_lock__25 (omp_nest_lock_25_arg_t lock
)
253 gomp_unset_nest_lock_25 (omp_nest_lock_25_arg (lock
));
257 gomp_test_lock__25 (omp_lock_25_arg_t lock
)
259 return gomp_test_lock_25 (omp_lock_25_arg (lock
));
263 gomp_test_nest_lock__25 (omp_nest_lock_25_arg_t lock
)
265 return gomp_test_nest_lock_25 (omp_nest_lock_25_arg (lock
));
268 omp_lock_symver (omp_init_lock_
)
269 omp_lock_symver (omp_destroy_lock_
)
270 omp_lock_symver (omp_set_lock_
)
271 omp_lock_symver (omp_unset_lock_
)
272 omp_lock_symver (omp_test_lock_
)
273 omp_lock_symver (omp_init_nest_lock_
)
274 omp_lock_symver (omp_destroy_nest_lock_
)
275 omp_lock_symver (omp_set_nest_lock_
)
276 omp_lock_symver (omp_unset_nest_lock_
)
277 omp_lock_symver (omp_test_nest_lock_
)
280 #define TO_INT(x) ((x) > INT_MIN ? (x) < INT_MAX ? (x) : INT_MAX : INT_MIN)
283 omp_set_dynamic_ (const int32_t *set
)
285 omp_set_dynamic (*set
);
289 omp_set_dynamic_8_ (const int64_t *set
)
291 omp_set_dynamic (!!*set
);
294 #pragma GCC diagnostic push
295 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
297 omp_set_nested_ (const int32_t *set
)
299 omp_set_nested (*set
);
303 omp_set_nested_8_ (const int64_t *set
)
305 omp_set_nested (!!*set
);
307 #pragma GCC diagnostic pop
310 omp_set_num_threads_ (const int32_t *set
)
312 omp_set_num_threads (*set
);
316 omp_set_num_threads_8_ (const int64_t *set
)
318 omp_set_num_threads (TO_INT (*set
));
322 omp_get_dynamic_ (void)
324 return omp_get_dynamic ();
327 #pragma GCC diagnostic push
328 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
330 omp_get_nested_ (void)
332 return omp_get_nested ();
334 #pragma GCC diagnostic pop
337 omp_in_parallel_ (void)
339 return omp_in_parallel ();
343 omp_get_max_threads_ (void)
345 return omp_get_max_threads ();
349 omp_get_num_procs_ (void)
351 return omp_get_num_procs ();
355 omp_get_num_threads_ (void)
357 return omp_get_num_threads ();
361 omp_get_thread_num_ (void)
363 return omp_get_thread_num ();
367 omp_get_wtick_ (void)
369 return omp_get_wtick ();
373 omp_get_wtime_ (void)
375 return omp_get_wtime ();
379 omp_set_schedule_ (const int32_t *kind
, const int32_t *chunk_size
)
381 omp_set_schedule (*kind
, *chunk_size
);
385 omp_set_schedule_8_ (const int32_t *kind
, const int64_t *chunk_size
)
387 omp_set_schedule (*kind
, TO_INT (*chunk_size
));
391 omp_get_schedule_ (int32_t *kind
, int32_t *chunk_size
)
395 omp_get_schedule (&k
, &cs
);
396 /* For now mask off GFS_MONOTONIC, because OpenMP 4.5 code will not
398 *kind
= k
& ~GFS_MONOTONIC
;
403 omp_get_schedule_8_ (int32_t *kind
, int64_t *chunk_size
)
407 omp_get_schedule (&k
, &cs
);
409 *kind
= k
& ~GFS_MONOTONIC
;
414 omp_get_thread_limit_ (void)
416 return omp_get_thread_limit ();
420 omp_set_max_active_levels_ (const int32_t *levels
)
422 omp_set_max_active_levels (*levels
);
426 omp_set_max_active_levels_8_ (const int64_t *levels
)
428 omp_set_max_active_levels (TO_INT (*levels
));
432 omp_get_max_active_levels_ (void)
434 return omp_get_max_active_levels ();
438 omp_get_supported_active_levels_ (void)
440 return omp_get_supported_active_levels ();
444 omp_get_level_ (void)
446 return omp_get_level ();
450 omp_get_ancestor_thread_num_ (const int32_t *level
)
452 return omp_get_ancestor_thread_num (*level
);
456 omp_get_ancestor_thread_num_8_ (const int64_t *level
)
458 return omp_get_ancestor_thread_num (TO_INT (*level
));
462 omp_get_team_size_ (const int32_t *level
)
464 return omp_get_team_size (*level
);
468 omp_get_team_size_8_ (const int64_t *level
)
470 return omp_get_team_size (TO_INT (*level
));
474 omp_get_active_level_ (void)
476 return omp_get_active_level ();
482 return omp_in_final ();
486 omp_set_num_teams_ (const int32_t *num_teams
)
488 omp_set_num_teams (*num_teams
);
492 omp_set_num_teams_8_ (const int64_t *num_teams
)
494 omp_set_max_active_levels (TO_INT (*num_teams
));
498 omp_get_max_teams_ (void)
500 return omp_get_max_teams ();
504 omp_set_teams_thread_limit_ (const int32_t *thread_limit
)
506 omp_set_teams_thread_limit (*thread_limit
);
510 omp_set_teams_thread_limit_8_ (const int64_t *thread_limit
)
512 omp_set_teams_thread_limit (TO_INT (*thread_limit
));
516 omp_get_teams_thread_limit_ (void)
518 return omp_get_teams_thread_limit ();
522 omp_get_cancellation_ (void)
524 return omp_get_cancellation ();
528 omp_get_proc_bind_ (void)
530 return omp_get_proc_bind ();
534 omp_get_num_places_ (void)
536 return omp_get_num_places ();
540 omp_get_place_num_procs_ (const int32_t *place_num
)
542 return omp_get_place_num_procs (*place_num
);
546 omp_get_place_num_procs_8_ (const int64_t *place_num
)
548 return omp_get_place_num_procs (TO_INT (*place_num
));
552 omp_get_place_proc_ids_ (const int32_t *place_num
, int32_t *ids
)
554 omp_get_place_proc_ids (*place_num
, (int *) ids
);
558 omp_get_place_proc_ids_8_ (const int64_t *place_num
, int64_t *ids
)
560 gomp_get_place_proc_ids_8 (TO_INT (*place_num
), ids
);
564 omp_get_place_num_ (void)
566 return omp_get_place_num ();
570 omp_get_partition_num_places_ (void)
572 return omp_get_partition_num_places ();
576 omp_get_partition_place_nums_ (int32_t *place_nums
)
578 omp_get_partition_place_nums ((int *) place_nums
);
582 omp_get_partition_place_nums_8_ (int64_t *place_nums
)
584 if (gomp_places_list
== NULL
)
587 struct gomp_thread
*thr
= gomp_thread ();
589 gomp_init_affinity ();
592 for (i
= 0; i
< thr
->ts
.place_partition_len
; i
++)
593 *place_nums
++ = (int64_t) thr
->ts
.place_partition_off
+ i
;
597 omp_set_default_device_ (const int32_t *device_num
)
599 return omp_set_default_device (*device_num
);
603 omp_set_default_device_8_ (const int64_t *device_num
)
605 return omp_set_default_device (TO_INT (*device_num
));
609 omp_get_default_device_ (void)
611 return omp_get_default_device ();
615 omp_get_num_devices_ (void)
617 return omp_get_num_devices ();
621 omp_get_num_teams_ (void)
623 return omp_get_num_teams ();
627 omp_get_team_num_ (void)
629 return omp_get_team_num ();
633 omp_is_initial_device_ (void)
635 return omp_is_initial_device ();
639 omp_get_initial_device_ (void)
641 return omp_get_initial_device ();
645 omp_get_device_num_ (void)
647 return omp_get_device_num ();
651 omp_get_max_task_priority_ (void)
653 return omp_get_max_task_priority ();
657 omp_fulfill_event_ (intptr_t event
)
659 omp_fulfill_event ((omp_event_handle_t
) event
);
663 omp_set_affinity_format_ (const char *format
, size_t format_len
)
665 gomp_set_affinity_format (format
, format_len
);
669 omp_get_affinity_format_ (char *buffer
, size_t buffer_len
)
671 size_t len
= strlen (gomp_affinity_format_var
);
674 if (len
< buffer_len
)
676 memcpy (buffer
, gomp_affinity_format_var
, len
);
677 memset (buffer
+ len
, ' ', buffer_len
- len
);
680 memcpy (buffer
, gomp_affinity_format_var
, buffer_len
);
686 omp_display_affinity_ (const char *format
, size_t format_len
)
688 char *fmt
= NULL
, fmt_buf
[256];
692 fmt
= format_len
< 256 ? fmt_buf
: gomp_malloc (format_len
+ 1);
693 memcpy (fmt
, format
, format_len
);
694 fmt
[format_len
] = '\0';
696 struct gomp_thread
*thr
= gomp_thread ();
698 = gomp_display_affinity (buf
, sizeof buf
,
699 format_len
? fmt
: gomp_affinity_format_var
,
700 gomp_thread_self (), &thr
->ts
, thr
->place
);
701 if (ret
< sizeof buf
)
704 gomp_print_string (buf
, ret
+ 1);
708 char *b
= gomp_malloc (ret
+ 1);
709 gomp_display_affinity (buf
, sizeof buf
,
710 format_len
? fmt
: gomp_affinity_format_var
,
711 gomp_thread_self (), &thr
->ts
, thr
->place
);
713 gomp_print_string (b
, ret
+ 1);
716 if (fmt
&& fmt
!= fmt_buf
)
721 omp_capture_affinity_ (char *buffer
, const char *format
,
722 size_t buffer_len
, size_t format_len
)
724 char *fmt
= NULL
, fmt_buf
[256];
727 fmt
= format_len
< 256 ? fmt_buf
: gomp_malloc (format_len
+ 1);
728 memcpy (fmt
, format
, format_len
);
729 fmt
[format_len
] = '\0';
731 struct gomp_thread
*thr
= gomp_thread ();
733 = gomp_display_affinity (buffer
, buffer_len
,
734 format_len
? fmt
: gomp_affinity_format_var
,
735 gomp_thread_self (), &thr
->ts
, thr
->place
);
736 if (fmt
&& fmt
!= fmt_buf
)
738 if (ret
< buffer_len
)
739 memset (buffer
+ ret
, ' ', buffer_len
- ret
);
744 omp_pause_resource_ (const int32_t *kind
, const int32_t *device_num
)
746 return omp_pause_resource (*kind
, *device_num
);
750 omp_pause_resource_all_ (const int32_t *kind
)
752 return omp_pause_resource_all (*kind
);
756 omp_init_allocator_ (const intptr_t *memspace
, const int32_t *ntraits
,
757 const omp_alloctrait_t
*traits
)
759 return (intptr_t) omp_init_allocator ((omp_memspace_handle_t
) *memspace
,
760 (int) *ntraits
, traits
);
764 omp_init_allocator_8_ (const intptr_t *memspace
, const int64_t *ntraits
,
765 const omp_alloctrait_t
*traits
)
767 return (intptr_t) omp_init_allocator ((omp_memspace_handle_t
) *memspace
,
768 (int) *ntraits
, traits
);
772 omp_destroy_allocator_ (const intptr_t *allocator
)
774 omp_destroy_allocator ((omp_allocator_handle_t
) *allocator
);
778 omp_set_default_allocator_ (const intptr_t *allocator
)
780 omp_set_default_allocator ((omp_allocator_handle_t
) *allocator
);
784 omp_get_default_allocator_ ()
786 return (intptr_t) omp_get_default_allocator ();
789 #ifndef LIBGOMP_OFFLOADED_ONLY
792 omp_display_env_ (const int32_t *verbose
)
794 omp_display_env (*verbose
);
798 omp_display_env_8_ (const int64_t *verbose
)
800 omp_display_env (!!*verbose
);
803 #endif /* LIBGOMP_OFFLOADED_ONLY */