123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- /* Copyright (C) 2005-2022 Free Software Foundation, Inc.
- Contributed by Richard Henderson <rth@redhat.com>.
- This file is part of the GNU Offloading and Multi Processing Library
- (libgomp).
- Libgomp is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
- Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- more details.
- Under Section 7 of GPL version 3, you are granted additional
- permissions described in the GCC Runtime Library Exception, version
- 3.1, as published by the Free Software Foundation.
- You should have received a copy of the GNU General Public License and
- a copy of the GCC Runtime Library Exception along with this program;
- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
- <http://www.gnu.org/licenses/>. */
- /* This file defines the OpenMP API entry points that operate on internal
- control variables. */
- #include "libgomp.h"
- #include "gomp-constants.h"
- #include <limits.h>
- ialias_redirect (omp_get_active_level)
- void
- omp_set_num_threads (int n)
- {
- struct gomp_task_icv *icv = gomp_icv (true);
- icv->nthreads_var = (n > 0 ? n : 1);
- }
- void
- omp_set_dynamic (int val)
- {
- struct gomp_task_icv *icv = gomp_icv (true);
- icv->dyn_var = val;
- }
- int
- omp_get_dynamic (void)
- {
- struct gomp_task_icv *icv = gomp_icv (false);
- return icv->dyn_var;
- }
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- void
- omp_set_nested (int val)
- {
- struct gomp_task_icv *icv = gomp_icv (true);
- if (val)
- icv->max_active_levels_var = gomp_supported_active_levels;
- else if (icv->max_active_levels_var > 1)
- icv->max_active_levels_var = 1;
- }
- int
- omp_get_nested (void)
- {
- struct gomp_task_icv *icv = gomp_icv (false);
- return (icv->max_active_levels_var > 1
- && icv->max_active_levels_var > omp_get_active_level ());
- }
- #pragma GCC diagnostic pop
- void
- omp_set_schedule (omp_sched_t kind, int chunk_size)
- {
- struct gomp_task_icv *icv = gomp_icv (true);
- switch (kind & ~omp_sched_monotonic)
- {
- case omp_sched_static:
- if (chunk_size < 1)
- chunk_size = 0;
- icv->run_sched_chunk_size = chunk_size;
- break;
- case omp_sched_dynamic:
- case omp_sched_guided:
- if (chunk_size < 1)
- chunk_size = 1;
- icv->run_sched_chunk_size = chunk_size;
- break;
- case omp_sched_auto:
- break;
- default:
- return;
- }
- icv->run_sched_var = kind;
- }
- void
- omp_get_schedule (omp_sched_t *kind, int *chunk_size)
- {
- struct gomp_task_icv *icv = gomp_icv (false);
- *kind = icv->run_sched_var;
- *chunk_size = icv->run_sched_chunk_size;
- }
- int
- omp_get_max_threads (void)
- {
- struct gomp_task_icv *icv = gomp_icv (false);
- return icv->nthreads_var;
- }
- int
- omp_get_thread_limit (void)
- {
- struct gomp_task_icv *icv = gomp_icv (false);
- return icv->thread_limit_var > INT_MAX ? INT_MAX : icv->thread_limit_var;
- }
- void
- omp_set_max_active_levels (int max_levels)
- {
- if (max_levels >= 0)
- {
- struct gomp_task_icv *icv = gomp_icv (true);
- if (max_levels <= gomp_supported_active_levels)
- icv->max_active_levels_var = max_levels;
- else
- icv->max_active_levels_var = gomp_supported_active_levels;
- }
- }
- int
- omp_get_max_active_levels (void)
- {
- struct gomp_task_icv *icv = gomp_icv (false);
- return icv->max_active_levels_var;
- }
- int
- omp_get_supported_active_levels (void)
- {
- return gomp_supported_active_levels;
- }
- void
- omp_set_num_teams (int num_teams)
- {
- if (num_teams >= 0)
- gomp_nteams_var = num_teams;
- }
- int
- omp_get_max_teams (void)
- {
- return gomp_nteams_var;
- }
- void
- omp_set_teams_thread_limit (int thread_limit)
- {
- if (thread_limit >= 0)
- gomp_teams_thread_limit_var = thread_limit;
- }
- int
- omp_get_teams_thread_limit (void)
- {
- return gomp_teams_thread_limit_var;
- }
- int
- omp_get_cancellation (void)
- {
- return gomp_cancel_var;
- }
- int
- omp_get_max_task_priority (void)
- {
- return gomp_max_task_priority_var;
- }
- omp_proc_bind_t
- omp_get_proc_bind (void)
- {
- struct gomp_task_icv *icv = gomp_icv (false);
- return icv->bind_var;
- }
- int
- omp_get_num_places (void)
- {
- return gomp_places_list_len;
- }
- int
- omp_get_place_num (void)
- {
- if (gomp_places_list == NULL)
- return -1;
- struct gomp_thread *thr = gomp_thread ();
- if (thr->place == 0)
- gomp_init_affinity ();
- return (int) thr->place - 1;
- }
- int
- omp_get_partition_num_places (void)
- {
- if (gomp_places_list == NULL)
- return 0;
- struct gomp_thread *thr = gomp_thread ();
- if (thr->place == 0)
- gomp_init_affinity ();
- return thr->ts.place_partition_len;
- }
- void
- omp_get_partition_place_nums (int *place_nums)
- {
- if (gomp_places_list == NULL)
- return;
- struct gomp_thread *thr = gomp_thread ();
- if (thr->place == 0)
- gomp_init_affinity ();
- unsigned int i;
- for (i = 0; i < thr->ts.place_partition_len; i++)
- *place_nums++ = thr->ts.place_partition_off + i;
- }
- void
- omp_set_default_allocator (omp_allocator_handle_t allocator)
- {
- struct gomp_thread *thr = gomp_thread ();
- if (allocator == omp_null_allocator)
- allocator = omp_default_mem_alloc;
- thr->ts.def_allocator = (uintptr_t) allocator;
- }
- omp_allocator_handle_t
- omp_get_default_allocator (void)
- {
- struct gomp_thread *thr = gomp_thread ();
- if (thr->ts.def_allocator == omp_null_allocator)
- return (omp_allocator_handle_t) gomp_def_allocator;
- else
- return (omp_allocator_handle_t) thr->ts.def_allocator;
- }
- ialias (omp_set_dynamic)
- ialias (omp_get_dynamic)
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- ialias (omp_set_nested)
- ialias (omp_get_nested)
- #pragma GCC diagnostic pop
- ialias (omp_set_num_threads)
- ialias (omp_set_schedule)
- ialias (omp_get_schedule)
- ialias (omp_get_max_threads)
- ialias (omp_get_thread_limit)
- ialias (omp_set_max_active_levels)
- ialias (omp_get_max_active_levels)
- ialias (omp_get_supported_active_levels)
- ialias (omp_set_num_teams)
- ialias (omp_get_max_teams)
- ialias (omp_set_teams_thread_limit)
- ialias (omp_get_teams_thread_limit)
- ialias (omp_get_cancellation)
- ialias (omp_get_proc_bind)
- ialias (omp_get_max_task_priority)
- ialias (omp_get_num_places)
- ialias (omp_get_place_num)
- ialias (omp_get_partition_num_places)
- ialias (omp_get_partition_place_nums)
- ialias (omp_set_default_allocator)
- ialias (omp_get_default_allocator)
|