Skip to content

Commit 9f2fca5

Browse files
author
Marcel Vollweiler
committed
OpenMP, libgomp: Environment variable syntax extension
This patch considers the environment variable syntax extension for device-specific variants of environment variables from OpenMP 5.1 (see OpenMP 5.1 specification, p. 75 and p. 639). An environment variable (e.g. OMP_NUM_TEAMS) can have different suffixes: _DEV (e.g. OMP_NUM_TEAMS_DEV): affects all devices but not the host. _DEV_<device> (e.g. OMP_NUM_TEAMS_DEV_42): affects only device with number <device>. no suffix (e.g. OMP_NUM_TEAMS): affects only the host. In future OpenMP versions also suffix _ALL will be introduced (see discussion https://github.com/OpenMP/spec/issues/3179). This is also considered in this patch: _ALL (e.g. OMP_NUM_TEAMS_ALL): affects all devices and the host. The precedence is as follows (descending). For the host: 1. no suffix 2. _ALL For devices: 1. _DEV_<device> 2. _DEV 3. _ALL That means, _DEV_<device> is used whenever available. Otherwise _DEV is used if available, and at last _ALL. If there is no value for any of the variable variants, default values are used as already implemented before. This patch concerns parsing (a), storing (b), output (c) and transmission to the device (d): (a) The actual number of devices and the numbering are not known when parsing the environment variables. Thus all environment variables are iterated and searched for device-specific ones. (b) Only configured device-specific variables are stored. Thus, a linked list is used. (c) The output is done in omp_display_env (see specification p. 468f). Global ICVs are tagged with [all], see https://github.com/OpenMP/spec/issues/3179. ICVs which are not global but aren't handled device-specific yet are tagged with [host]. omp_display_env outputs the initial values of the ICVs. That is why a dedicated data structure is introduced for the inital values only (gomp_initial_icv_list). (d) Device-specific ICVs are transmitted to the device via GOMP_ADDITIONAL_ICVS. libgomp/ChangeLog: * config/gcn/icv-device.c (omp_get_default_device): Return device- specific ICV. (omp_get_max_teams): Added for GCN devices. (omp_set_num_teams): Likewise. (ialias): Likewise. * config/nvptx/icv-device.c (omp_get_default_device): Return device- specific ICV. (omp_get_max_teams): Added for NVPTX devices. (omp_set_num_teams): Likewise. (ialias): Likewise. * env.c (struct gomp_icv_list): New struct to store entries of initial ICV values. (struct gomp_offload_icv_list): New struct to store entries of device- specific ICV values that are copied to the device and back. (struct gomp_default_icv_values): New struct to store default values of ICVs according to the OpenMP standard. (parse_schedule): Generalized for different variants of OMP_SCHEDULE. (print_env_var_error): Function that prints an error for invalid values for ICVs. (parse_unsigned_long_1): Removed getenv. Generalized. (parse_unsigned_long): Likewise. (parse_int_1): Likewise. (parse_int): Likewise. (parse_int_secure): Likewise. (parse_unsigned_long_list): Likewise. (parse_target_offload): Likewise. (parse_bind_var): Likewise. (parse_stacksize): Likewise. (parse_boolean): Likewise. (parse_wait_policy): Likewise. (parse_allocator): Likewise. (omp_display_env): Extended to output different variants of environment variables. (print_schedule): New helper function for omp_display_env which prints the values of run_sched_var. (print_proc_bind): New helper function for omp_display_env which prints the values of proc_bind_var. (enum gomp_parse_type): Collection of types used for parsing environment variables. (ENTRY): Preprocess string lengths of environment variables. (OMP_VAR_CNT): Preprocess table size. (OMP_HOST_VAR_CNT): Likewise. (INT_MAX_STR_LEN): Constant for the maximal number of digits of a device number. (gomp_get_icv_flag): Returns if a flag for a particular ICV is set. (gomp_set_icv_flag): Sets a flag for a particular ICV. (print_device_specific_icvs): New helper function for omp_display_env to print device specific ICV values. (get_device_num): New helper function for parse_device_specific. Extracts the device number from an environment variable name. (get_icv_member_addr): Gets the memory address for a particular member of an ICV struct. (gomp_get_initial_icv_item): Get a list item of gomp_initial_icv_list. (initialize_icvs): New function to initialize a gomp_initial_icvs struct. (add_initial_icv_to_list): Adds an ICV struct to gomp_initial_icv_list. (startswith): Checks if a string starts with a given prefix. (initialize_env): Extended to parse the new syntax of environment variables. * icv-device.c (omp_get_max_teams): Added. (ialias): Likewise. (omp_set_num_teams): Likewise. * icv.c (omp_set_num_teams): Moved to icv-device.c. (omp_get_max_teams): Likewise. (ialias): Likewise. * libgomp-plugin.h (GOMP_DEVICE_NUM_VAR): Removed. (GOMP_ADDITIONAL_ICVS): New target-side struct that holds the designated ICVs of the target device. * libgomp.h (enum gomp_icvs): Collection of ICVs. (enum gomp_device_num): Definition of device numbers for _ALL, _DEV, and no suffix. (enum gomp_env_suffix): Collection of possible suffixes of environment variables. (struct gomp_initial_icvs): Contains all ICVs for which we need to store initial values. (struct gomp_default_icv):New struct to hold ICVs for which we need to store initial values. (struct gomp_icv_list): Definition of a linked list that is used for storing ICVs for the devices and also for _DEV, _ALL, and without suffix. (struct gomp_offload_icvs): New struct to hold ICVs that are copied to a device. (struct gomp_offload_icv_list): Definition of a linked list that holds device-specific ICVs that are copied to devices. (gomp_get_initial_icv_item): Get a list item of gomp_initial_icv_list. (gomp_get_icv_flag): Returns if a flag for a particular ICV is set. * libgomp.texi: Updated. * plugin/plugin-gcn.c (GOMP_OFFLOAD_load_image): Extended to read further ICVs from the offload image. * plugin/plugin-nvptx.c (GOMP_OFFLOAD_load_image): Likewise. * target.c (gomp_get_offload_icv_item): Get a list item of gomp_offload_icv_list. (get_gomp_offload_icvs): New. Returns the ICV values depending on the device num and the variable hierarchy. (gomp_load_image_to_device): Extended to copy further ICVs to a device. * testsuite/libgomp.c-c++-common/icv-5.c: New test. * testsuite/libgomp.c-c++-common/icv-6.c: New test. * testsuite/libgomp.c-c++-common/icv-7.c: New test. * testsuite/libgomp.c-c++-common/icv-8.c: New test. * testsuite/libgomp.c-c++-common/omp-display-env-1.c: New test. * testsuite/libgomp.c-c++-common/omp-display-env-2.c: New test.
1 parent 338a5b0 commit 9f2fca5

17 files changed

+1582
-382
lines changed

libgomp/config/gcn/icv-device.c

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828

2929
#include "libgomp.h"
3030

31+
/* This is set to the ICV values of current GPU during device initialization,
32+
when the offload image containing this libgomp portion is loaded. */
33+
volatile struct gomp_offload_icvs GOMP_ADDITIONAL_ICVS;
34+
3135
void
3236
omp_set_default_device (int device_num __attribute__((unused)))
3337
{
@@ -36,7 +40,7 @@ omp_set_default_device (int device_num __attribute__((unused)))
3640
int
3741
omp_get_default_device (void)
3842
{
39-
return 0;
43+
return GOMP_ADDITIONAL_ICVS.default_device;
4044
}
4145

4246
int
@@ -58,14 +62,23 @@ omp_is_initial_device (void)
5862
return 0;
5963
}
6064

61-
/* This is set to the device number of current GPU during device initialization,
62-
when the offload image containing this libgomp portion is loaded. */
63-
volatile int GOMP_DEVICE_NUM_VAR;
64-
6565
int
6666
omp_get_device_num (void)
6767
{
68-
return GOMP_DEVICE_NUM_VAR;
68+
return GOMP_ADDITIONAL_ICVS.device_num;
69+
}
70+
71+
int
72+
omp_get_max_teams (void)
73+
{
74+
return GOMP_ADDITIONAL_ICVS.nteams;
75+
}
76+
77+
void
78+
omp_set_num_teams (int num_teams)
79+
{
80+
if (num_teams >= 0)
81+
GOMP_ADDITIONAL_ICVS.nteams = num_teams;
6982
}
7083

7184
ialias (omp_set_default_device)
@@ -74,3 +87,5 @@ ialias (omp_get_initial_device)
7487
ialias (omp_get_num_devices)
7588
ialias (omp_is_initial_device)
7689
ialias (omp_get_device_num)
90+
ialias (omp_get_max_teams)
91+
ialias (omp_set_num_teams)

libgomp/config/nvptx/icv-device.c

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828

2929
#include "libgomp.h"
3030

31+
/* This is set to the ICV values of current GPU during device initialization,
32+
when the offload image containing this libgomp portion is loaded. */
33+
static volatile struct gomp_offload_icvs GOMP_ADDITIONAL_ICVS;
34+
3135
void
3236
omp_set_default_device (int device_num __attribute__((unused)))
3337
{
@@ -36,7 +40,7 @@ omp_set_default_device (int device_num __attribute__((unused)))
3640
int
3741
omp_get_default_device (void)
3842
{
39-
return 0;
43+
return GOMP_ADDITIONAL_ICVS.default_device;
4044
}
4145

4246
int
@@ -58,14 +62,23 @@ omp_is_initial_device (void)
5862
return 0;
5963
}
6064

61-
/* This is set to the device number of current GPU during device initialization,
62-
when the offload image containing this libgomp portion is loaded. */
63-
static volatile int GOMP_DEVICE_NUM_VAR;
64-
6565
int
6666
omp_get_device_num (void)
6767
{
68-
return GOMP_DEVICE_NUM_VAR;
68+
return GOMP_ADDITIONAL_ICVS.device_num;
69+
}
70+
71+
int
72+
omp_get_max_teams (void)
73+
{
74+
return GOMP_ADDITIONAL_ICVS.nteams;
75+
}
76+
77+
void
78+
omp_set_num_teams (int num_teams)
79+
{
80+
if (num_teams >= 0)
81+
GOMP_ADDITIONAL_ICVS.nteams = num_teams;
6982
}
7083

7184
ialias (omp_set_default_device)
@@ -74,3 +87,5 @@ ialias (omp_get_initial_device)
7487
ialias (omp_get_num_devices)
7588
ialias (omp_is_initial_device)
7689
ialias (omp_get_device_num)
90+
ialias (omp_get_max_teams)
91+
ialias (omp_set_num_teams)

0 commit comments

Comments
 (0)