Skip to content

Commit 056cc3f

Browse files
authored
Merge pull request #27 from ocaisa/eessi-extend-cuda
Make `EESSI-extend` support accelerator installations
2 parents 0511be3 + 545f5d9 commit 056cc3f

File tree

7 files changed

+135
-20
lines changed

7 files changed

+135
-20
lines changed

.github/workflows/scripts/verify_eessi_environment.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ def check_env_endswith(var1, var2):
4545
check_env_equals("EESSI_ACCELERATOR_TARGET_OVERRIDE", "EESSI_ACCEL_SUBDIR")
4646
# special case is where EESSI_ACCELERATOR_TARGET_OVERRIDE may not match the final
4747
# accelerator architecture chosen.
48-
# In CI we set FINAL_ACCELERATOR_PATH_EXPECTED to allow us to compare against an expected value.
49-
check_env_equals("EESSI_ACCELERATOR_TARGET", "FINAL_ACCELERATOR_PATH_EXPECTED")
48+
# In CI we set FINAL_ACCELERATOR_TARGET_EXPECTED to allow us to compare against an expected value.
49+
check_env_equals("EESSI_ACCELERATOR_TARGET", "FINAL_ACCELERATOR_TARGET_EXPECTED")
5050
# verify the software paths that should exist
5151
check_env_endswith("EESSI_SOFTWARE_PATH", "EESSI_SOFTWARE_SUBDIR")
5252
check_env_endswith("EESSI_SITE_SOFTWARE_PATH", "EESSI_SOFTWARE_SUBDIR")

.github/workflows/tests_eessi_extend_module.yml

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ jobs:
105105
export EESSI_PROJECT_INSTALL="$MY_INSTALLATION_PATH"
106106
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild
107107
# check some specific envvars
108-
check_env_var "EASYBUILD_INSTALLPATH" "$MY_INSTALLATION_PATH/versions/$EESSI_VERSION/software/linux/$EESSI_SOFTWARE_SUBDIR"
108+
export EXPECTED_INSTALLATION_PATH="$MY_INSTALLATION_PATH/versions/$EESSI_VERSION/software/linux/$EESSI_SOFTWARE_SUBDIR"
109+
check_env_var "EASYBUILD_INSTALLPATH" "$EXPECTED_INSTALLATION_PATH"
109110
check_env_var "EASYBUILD_UMASK" "002"
110111
check_env_var "EASYBUILD_GROUP_WRITABLE_INSTALLDIR" "1"
111112
# unload and check the environment is clean again
@@ -118,10 +119,92 @@ jobs:
118119
mkdir -p $EESSI_USER_INSTALL # must exist
119120
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild
120121
# check some specific envvars
121-
check_env_var "EASYBUILD_INSTALLPATH" "$MY_INSTALLATION_PATH/$USER/versions/$EESSI_VERSION/software/linux/$EESSI_SOFTWARE_SUBDIR"
122+
export EXPECTED_INSTALLATION_PATH="$MY_INSTALLATION_PATH/$USER/versions/$EESSI_VERSION/software/linux/$EESSI_SOFTWARE_SUBDIR"
123+
check_env_var "EASYBUILD_INSTALLPATH" "$EXPECTED_INSTALLATION_PATH"
122124
check_env_var "EASYBUILD_UMASK" "077"
123125
# unload and check the environment is clean again
124126
module unload EESSI-extend
125127
check_disallowed_env_prefix EASYBUILD_
126128
unset EESSI_USER_INSTALL
127129
130+
- name: Run tests for EESSI-extend in the various GPU scenarios
131+
run: |
132+
export MY_INSTALLATION_PATH=/tmp/easybuild
133+
134+
# Define a function to check the values of environment variables
135+
# and another that checks an environment does not contain environment
136+
# variables matching a certain pattern
137+
source .github/workflows/scripts/test_utils.sh
138+
139+
# Set an environment variable to use when we want to target accelerators
140+
export STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE="accel/nvidia/cc80"
141+
export STORED_CUDA_CC="8.0"
142+
143+
# Let's start from a clean slate
144+
module purge
145+
export EESSI_ACCELERATOR_TARGET_OVERRIDE=$STORED_EESSI_ACCELERATOR_TARGET_OVERRIDE
146+
module load EESSI/${{matrix.EESSI_VERSION}}
147+
# Access the installed EESSI-extend
148+
module use "$MY_INSTALLATION_PATH"/modules/all
149+
check_disallowed_env_prefix EASYBUILD_
150+
151+
# Configure for CVMFS install
152+
export EESSI_CVMFS_INSTALL=1
153+
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild
154+
check_env_var "EASYBUILD_INSTALLPATH" "$EESSI_SOFTWARE_PATH" # installation path should be the same unless we ask for an explicit GPU installation
155+
check_env_var "EASYBUILD_CUDA_COMPUTE_CAPABILITIES" "$STORED_CUDA_CC"
156+
export EESSI_ACCELERATOR_INSTALL=1
157+
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild # reload for an actual GPU installation
158+
check_env_var "EASYBUILD_INSTALLPATH" "${EESSI_SOFTWARE_PATH}/${EESSI_ACCELERATOR_TARGET_OVERRIDE}"
159+
# unload and make sure the environment is clean again
160+
module unload EESSI-extend
161+
check_disallowed_env_prefix EASYBUILD_
162+
unset EESSI_ACCELERATOR_INSTALL
163+
unset EESSI_CVMFS_INSTALL
164+
165+
# Now configure for a site
166+
export EESSI_SITE_INSTALL=1
167+
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild
168+
check_env_var "EASYBUILD_INSTALLPATH" "$EESSI_SITE_SOFTWARE_PATH" # installation path should be the same unless we ask for an explicit GPU installation
169+
check_env_var "EASYBUILD_CUDA_COMPUTE_CAPABILITIES" "$STORED_CUDA_CC"
170+
export EESSI_ACCELERATOR_INSTALL=1
171+
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild # reload for an actual GPU installation
172+
check_env_var "EASYBUILD_INSTALLPATH" "${EESSI_SITE_SOFTWARE_PATH}/${EESSI_ACCELERATOR_TARGET_OVERRIDE}"
173+
# unload and make sure the environment is clean again
174+
module unload EESSI-extend
175+
check_disallowed_env_prefix EASYBUILD_
176+
unset EESSI_ACCELERATOR_INSTALL
177+
unset EESSI_SITE_INSTALL
178+
179+
# Now for a project
180+
export EESSI_PROJECT_INSTALL="$MY_INSTALLATION_PATH"
181+
export EXPECTED_INSTALLATION_PATH="$MY_INSTALLATION_PATH/versions/$EESSI_VERSION/software/linux/$EESSI_SOFTWARE_SUBDIR"
182+
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild
183+
check_env_var "EASYBUILD_INSTALLPATH" "$EXPECTED_INSTALLATION_PATH" # installation path should be the same unless we ask for an explicit GPU installation
184+
check_env_var "EASYBUILD_CUDA_COMPUTE_CAPABILITIES" "$STORED_CUDA_CC"
185+
export EESSI_ACCELERATOR_INSTALL=1
186+
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild # reload for an GPU actual installation
187+
check_env_var "EASYBUILD_INSTALLPATH" "$EXPECTED_INSTALLATION_PATH" # installation path should be the same for project case
188+
# unload and make sure the environment is clean again
189+
module unload EESSI-extend
190+
check_disallowed_env_prefix EASYBUILD_
191+
unset EESSI_ACCELERATOR_INSTALL
192+
unset EESSI_PROJECT_INSTALL
193+
194+
# Now for a user
195+
export EESSI_USER_INSTALL="$MY_INSTALLATION_PATH/$USER"
196+
mkdir -p $EESSI_USER_INSTALL # must exist
197+
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild
198+
# check some specific envvars
199+
export EXPECTED_INSTALLATION_PATH="$MY_INSTALLATION_PATH/$USER/versions/$EESSI_VERSION/software/linux/$EESSI_SOFTWARE_SUBDIR"
200+
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild
201+
check_env_var "EASYBUILD_INSTALLPATH" "$EXPECTED_INSTALLATION_PATH" # installation path should be the same unless we ask for an explicit GPU installation
202+
check_env_var "EASYBUILD_CUDA_COMPUTE_CAPABILITIES" "$STORED_CUDA_CC"
203+
export EESSI_ACCELERATOR_INSTALL=1
204+
module load EESSI-extend/${{matrix.EESSI_VERSION}}-easybuild # reload for an actual GPU installation
205+
check_env_var "EASYBUILD_INSTALLPATH" "$EXPECTED_INSTALLATION_PATH" # installation path should be the same for user case
206+
# unload and make sure the environment is clean again
207+
module unload EESSI-extend
208+
check_disallowed_env_prefix EASYBUILD_
209+
unset EESSI_ACCELERATOR_INSTALL
210+
unset EESSI_USER_INSTALL

.github/workflows/tests_eessi_module.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,9 @@ jobs:
165165
include:
166166
# For each override we expect a specific path (which may differ from the original due to overrides)
167167
- EESSI_ACCELERATOR_TARGET_OVERRIDE: accel/nvidia/cc80
168-
FINAL_ACCELERATOR_PATH_EXPECTED: accel/nvidia/cc80
168+
FINAL_ACCELERATOR_TARGET_EXPECTED: accel/nvidia/cc80
169169
- EESSI_ACCELERATOR_TARGET_OVERRIDE: accel/nvidia/cc77 # deliberately chose a non-existent CUDA capability
170-
FINAL_ACCELERATOR_PATH_EXPECTED: accel/nvidia/cc70 # this reverts to the fallback case (which does exist)
170+
FINAL_ACCELERATOR_TARGET_EXPECTED: accel/nvidia/cc70 # this reverts to the fallback case (which does exist)
171171

172172
steps:
173173
- name: Check out software-layer repository
@@ -193,7 +193,7 @@ jobs:
193193
# Set our accelerator path overrides according to our matrix
194194
if [[ "${{matrix.EESSI_ACCELERATOR_TARGET_OVERRIDE}}" != "none" ]]; then
195195
export EESSI_ACCELERATOR_TARGET_OVERRIDE=${{matrix.EESSI_ACCELERATOR_TARGET_OVERRIDE}}
196-
export FINAL_ACCELERATOR_PATH_EXPECTED=${{matrix.FINAL_ACCELERATOR_PATH_EXPECTED}}
196+
export FINAL_ACCELERATOR_TARGET_EXPECTED=${{matrix.FINAL_ACCELERATOR_TARGET_EXPECTED}}
197197
fi
198198
199199
# Turn on debug output in case we want to take a look

EESSI-extend-easybuild.eb

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ description = """
3535
If both EESSI_USER_INSTALL and EESSI_PROJECT_INSTALL are defined, both sets of
3636
installations are exposed, but new installations are created as user
3737
installations.
38+
39+
Strict installation path checking is enforced by EESSI for EESSI and site
40+
installations involving accelerators. In these cases, if you wish to create an
41+
accelerator installation you must set the environment variable
42+
EESSI_ACCELERATOR_INSTALL (and load/reload this module).
3843
"""
3944

4045
toolchain = SYSTEM
@@ -78,8 +83,21 @@ if (mode() == "load") then
7883
end
7984
end
8085
working_dir = os.getenv("WORKING_DIR") or pathJoin("/tmp", os.getenv("USER"))
86+
8187
-- Gather the EPREFIX to use as a sysroot
8288
sysroot = os.getenv("EESSI_EPREFIX")
89+
90+
-- Check if we have GPU capabilities and configure CUDA compute capabilities
91+
eessi_accelerator_target = os.getenv("EESSI_ACCELERATOR_TARGET")
92+
if (eessi_accelerator_target ~= nil) then
93+
cuda_compute_capability = string.match(eessi_accelerator_target, "^accel/nvidia/cc([0-9][0-9])$")
94+
if (cuda_compute_capability ~= nil) then
95+
easybuild_cuda_compute_capabilities = cuda_compute_capability:sub(1, 1) .. "." .. cuda_compute_capability:sub(2, 2)
96+
else
97+
LmodError("Incorrect value for $EESSI_ACCELERATOR_TARGET: " .. eessi_accelerator_target)
98+
end
99+
end
100+
83101
-- Use an installation prefix that we _should_ have write access to
84102
if (os.getenv("EESSI_CVMFS_INSTALL") ~= nil) then
85103
-- Make sure no other EESSI install environment variables are set
@@ -88,22 +106,20 @@ if (os.getenv("EESSI_CVMFS_INSTALL") ~= nil) then
88106
end
89107
eessi_cvmfs_install = true
90108
easybuild_installpath = os.getenv("EESSI_SOFTWARE_PATH")
91-
eessi_accelerator_target = os.getenv("EESSI_ACCELERATOR_TARGET")
92-
if (eessi_accelerator_target ~= nil) then
93-
cuda_compute_capability = string.match(eessi_accelerator_target, "^nvidia/cc([0-9][0-9])$")
94-
if (cuda_compute_capability ~= nil) then
95-
easybuild_installpath = pathJoin(easybuild_installpath, 'accel', eessi_accelerator_target)
96-
easybuild_cuda_compute_capabilities = cuda_compute_capability:sub(1, 1) .. "." .. cuda_compute_capability:sub(2, 2)
97-
else
98-
LmodError("Incorrect value for $EESSI_ACCELERATOR_TARGET: " .. eessi_accelerator_target)
99-
end
109+
-- enforce accelerator subdirectory usage for CVMFS installs (only if an accelerator install is requested)
110+
if (eessi_accelerator_target ~= nil) and (cuda_compute_capability ~= nil) and (os.getenv("EESSI_ACCELERATOR_INSTALL") ~= nil) then
111+
easybuild_installpath = pathJoin(easybuild_installpath, eessi_accelerator_target)
100112
end
101113
elseif (os.getenv("EESSI_SITE_INSTALL") ~= nil) then
102114
-- Make sure no other EESSI install environment variables are set
103115
if ((os.getenv("EESSI_PROJECT_INSTALL") ~= nil) or (os.getenv("EESSI_USER_INSTALL") ~= nil)) then
104116
LmodError("You cannot use EESSI_SITE_INSTALL in combination with any other EESSI_*_INSTALL environment variables")
105117
end
106118
easybuild_installpath = os.getenv("EESSI_SITE_SOFTWARE_PATH")
119+
-- enforce accelerator subdirectory usage for site installs (only if an accelerator install is requested)
120+
if (eessi_accelerator_target ~= nil) and (cuda_compute_capability ~= nil) and (os.getenv("EESSI_ACCELERATOR_INSTALL") ~= nil) then
121+
easybuild_installpath = pathJoin(easybuild_installpath, eessi_accelerator_target)
122+
end
107123
else
108124
-- Deal with user and project installs
109125
project_install = os.getenv("EESSI_PROJECT_INSTALL")

EESSI-install-software.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,16 @@ if [[ ! -z ${EESSI_DEV_PROJECT} ]]; then
284284
echo ">> \$EESSI_PROJECT_INSTALL set to ${EESSI_PROJECT_INSTALL}"
285285
fi
286286

287+
# If we have EESSI_ACCELERATOR_TARGET_OVERRIDE set (and non-empty), then this implies building for a GPU target
288+
# (this must be set _before_ we load EESSI-extend).
289+
# We also make sure that EESSI_ACCELERATOR_TARGET is also set as EESSI_ACCELERATOR_TARGET_OVERRIDE must
290+
# be set before the EESSI module is loaded in order to set accelerator information.
291+
if [[ -n "$EESSI_ACCELERATOR_TARGET_OVERRIDE" && -z "$EESSI_ACCELERATOR_TARGET" ]]; then
292+
fatal_error "EESSI module should've set EESSI_ACCELERATOR_TARGET ($EESSI_ACCELERATOR_TARGET) when EESSI_ACCELERATOR_TARGET_OVERRIDE ($EESSI_ACCELERATOR_TARGET_OVERRIDE) exported."
293+
elif [[ -n "$EESSI_ACCELERATOR_TARGET_OVERRIDE" ]]; then
294+
export EESSI_ACCELERATOR_INSTALL=1
295+
fi
296+
287297
echo "DEBUG: before loading EESSI-extend // EASYBUILD_INSTALLPATH='${EASYBUILD_INSTALLPATH}'"
288298
source $TOPDIR/load_eessi_extend_module.sh ${EESSI_VERSION}
289299
echo "DEBUG: after loading EESSI-extend // EASYBUILD_INSTALLPATH='${EASYBUILD_INSTALLPATH}'"

bot/build.sh

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,14 @@ export EESSI_SOFTWARE_SUBDIR_OVERRIDE
162162
echo "bot/build.sh: EESSI_SOFTWARE_SUBDIR_OVERRIDE='${EESSI_SOFTWARE_SUBDIR_OVERRIDE}'"
163163

164164
# determine accelerator target (if any) from .architecture in ${JOB_CFG_FILE}
165-
export EESSI_ACCELERATOR_TARGET=$(cfg_get_value "architecture" "accelerator")
166-
echo "bot/build.sh: EESSI_ACCELERATOR_TARGET='${EESSI_ACCELERATOR_TARGET}'"
165+
ACCEL_OVERRIDE=$(cfg_get_value "architecture" "accelerator")
166+
if [[ -n "$ACCEL_OVERRIDE" ]]; then
167+
# bot job config does not include accel subdirectory
168+
export EESSI_ACCELERATOR_TARGET_OVERRIDE="accel/$ACCEL_OVERRIDE"
169+
else
170+
export EESSI_ACCELERATOR_TARGET_OVERRIDE=""
171+
fi
172+
echo "bot/build.sh: EESSI_ACCELERATOR_TARGET_OVERRIDE='${EESSI_ACCELERATOR_TARGET_OVERRIDE}'"
167173

168174
# get EESSI_OS_TYPE from .architecture.os_type in ${JOB_CFG_FILE} (default: linux)
169175
EESSI_OS_TYPE=$(cfg_get_value "architecture" "os_type")

run_in_compat_layer_env.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ fi
2929
if [ ! -z ${EESSI_SOFTWARE_SUBDIR_OVERRIDE} ]; then
3030
INPUT="export EESSI_SOFTWARE_SUBDIR_OVERRIDE=${EESSI_SOFTWARE_SUBDIR_OVERRIDE}; ${INPUT}"
3131
fi
32-
if [ ! -z ${EESSI_ACCELERATOR_TARGET} ]; then
33-
INPUT="export EESSI_ACCELERATOR_TARGET=${EESSI_ACCELERATOR_TARGET}; ${INPUT}"
32+
if [ ! -z ${EESSI_ACCELERATOR_TARGET_OVERRIDE} ]; then
33+
INPUT="export EESSI_ACCELERATOR_TARGET_OVERRIDE=${EESSI_ACCELERATOR_TARGET_OVERRIDE}; ${INPUT}"
3434
fi
3535
if [ ! -z ${EESSI_CVMFS_REPO_OVERRIDE} ]; then
3636
INPUT="export EESSI_CVMFS_REPO_OVERRIDE=${EESSI_CVMFS_REPO_OVERRIDE}; ${INPUT}"

0 commit comments

Comments
 (0)