3749c3aff6
This patch avoids the following relocations: readelf -Wr libgomp.so.1.0.0 | grep omp_ 00000000000470e0 0000020700000007 R_X86_64_JUMP_SLOT 000000000001d9d0 omp_fulfill_event@@OMP_5.0.1 + 0 0000000000047170 000000b800000007 R_X86_64_JUMP_SLOT 000000000000e760 omp_display_env@@OMP_5.1 + 0 00000000000471e0 000000e800000007 R_X86_64_JUMP_SLOT 000000000000f910 omp_get_initial_device@@OMP_4.5 + 0 0000000000047280 0000019500000007 R_X86_64_JUMP_SLOT 0000000000015940 omp_get_active_level@@OMP_3.0 + 0 00000000000472c8 0000020d00000007 R_X86_64_JUMP_SLOT 0000000000035210 omp_get_team_num@@OMP_4.0 + 0 00000000000472f0 0000014700000007 R_X86_64_JUMP_SLOT 0000000000035200 omp_get_num_teams@@OMP_4.0 + 0 by using ialias{,_call,_redirect} macros as needed. We still have many acc_* PLT relocations, could somebody please fix those? readelf -Wr libgomp.so.1.0.0 | grep acc_ 0000000000046fb8 000001ed00000006 R_X86_64_GLOB_DAT 0000000000036350 acc_prof_unregister@@OACC_2.5.1 + 0 0000000000046fd8 000000a400000006 R_X86_64_GLOB_DAT 0000000000035f30 acc_prof_register@@OACC_2.5.1 + 0 0000000000046fe0 000001d100000006 R_X86_64_GLOB_DAT 0000000000035ee0 acc_prof_lookup@@OACC_2.5.1 + 0 0000000000047058 000001dd00000007 R_X86_64_JUMP_SLOT 0000000000031f40 acc_create_async@@OACC_2.5 + 0 0000000000047068 0000011500000007 R_X86_64_JUMP_SLOT 000000000002fc60 acc_get_property@@OACC_2.6 + 0 0000000000047070 000001fb00000007 R_X86_64_JUMP_SLOT 0000000000032ce0 acc_wait_all@@OACC_2.0 + 0 0000000000047080 0000006500000007 R_X86_64_JUMP_SLOT 000000000002f990 acc_on_device@@OACC_2.0 + 0 0000000000047088 000000ae00000007 R_X86_64_JUMP_SLOT 0000000000032140 acc_attach_async@@OACC_2.6 + 0 0000000000047090 0000021900000007 R_X86_64_JUMP_SLOT 000000000002f550 acc_get_device_type@@OACC_2.0 + 0 0000000000047098 000001cb00000007 R_X86_64_JUMP_SLOT 0000000000032090 acc_copyout_finalize@@OACC_2.5 + 0 00000000000470a8 0000005200000007 R_X86_64_JUMP_SLOT 0000000000031f80 acc_copyin@@OACC_2.0 + 0 00000000000470b8 000001ad00000007 R_X86_64_JUMP_SLOT 0000000000032030 acc_delete_finalize@@OACC_2.5 + 0 00000000000470e8 0000010900000007 R_X86_64_JUMP_SLOT 0000000000031f00 acc_create@@OACC_2.0 + 0 00000000000470f8 0000005900000007 R_X86_64_JUMP_SLOT 0000000000032b70 acc_wait_async@@OACC_2.0 + 0 0000000000047110 0000013100000007 R_X86_64_JUMP_SLOT 0000000000032860 acc_async_test@@OACC_2.0 + 0 0000000000047118 000001ff00000007 R_X86_64_JUMP_SLOT 000000000002f720 acc_get_device_num@@OACC_2.0 + 0 0000000000047128 0000019100000007 R_X86_64_JUMP_SLOT 0000000000032020 acc_delete_async@@OACC_2.5 + 0 0000000000047130 000001d200000007 R_X86_64_JUMP_SLOT 000000000002efa0 acc_shutdown@@OACC_2.0 + 0 0000000000047150 000000d000000007 R_X86_64_JUMP_SLOT 0000000000031f00 acc_present_or_create@@OACC_2.0 + 0 0000000000047188 0000019200000007 R_X86_64_JUMP_SLOT 0000000000031910 acc_is_present@@OACC_2.0 + 0 0000000000047190 000001aa00000007 R_X86_64_JUMP_SLOT 000000000002fca0 acc_get_property_string@@OACC_2.6 + 0 00000000000471d0 000001bf00000007 R_X86_64_JUMP_SLOT 0000000000032120 acc_update_self_async@@OACC_2.5 + 0 0000000000047200 0000020500000007 R_X86_64_JUMP_SLOT 0000000000032e00 acc_wait_all_async@@OACC_2.0 + 0 0000000000047208 000000a600000007 R_X86_64_JUMP_SLOT 0000000000031790 acc_deviceptr@@OACC_2.0 + 0 0000000000047218 0000007500000007 R_X86_64_JUMP_SLOT 0000000000032000 acc_delete@@OACC_2.0 + 0 0000000000047238 000001e900000007 R_X86_64_JUMP_SLOT 000000000002f3a0 acc_set_device_type@@OACC_2.0 + 0 0000000000047240 000001f600000007 R_X86_64_JUMP_SLOT 000000000002ef20 acc_init@@OACC_2.0 + 0 0000000000047248 0000018800000007 R_X86_64_JUMP_SLOT 0000000000032060 acc_copyout@@OACC_2.0 + 0 0000000000047258 0000021f00000007 R_X86_64_JUMP_SLOT 0000000000032a80 acc_wait@@OACC_2.0 + 0 0000000000047270 000001bc00000007 R_X86_64_JUMP_SLOT 0000000000032100 acc_update_self@@OACC_2.0 + 0 0000000000047288 0000011400000007 R_X86_64_JUMP_SLOT 0000000000032080 acc_copyout_async@@OACC_2.5 + 0 0000000000047290 0000013d00000007 R_X86_64_JUMP_SLOT 000000000002f850 acc_set_device_num@@OACC_2.0 + 0 00000000000472a8 000000c500000007 R_X86_64_JUMP_SLOT 00000000000320e0 acc_update_device_async@@OACC_2.5 + 0 00000000000472c0 0000014600000007 R_X86_64_JUMP_SLOT 0000000000031fc0 acc_copyin_async@@OACC_2.5 + 0 00000000000472f8 0000006a00000007 R_X86_64_JUMP_SLOT 000000000002f310 acc_get_num_devices@@OACC_2.0 + 0 0000000000047350 0000021700000007 R_X86_64_JUMP_SLOT 0000000000031f80 acc_present_or_copyin@@OACC_2.0 + 0 0000000000047360 0000020900000007 R_X86_64_JUMP_SLOT 00000000000320c0 acc_update_device@@OACC_2.0 + 0 0000000000047380 0000008400000007 R_X86_64_JUMP_SLOT 0000000000032950 acc_async_test_all@@OACC_2.0 + 0 2021-10-01 Jakub Jelinek <jakub@redhat.com> * affinity-fmt.c (omp_get_team_num, omp_get_num_teams): Add ialias_redirect. * env.c (handle_omp_display_env): Use ialias_call. * icv-device.c: Move ialias right below each function. (omp_get_device_num): Use ialias_call. * fortran.c (omp_fulfill_event): Add ialias_redirect. * icv.c (omp_get_active_level): Add ialias_redirect.
260 lines
5.9 KiB
C
260 lines
5.9 KiB
C
/* Copyright (C) 2005-2021 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;
|
|
}
|
|
|
|
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_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)
|