Description
For quite some time now, EasyBuild has easy to use options to set the CUDA capabilities for installations in EasyConfigs, its config files and even on the command line when installing software.
This is extremely useful, since it does not necessarily require changing EasyConfigs just to build software for additional architectures.
The same could be applied to AMD GPU architectures.
The base situation is a bit more complicated, as there are way more GPU targets (e.g. gfx1100
, gfx1101
, gfx1102
, gfx1103
for RX 7000 / RX 700M), and additional options can be passed to some of them, e.g. gfx90a:xnack+
and gfx90a:xnack-
to enable/disable page migration.
Additionally, similar to NVIDIA GPU support, the question arises on how to enforce selected architectures, and have a well defined behavior. This question came up in #4770. Similar to nvcc
, one can use HIPCC_PREPEND_FLAGS
and HIPCC_APPEND_FLAGS
. However, this will not work once we're dealing with other accelerator frameworks like OpenACC or (parts of) OpenMP, where each compiler handles flags differently.
Right now, there are a few EasyBlocks having the option to set AMD GPU architectures or enable building for AMD GPUs, partially with different naming:
- AOMP_Clang:
gfx_list
usingDEFAULT_GFX_ARCHS
as default. - Clang:
amd_gfx_list
usingAMDGPU_GFX_SUPPORT
as default, if the AMD GPU backend is enabled. - GCC:
withamdgcn
enables building with AMD GPU support, not sure if we pass architectures somewhere. - LLVM:
amd_gfx_list
usingAMDGPU_GFX_SUPPORT
as default, if the AMD GPU backend is enabled.
Each EasyBlock has their own list of "supported" architectures. As they are not regularly updated, all of them are outdated for recent compiler releases (e.g. gfx1200
, gfx1201
which exist in Clang 19). We probably do not want to parse CMake files for all those packages, but unifying the options in some common place might be worthwhile, or move them to the EasyConfigs.
Thinking beyond compilers, this effort will come in handy when dealing with ROCm components, as they all define a large set of architectures built by default. However, systems commonly have only a limited set of them available. Building all of them is therefore just wasted space.
It might also be helpful when adding support for AMD GPUs in EESSI (see GitLab: Building for AMD GPUs (ROCm))
As to why this might be helpful:
Personally, I'm dealing with several different systems with both NVIDIA and AMD GPUs. Having the option to use a common set of EasyConfigs with only slight changes to accommodate for the GPU architectures helps significantly. This certainly will not work for everything, especially once ROCm & CUDA as packages are involved. However, even in the scale of compilers this saves a lot of hassle when building multiple different compilers.