diff --git a/mpsd-software-environment.py b/mpsd-software-environment.py index b56123bfab51f0ec50dec2d863183f1cc2296af7..6a1531e7f05ffc525defcc96d0797448212824b1 100755 --- a/mpsd-software-environment.py +++ b/mpsd-software-environment.py @@ -471,6 +471,61 @@ def prepare_environment(mpsd_release: str, script_dir: Path) -> List[str]: return available_toolchains +def get_native_microarchitecture(): + """Return native microarchitecture. + + On MPSD machines, there should be an environment variable "MPSD_MICROARCH". + We try to read that. If it fails, we use the 'archspec cpu' command. + If that fails, we ask the user to install it. + + Returns + ------- + MPSD_MICROARCH : str + + Example + ------- + >>> get_native_microarchitecture() + 'haswell' + """ + # attempt to get MICRO_ARCH from environment variable (should work on + # MPSD_HPC and MPSD linux laptops). If not defined, return + # "UNKNOWN_MICROARCH" + microarch = os.environ.get("MPSD_MICROARCH", "UNKNOWN_MICROARCH") + + # if we have not found the microarchitecture environment variable, + # try calling archspec + if microarch == "UNKNOWN_MICROARCH": + logging.debug( + "Couldn't find MPSD_MICROARCH environment variable. Will try archspec." + ) + try: + process = run(["archspec", "cpu"], stdout=subprocess.PIPE, text=True) + except FileNotFoundError as e: + logging.debug(f"Call of 'archspec cpu' failed: {e=}") + # Presumably 'archspec' is not installed. + msg = "Please install archspec, for example via 'pipx install archspec'.\n" + msg += "The command we need to execute is 'archspec cpu'.\n" + msg += "Documentation of package: https://archspec.readthedocs.io/" + + logging.error(msg) + sys.exit(1) + else: # we have found archspec and executed it + if process.returncode == 0: # sanity check + microarch = process.stdout + logging.debug( + f"Found microarchitecture from 'archspec cpu' to be '{microarch}'" + ) + assert len(microarch) > 0 # sanity check + else: + raise ValueError( + f"Some error occurred when calling 'archspec cpu': {process=}" + ) + + # at this point, we have determined the microarchitecture + log_metadata("microarchitecture", microarch) + return microarch + + def install_environment( mpsd_release: str, toolchains: List[str], diff --git a/tests.py b/tests.py index a82efcd7a5bb8003181220deb5051b445482999a..c7103b4f04ca2ef93f716c2d7e95379da33118c2 100644 --- a/tests.py +++ b/tests.py @@ -361,3 +361,7 @@ def test_interface(tmp_path): # check that the help message is printed when no arguments are provided # check that the help message is printed when -h is provided # check that the error messages are also logged to the log file + + +# other tests to add (ideally) +# - get_native_microarchitecture()