1 /* Copyright (C) 2005-2020 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_get_level
)
71 ialias_redirect (omp_get_ancestor_thread_num
)
72 ialias_redirect (omp_get_team_size
)
73 ialias_redirect (omp_get_active_level
)
74 ialias_redirect (omp_in_final
)
75 ialias_redirect (omp_get_cancellation
)
76 ialias_redirect (omp_get_proc_bind
)
77 ialias_redirect (omp_get_num_places
)
78 ialias_redirect (omp_get_place_num_procs
)
79 ialias_redirect (omp_get_place_proc_ids
)
80 ialias_redirect (omp_get_place_num
)
81 ialias_redirect (omp_get_partition_num_places
)
82 ialias_redirect (omp_get_partition_place_nums
)
83 ialias_redirect (omp_set_default_device
)
84 ialias_redirect (omp_get_default_device
)
85 ialias_redirect (omp_get_num_devices
)
86 ialias_redirect (omp_get_num_teams
)
87 ialias_redirect (omp_get_team_num
)
88 ialias_redirect (omp_is_initial_device
)
89 ialias_redirect (omp_get_initial_device
)
90 ialias_redirect (omp_get_max_task_priority
)
91 ialias_redirect (omp_pause_resource
)
92 ialias_redirect (omp_pause_resource_all
)
93 ialias_redirect (omp_init_allocator
)
94 ialias_redirect (omp_destroy_allocator
)
95 ialias_redirect (omp_set_default_allocator
)
96 ialias_redirect (omp_get_default_allocator
)
99 #ifndef LIBGOMP_GNU_SYMBOL_VERSIONING
100 # define gomp_init_lock__30 omp_init_lock_
101 # define gomp_destroy_lock__30 omp_destroy_lock_
102 # define gomp_set_lock__30 omp_set_lock_
103 # define gomp_unset_lock__30 omp_unset_lock_
104 # define gomp_test_lock__30 omp_test_lock_
105 # define gomp_init_nest_lock__30 omp_init_nest_lock_
106 # define gomp_destroy_nest_lock__30 omp_destroy_nest_lock_
107 # define gomp_set_nest_lock__30 omp_set_nest_lock_
108 # define gomp_unset_nest_lock__30 omp_unset_nest_lock_
109 # define gomp_test_nest_lock__30 omp_test_nest_lock_
113 gomp_init_lock__30 (omp_lock_arg_t lock
)
115 #ifndef OMP_LOCK_DIRECT
116 omp_lock_arg (lock
) = malloc (sizeof (omp_lock_t
));
118 gomp_init_lock_30 (omp_lock_arg (lock
));
122 gomp_init_nest_lock__30 (omp_nest_lock_arg_t lock
)
124 #ifndef OMP_NEST_LOCK_DIRECT
125 omp_nest_lock_arg (lock
) = malloc (sizeof (omp_nest_lock_t
));
127 gomp_init_nest_lock_30 (omp_nest_lock_arg (lock
));
131 gomp_destroy_lock__30 (omp_lock_arg_t lock
)
133 gomp_destroy_lock_30 (omp_lock_arg (lock
));
134 #ifndef OMP_LOCK_DIRECT
135 free (omp_lock_arg (lock
));
136 omp_lock_arg (lock
) = NULL
;
141 gomp_destroy_nest_lock__30 (omp_nest_lock_arg_t lock
)
143 gomp_destroy_nest_lock_30 (omp_nest_lock_arg (lock
));
144 #ifndef OMP_NEST_LOCK_DIRECT
145 free (omp_nest_lock_arg (lock
));
146 omp_nest_lock_arg (lock
) = NULL
;
151 gomp_set_lock__30 (omp_lock_arg_t lock
)
153 gomp_set_lock_30 (omp_lock_arg (lock
));
157 gomp_set_nest_lock__30 (omp_nest_lock_arg_t lock
)
159 gomp_set_nest_lock_30 (omp_nest_lock_arg (lock
));
163 gomp_unset_lock__30 (omp_lock_arg_t lock
)
165 gomp_unset_lock_30 (omp_lock_arg (lock
));
169 gomp_unset_nest_lock__30 (omp_nest_lock_arg_t lock
)
171 gomp_unset_nest_lock_30 (omp_nest_lock_arg (lock
));
175 gomp_test_lock__30 (omp_lock_arg_t lock
)
177 return gomp_test_lock_30 (omp_lock_arg (lock
));
181 gomp_test_nest_lock__30 (omp_nest_lock_arg_t lock
)
183 return gomp_test_nest_lock_30 (omp_nest_lock_arg (lock
));
186 #ifdef LIBGOMP_GNU_SYMBOL_VERSIONING
188 gomp_init_lock__25 (omp_lock_25_arg_t lock
)
190 #ifndef OMP_LOCK_25_DIRECT
191 omp_lock_25_arg (lock
) = malloc (sizeof (omp_lock_25_t
));
193 gomp_init_lock_25 (omp_lock_25_arg (lock
));
197 gomp_init_nest_lock__25 (omp_nest_lock_25_arg_t lock
)
199 #ifndef OMP_NEST_LOCK_25_DIRECT
200 omp_nest_lock_25_arg (lock
) = malloc (sizeof (omp_nest_lock_25_t
));
202 gomp_init_nest_lock_25 (omp_nest_lock_25_arg (lock
));
206 gomp_destroy_lock__25 (omp_lock_25_arg_t lock
)
208 gomp_destroy_lock_25 (omp_lock_25_arg (lock
));
209 #ifndef OMP_LOCK_25_DIRECT
210 free (omp_lock_25_arg (lock
));
211 omp_lock_25_arg (lock
) = NULL
;
216 gomp_destroy_nest_lock__25 (omp_nest_lock_25_arg_t lock
)
218 gomp_destroy_nest_lock_25 (omp_nest_lock_25_arg (lock
));
219 #ifndef OMP_NEST_LOCK_25_DIRECT
220 free (omp_nest_lock_25_arg (lock
));
221 omp_nest_lock_25_arg (lock
) = NULL
;
226 gomp_set_lock__25 (omp_lock_25_arg_t lock
)
228 gomp_set_lock_25 (omp_lock_25_arg (lock
));
232 gomp_set_nest_lock__25 (omp_nest_lock_25_arg_t lock
)
234 gomp_set_nest_lock_25 (omp_nest_lock_25_arg (lock
));
238 gomp_unset_lock__25 (omp_lock_25_arg_t lock
)
240 gomp_unset_lock_25 (omp_lock_25_arg (lock
));
244 gomp_unset_nest_lock__25 (omp_nest_lock_25_arg_t lock
)
246 gomp_unset_nest_lock_25 (omp_nest_lock_25_arg (lock
));
250 gomp_test_lock__25 (omp_lock_25_arg_t lock
)
252 return gomp_test_lock_25 (omp_lock_25_arg (lock
));
256 gomp_test_nest_lock__25 (omp_nest_lock_25_arg_t lock
)
258 return gomp_test_nest_lock_25 (omp_nest_lock_25_arg (lock
));
261 omp_lock_symver (omp_init_lock_
)
262 omp_lock_symver (omp_destroy_lock_
)
263 omp_lock_symver (omp_set_lock_
)
264 omp_lock_symver (omp_unset_lock_
)
265 omp_lock_symver (omp_test_lock_
)
266 omp_lock_symver (omp_init_nest_lock_
)
267 omp_lock_symver (omp_destroy_nest_lock_
)
268 omp_lock_symver (omp_set_nest_lock_
)
269 omp_lock_symver (omp_unset_nest_lock_
)
270 omp_lock_symver (omp_test_nest_lock_
)
273 #define TO_INT(x) ((x) > INT_MIN ? (x) < INT_MAX ? (x) : INT_MAX : INT_MIN)
276 omp_set_dynamic_ (const int32_t *set
)
278 omp_set_dynamic (*set
);
282 omp_set_dynamic_8_ (const int64_t *set
)
284 omp_set_dynamic (!!*set
);
287 #pragma GCC diagnostic push
288 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
290 omp_set_nested_ (const int32_t *set
)
292 omp_set_nested (*set
);
296 omp_set_nested_8_ (const int64_t *set
)
298 omp_set_nested (!!*set
);
300 #pragma GCC diagnostic pop
303 omp_set_num_threads_ (const int32_t *set
)
305 omp_set_num_threads (*set
);
309 omp_set_num_threads_8_ (const int64_t *set
)
311 omp_set_num_threads (TO_INT (*set
));
315 omp_get_dynamic_ (void)
317 return omp_get_dynamic ();
320 #pragma GCC diagnostic push
321 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
323 omp_get_nested_ (void)
325 return omp_get_nested ();
327 #pragma GCC diagnostic pop
330 omp_in_parallel_ (void)
332 return omp_in_parallel ();
336 omp_get_max_threads_ (void)
338 return omp_get_max_threads ();
342 omp_get_num_procs_ (void)
344 return omp_get_num_procs ();
348 omp_get_num_threads_ (void)
350 return omp_get_num_threads ();
354 omp_get_thread_num_ (void)
356 return omp_get_thread_num ();
360 omp_get_wtick_ (void)
362 return omp_get_wtick ();
366 omp_get_wtime_ (void)
368 return omp_get_wtime ();
372 omp_set_schedule_ (const int32_t *kind
, const int32_t *chunk_size
)
374 omp_set_schedule (*kind
, *chunk_size
);
378 omp_set_schedule_8_ (const int32_t *kind
, const int64_t *chunk_size
)
380 omp_set_schedule (*kind
, TO_INT (*chunk_size
));
384 omp_get_schedule_ (int32_t *kind
, int32_t *chunk_size
)
388 omp_get_schedule (&k
, &cs
);
389 /* For now mask off GFS_MONOTONIC, because OpenMP 4.5 code will not
391 *kind
= k
& ~GFS_MONOTONIC
;
396 omp_get_schedule_8_ (int32_t *kind
, int64_t *chunk_size
)
400 omp_get_schedule (&k
, &cs
);
402 *kind
= k
& ~GFS_MONOTONIC
;
407 omp_get_thread_limit_ (void)
409 return omp_get_thread_limit ();
413 omp_set_max_active_levels_ (const int32_t *levels
)
415 omp_set_max_active_levels (*levels
);
419 omp_set_max_active_levels_8_ (const int64_t *levels
)
421 omp_set_max_active_levels (TO_INT (*levels
));
425 omp_get_max_active_levels_ (void)
427 return omp_get_max_active_levels ();
431 omp_get_supported_active_levels_ (void)
433 return omp_get_supported_active_levels ();
437 omp_get_level_ (void)
439 return omp_get_level ();
443 omp_get_ancestor_thread_num_ (const int32_t *level
)
445 return omp_get_ancestor_thread_num (*level
);
449 omp_get_ancestor_thread_num_8_ (const int64_t *level
)
451 return omp_get_ancestor_thread_num (TO_INT (*level
));
455 omp_get_team_size_ (const int32_t *level
)
457 return omp_get_team_size (*level
);
461 omp_get_team_size_8_ (const int64_t *level
)
463 return omp_get_team_size (TO_INT (*level
));
467 omp_get_active_level_ (void)
469 return omp_get_active_level ();
475 return omp_in_final ();
479 omp_get_cancellation_ (void)
481 return omp_get_cancellation ();
485 omp_get_proc_bind_ (void)
487 return omp_get_proc_bind ();
491 omp_get_num_places_ (void)
493 return omp_get_num_places ();
497 omp_get_place_num_procs_ (const int32_t *place_num
)
499 return omp_get_place_num_procs (*place_num
);
503 omp_get_place_num_procs_8_ (const int64_t *place_num
)
505 return omp_get_place_num_procs (TO_INT (*place_num
));
509 omp_get_place_proc_ids_ (const int32_t *place_num
, int32_t *ids
)
511 omp_get_place_proc_ids (*place_num
, (int *) ids
);
515 omp_get_place_proc_ids_8_ (const int64_t *place_num
, int64_t *ids
)
517 gomp_get_place_proc_ids_8 (TO_INT (*place_num
), ids
);
521 omp_get_place_num_ (void)
523 return omp_get_place_num ();
527 omp_get_partition_num_places_ (void)
529 return omp_get_partition_num_places ();
533 omp_get_partition_place_nums_ (int32_t *place_nums
)
535 omp_get_partition_place_nums ((int *) place_nums
);
539 omp_get_partition_place_nums_8_ (int64_t *place_nums
)
541 if (gomp_places_list
== NULL
)
544 struct gomp_thread
*thr
= gomp_thread ();
546 gomp_init_affinity ();
549 for (i
= 0; i
< thr
->ts
.place_partition_len
; i
++)
550 *place_nums
++ = (int64_t) thr
->ts
.place_partition_off
+ i
;
554 omp_set_default_device_ (const int32_t *device_num
)
556 return omp_set_default_device (*device_num
);
560 omp_set_default_device_8_ (const int64_t *device_num
)
562 return omp_set_default_device (TO_INT (*device_num
));
566 omp_get_default_device_ (void)
568 return omp_get_default_device ();
572 omp_get_num_devices_ (void)
574 return omp_get_num_devices ();
578 omp_get_num_teams_ (void)
580 return omp_get_num_teams ();
584 omp_get_team_num_ (void)
586 return omp_get_team_num ();
590 omp_is_initial_device_ (void)
592 return omp_is_initial_device ();
596 omp_get_initial_device_ (void)
598 return omp_get_initial_device ();
602 omp_get_max_task_priority_ (void)
604 return omp_get_max_task_priority ();
608 omp_set_affinity_format_ (const char *format
, size_t format_len
)
610 gomp_set_affinity_format (format
, format_len
);
614 omp_get_affinity_format_ (char *buffer
, size_t buffer_len
)
616 size_t len
= strlen (gomp_affinity_format_var
);
619 if (len
< buffer_len
)
621 memcpy (buffer
, gomp_affinity_format_var
, len
);
622 memset (buffer
+ len
, ' ', buffer_len
- len
);
625 memcpy (buffer
, gomp_affinity_format_var
, buffer_len
);
631 omp_display_affinity_ (const char *format
, size_t format_len
)
633 char *fmt
= NULL
, fmt_buf
[256];
637 fmt
= format_len
< 256 ? fmt_buf
: gomp_malloc (format_len
+ 1);
638 memcpy (fmt
, format
, format_len
);
639 fmt
[format_len
] = '\0';
641 struct gomp_thread
*thr
= gomp_thread ();
643 = gomp_display_affinity (buf
, sizeof buf
,
644 format_len
? fmt
: gomp_affinity_format_var
,
645 gomp_thread_self (), &thr
->ts
, thr
->place
);
646 if (ret
< sizeof buf
)
649 gomp_print_string (buf
, ret
+ 1);
653 char *b
= gomp_malloc (ret
+ 1);
654 gomp_display_affinity (buf
, sizeof buf
,
655 format_len
? fmt
: gomp_affinity_format_var
,
656 gomp_thread_self (), &thr
->ts
, thr
->place
);
658 gomp_print_string (b
, ret
+ 1);
661 if (fmt
&& fmt
!= fmt_buf
)
666 omp_capture_affinity_ (char *buffer
, const char *format
,
667 size_t buffer_len
, size_t format_len
)
669 char *fmt
= NULL
, fmt_buf
[256];
672 fmt
= format_len
< 256 ? fmt_buf
: gomp_malloc (format_len
+ 1);
673 memcpy (fmt
, format
, format_len
);
674 fmt
[format_len
] = '\0';
676 struct gomp_thread
*thr
= gomp_thread ();
678 = gomp_display_affinity (buffer
, buffer_len
,
679 format_len
? fmt
: gomp_affinity_format_var
,
680 gomp_thread_self (), &thr
->ts
, thr
->place
);
681 if (fmt
&& fmt
!= fmt_buf
)
683 if (ret
< buffer_len
)
684 memset (buffer
+ ret
, ' ', buffer_len
- ret
);
689 omp_pause_resource_ (const int32_t *kind
, const int32_t *device_num
)
691 return omp_pause_resource (*kind
, *device_num
);
695 omp_pause_resource_all_ (const int32_t *kind
)
697 return omp_pause_resource_all (*kind
);
701 omp_init_allocator_ (const intptr_t *memspace
, const int32_t *ntraits
,
702 const omp_alloctrait_t
*traits
)
704 return (intptr_t) omp_init_allocator ((omp_memspace_handle_t
) *memspace
,
705 (int) *ntraits
, traits
);
709 omp_init_allocator_8_ (const intptr_t *memspace
, const int64_t *ntraits
,
710 const omp_alloctrait_t
*traits
)
712 return (intptr_t) omp_init_allocator ((omp_memspace_handle_t
) *memspace
,
713 (int) *ntraits
, traits
);
717 omp_destroy_allocator_ (const intptr_t *allocator
)
719 omp_destroy_allocator ((omp_allocator_handle_t
) *allocator
);
723 omp_set_default_allocator_ (const intptr_t *allocator
)
725 omp_set_default_allocator ((omp_allocator_handle_t
) *allocator
);
729 omp_get_default_allocator_ ()
731 return (intptr_t) omp_get_default_allocator ();