]> git.ipfire.org Git - thirdparty/gcc.git/commit - libgomp/config/nvptx/icv-device.c
OpenMP: omp_get_max_teams, omp_set_num_teams, and omp_{gs}et_teams_thread_limit on...
authorMarcel Vollweiler <marcel@codesourcery.com>
Tue, 6 Dec 2022 13:42:46 +0000 (05:42 -0800)
committerMarcel Vollweiler <marcel@codesourcery.com>
Tue, 6 Dec 2022 14:03:50 +0000 (06:03 -0800)
commit81476bc4f4a20bcf3af7ac2548c2322d48499402
tree05f4c4edec59886eab84c6e595023c03fdf5991e
parent400d9fc1f04336118c3200e2af14a620e7ea1d95
OpenMP: omp_get_max_teams, omp_set_num_teams, and omp_{gs}et_teams_thread_limit on offload devices

This patch adds support for omp_get_max_teams, omp_set_num_teams, and
omp_{gs}et_teams_thread_limit on offload devices. That includes the usage of
device-specific ICV values (specified as environment variables or changed on a
device). In order to reuse device-specific ICV values, a copy back mechanism is
implemented that copies ICV values back from device to the host.

Additionally, a limitation of the number of teams on gcn offload devices is
implemented.  The number of teams is limited by twice the number of compute
units (one team is executed on one compute unit).  This avoids queueing
unnessecary many teams and a corresponding allocation of large amounts of
memory.  Without that limitation the memory allocation for a large number of
user-specified teams can result in an "memory access fault".
A limitation of the number of teams is already also implemented for nvptx
devices (see nvptx_adjust_launch_bounds in libgomp/plugin/plugin-nvptx.c).

gcc/ChangeLog:

* gimplify.cc (optimize_target_teams): Set initial num_teams_upper
to "-2" instead of "1" for non-existing num_teams clause in order to
disambiguate from the case of an existing num_teams clause with value 1.

libgomp/ChangeLog:

* config/gcn/icv-device.c (omp_get_teams_thread_limit): Added to
allow processing of device-specific values.
(omp_set_teams_thread_limit): Likewise.
(ialias): Likewise.
* config/nvptx/icv-device.c (omp_get_teams_thread_limit): Likewise.
(omp_set_teams_thread_limit): Likewise.
(ialias): Likewise.
* icv-device.c (omp_get_teams_thread_limit): Likewise.
(ialias): Likewise.
(omp_set_teams_thread_limit): Likewise.
* icv.c (omp_set_teams_thread_limit): Removed.
(omp_get_teams_thread_limit): Likewise.
(ialias): Likewise.
* libgomp.texi: Updated documentation for nvptx and gcn corresponding
to the limitation of the number of teams.
* plugin/plugin-gcn.c (limit_teams): New helper function that limits
the number of teams by twice the number of compute units.
(parse_target_attributes): Limit the number of teams on gcn offload
devices.
* target.c (get_gomp_offload_icvs): Added teams_thread_limit_var
handling.
(gomp_load_image_to_device): Added a size check for the ICVs struct
variable.
(gomp_copy_back_icvs): New function that is used in GOMP_target_ext to
copy back the ICV values from device to host.
(GOMP_target_ext): Update the number of teams and threads in the kernel
args also considering device-specific values.
* testsuite/libgomp.c-c++-common/icv-4.c: Fixed an error in the reading
of OMP_TEAMS_THREAD_LIMIT from the environment.
* testsuite/libgomp.c-c++-common/icv-5.c: Extended.
* testsuite/libgomp.c-c++-common/icv-6.c: Extended.
* testsuite/libgomp.c-c++-common/icv-7.c: Extended.
* testsuite/libgomp.c-c++-common/icv-9.c: New test.
* testsuite/libgomp.fortran/icv-5.f90: New test.
* testsuite/libgomp.fortran/icv-6.f90: New test.

gcc/testsuite/ChangeLog:

* c-c++-common/gomp/target-teams-1.c: Adapt expected values for
num_teams from "1" to "-2" in cases without num_teams clause.
* g++.dg/gomp/target-teams-1.C: Likewise.
* gfortran.dg/gomp/defaultmap-4.f90: Likewise.
* gfortran.dg/gomp/defaultmap-5.f90: Likewise.
* gfortran.dg/gomp/defaultmap-6.f90: Likewise.
20 files changed:
gcc/gimplify.cc
gcc/testsuite/c-c++-common/gomp/target-teams-1.c
gcc/testsuite/g++.dg/gomp/target-teams-1.C
gcc/testsuite/gfortran.dg/gomp/defaultmap-4.f90
gcc/testsuite/gfortran.dg/gomp/defaultmap-5.f90
gcc/testsuite/gfortran.dg/gomp/defaultmap-6.f90
libgomp/config/gcn/icv-device.c
libgomp/config/nvptx/icv-device.c
libgomp/icv-device.c
libgomp/icv.c
libgomp/libgomp.texi
libgomp/plugin/plugin-gcn.c
libgomp/target.c
libgomp/testsuite/libgomp.c-c++-common/icv-4.c
libgomp/testsuite/libgomp.c-c++-common/icv-5.c
libgomp/testsuite/libgomp.c-c++-common/icv-6.c
libgomp/testsuite/libgomp.c-c++-common/icv-7.c
libgomp/testsuite/libgomp.c-c++-common/icv-9.c [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/icv-5.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/icv-6.f90 [new file with mode: 0644]