diff --git a/mpcdf_common.py b/mpcdf_common.py index f1e952dd048b73a7d9fbf962a2e2c17770dd094f..21430a21fa9807676a858959a84b7bf7d4cec841 100644 --- a/mpcdf_common.py +++ b/mpcdf_common.py @@ -20,7 +20,7 @@ known_microarchs = {"skylake", "znver2", "znver4"} default_microarch = "skylake" package_attributes = ["MPCDF:enable_repositories"] -config_attributes = ["MPCDF:compiler_modules", "MPCDF:cuda_modules", "MPCDF:rocm_modules", "MPCDF:mpi_modules", "MPCDF:pgi_modules", "MPCDF:openmpi_flavors"] +config_attributes = ["MPCDF:compiler_modules", "MPCDF:cuda_modules", "MPCDF:rocm_modules", "MPCDF:mpi_modules", "MPCDF:pgi_modules", "MPCDF:amd_modules", "MPCDF:openmpi_flavors"] intel_parallel_studio = { "mpcdf_intel_parallel_studio_2017_7": {"compiler": "intel_17_0_7", "impi": "impi_2017_4", "mkl": "mkl_2017_4-module", }, @@ -229,6 +229,13 @@ def valid_pgi_mpi(pgi, mpi): return False +def valid_amd_mpi(amd, mpi): + if "openmpi" in mpi: + return True + + return False + + def is_intel_compiler(compiler: str) -> bool: return compiler.startswith("intel") @@ -241,6 +248,10 @@ def is_pgi_compiler(compiler: str) -> bool: return compiler.startswith("pgi") +def is_amd_compiler(compiler: str) -> bool: + return compiler.startswith("amd") + + def is_intel_mpi(mpi: str) -> bool: return mpi.startswith("impi") @@ -264,6 +275,8 @@ def valid_mpi(compiler, mpi): return mpi == compiler_parallel_studio[compiler]["impi"] if is_pgi_compiler(compiler): return valid_pgi_mpi(compiler, mpi) + if is_amd_compiler(compiler): + return valid_amd_mpi(compiler, mpi) if is_gcc_compiler(compiler) and is_intel_mpi(mpi): gcc_version = int(compiler[len("gcc_"):]) impi_major_version, impi_minor_version = map(int, mpi[len("impi_"):].split("_")) @@ -335,6 +348,10 @@ def valid_cuda(cuda, compiler): return compiler in compiler_cuda.get(cuda, []) +def valid_rocm(compiler): + return is_gcc_compiler(compiler) or is_amd_compiler(compiler) + + project_meta_caches = {} @@ -569,6 +586,7 @@ def mpcdf_enable_repositories(api_url, project, package, verbose=False, dry_run= cudas = overloaded_package_attribute(api_url, project, package, "MPCDF:cuda_modules") rocms = overloaded_package_attribute(api_url, project, package, "MPCDF:rocm_modules") pgis = overloaded_package_attribute(api_url, project, package, "MPCDF:pgi_modules") + amds = overloaded_package_attribute(api_url, project, package, "MPCDF:amd_modules") openmpi_flavors = overloaded_package_attribute(api_url, project, package, "MPCDF:openmpi_flavors") all_compilers = overloaded_project_attribute(api_url, project, "MPCDF:compiler_modules") @@ -576,6 +594,7 @@ def mpcdf_enable_repositories(api_url, project, package, verbose=False, dry_run= all_cudas = overloaded_project_attribute(api_url, project, "MPCDF:cuda_modules") all_rocms = overloaded_project_attribute(api_url, project, "MPCDF:rocm_modules") all_pgis = overloaded_project_attribute(api_url, project, "MPCDF:pgi_modules") + all_amds = overloaded_project_attribute(api_url, project, "MPCDF:amd_modules") all_openmpi_flavors = overloaded_project_attribute(api_url, project, "MPCDF:openmpi_flavors") latest_intel = latest_package(filter(is_intel_compiler, all_compilers)) @@ -628,6 +647,10 @@ def mpcdf_enable_repositories(api_url, project, package, verbose=False, dry_run= for pgi in (p for p in pgis if p in all_pgis): yield pgi + def actual_amds(): + for amd in (a for a in amds if a in all_amds): + yield amd + def actual_openmpi_flavors(): for of in (f for f in openmpi_flavors if f in all_openmpi_flavors): yield of @@ -659,6 +682,10 @@ def mpcdf_enable_repositories(api_url, project, package, verbose=False, dry_run= if "openmpi" in mpi and valid_pgi_mpi(compiler, mpi): for of in actual_openmpi_flavors(): enable(mpi + "_" + compiler + "_" + of) + for mpi, compiler in product(actual_mpis(), actual_amds()): + if "openmpi" in mpi and valid_amd_mpi(compiler, mpi): + for of in actual_openmpi_flavors(): + enable(mpi + "_" + compiler + "_" + of) if flag == "cuda": for cuda, compiler in product(actual_cudas(), all_compilers + all_pgis): @@ -670,24 +697,33 @@ def mpcdf_enable_repositories(api_url, project, package, verbose=False, dry_run= if valid_cuda(cuda, compiler) and valid_mpi(compiler, mpi): enable(cuda + "_" + mpi + "_" + compiler) + if flag == "amd": + for amd in actual_amds(): + enable(amd) + + if flag == "amd_mpi": + for mpi, amd in product(actual_mpis(), actual_amds()): + if valid_amd_mpi(amd, mpi): + enable(mpi + "_" + amd) + if flag == "rocm": - for rocm, compiler in product(actual_rocms(), all_compilers): - if is_gcc_compiler(compiler): + for rocm, compiler in product(actual_rocms(), all_compilers + all_amds): + if valid_rocm(compiler): enable(rocm + "_" + compiler) if flag == "rocm_mpi": - for rocm, mpi, compiler in product(actual_rocms(), actual_mpis(), all_compilers): - if is_gcc_compiler(compiler) and is_openmpi(mpi) and valid_mpi(compiler, mpi): + for rocm, mpi, compiler in product(actual_rocms(), actual_mpis(), all_compilers + all_amds): + if valid_rocm(compiler) and is_openmpi(mpi) and valid_mpi(compiler, mpi): enable(rocm + "_" + mpi + "_" + compiler) if flag == "rocm_aware_mpi": - for rocm, mpi, compiler in product(actual_rocms(), actual_mpis(), all_compilers): - if is_gcc_compiler(compiler) and is_openmpi(mpi) and valid_mpi(compiler, mpi): + for rocm, mpi, compiler in product(actual_rocms(), actual_mpis(), all_compilers + all_amds): + if valid_rocm(compiler) and is_openmpi(mpi) and valid_mpi(compiler, mpi): enable(rocm + "_aware_" + mpi + "_" + compiler) if flag == "rocm_aware_openmpi_flavors": - for rocm, mpi, compiler in product(actual_rocms(), actual_mpis(), all_compilers): - if is_gcc_compiler(compiler) and is_openmpi(mpi) and valid_mpi(compiler, mpi): + for rocm, mpi, compiler in product(actual_rocms(), actual_mpis(), all_compilers + all_amds): + if valid_rocm(compiler) and is_openmpi(mpi) and valid_mpi(compiler, mpi): for of in actual_openmpi_flavors(): enable(rocm + "_aware_" + mpi + "_" + compiler + "_" + of) @@ -986,12 +1022,13 @@ Macros: cudas = overloaded_project_attribute(api_url, project, "MPCDF:cuda_modules") rocms = overloaded_project_attribute(api_url, project, "MPCDF:rocm_modules") pgis = overloaded_project_attribute(api_url, project, "MPCDF:pgi_modules") + amds = overloaded_project_attribute(api_url, project, "MPCDF:amd_modules") openmpi_flavors = overloaded_project_attribute(api_url, project, "MPCDF:openmpi_flavors") if parent: repo("System", (("software", distribution),)) - for compiler in compilers + pgis: + for compiler in compilers + pgis + amds: if project.startswith("home:"): dependencies = ((project, "System"),) elif project != "software": @@ -1047,7 +1084,7 @@ Macros: additional_tags=("Prefer: mpcdf_" + cuda_from_compiler(cuda, compiler),)) for rocm in rocms: - for compiler in filter(is_gcc_compiler, compilers): + for compiler in filter(valid_rocm, compilers + amds): repo(rocm + "_" + compiler, ((project, compiler),), rocm=True, rocm_repository=rocm, additional_tags=("Prefer: mpcdf_" + rocm,)) for mpi in filter(partial(valid_mpi, compiler), filter(is_openmpi, mpis)): diff --git a/mpcdf_enable_repositories.py b/mpcdf_enable_repositories.py index ea1b70f10812104b015474fa1e77acec82c63282..151bc6fb266d8352a0d8c13110edbb424a5d2ca4 100644 --- a/mpcdf_enable_repositories.py +++ b/mpcdf_enable_repositories.py @@ -21,9 +21,11 @@ import osc.cmdln help="Restrict the set of ROCm implementations to use") @osc.cmdln.option('--pgi-modules', help="Restrict the set of PGI compilers to use") +@osc.cmdln.option('--amd-modules', + help="Restrict the set of AMD compilers to use") @osc.cmdln.option('--set', metavar="FLAGS", help="Modify the set of enabled repositories, without this the current setup is displayed. " - "FLAGS is a comma-separated list of a subset of 'system', 'compilers', 'mpi', 'cuda', 'cuda_mpi', 'rocm', 'rocm_mpi', 'pgi', 'pgi_mpi'") + "FLAGS is a comma-separated list of a subset of 'system', 'compilers', 'mpi', 'cuda', 'cuda_mpi', 'rocm', 'rocm_mpi', 'pgi', 'pgi_mpi', 'amd', 'amd_mpi'") @osc.cmdln.option('--disable', action="store_true", help="Disable building this package") @osc.cmdln.alias("mpcdf_enable_repos") @@ -93,6 +95,7 @@ def do_mpcdf_enable_repositories(self, subcmd, opts, *args): set_or_remove(opts.cuda_modules, "MPCDF:cuda_modules") set_or_remove(opts.rocm_modules, "MPCDF:rocm_modules") set_or_remove(opts.pgi_modules, "MPCDF:pgi_modules") + set_or_remove(opts.amd_modules, "MPCDF:amd_modules") if opts.recreate or opts.set or opts.disable: mpcdf_common.mpcdf_enable_repositories(api_url, project, package, verbose=True, dry_run=opts.dry_run) @@ -123,5 +126,6 @@ def do_mpcdf_enable_repositories(self, subcmd, opts, *args): print_attr("- Subset of CUDA modules set to:", "MPCDF:cuda_modules") print_attr("- Subset of ROCm modules set to:", "MPCDF:rocm_modules") print_attr("- Subset of PGI modules set to:", "MPCDF:pgi_modules") + print_attr("- Subset of AMD modules set to:", "MPCDF:amd_modules") else: print("Disabled") diff --git a/mpcdf_info.py b/mpcdf_info.py index 169ccbc6ae88530d20365d052a36652ee6b146b8..cae576a973e804c653981e32484ecb8e9198663c 100644 --- a/mpcdf_info.py +++ b/mpcdf_info.py @@ -47,6 +47,7 @@ def do_mpcdf_info(self, subcmd, opts, *args) -> None: print_attribute("CUDA versions", "MPCDF:cuda_modules") print_attribute("ROCm versions", "MPCDF:rocm_modules") print_attribute("PGI compilers", "MPCDF:pgi_modules") + print_attribute("AMD compilers", "MPCDF:amd_modules") if not opts.details: raise SystemExit(0)