| #!/usr/bin/env python3 | |
| # Copyright 2022 The IREE Authors | |
| # | |
| # Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| # See https://llvm.org/LICENSE.txt for license information. | |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| """Utils for accessing Linux device information.""" | |
| import re | |
| from typing import Optional, Sequence | |
| from .benchmark_definition import (execute_cmd_and_get_output, DeviceInfo, | |
| PlatformType) | |
| def _get_lscpu_field(lscpu_output: str, field_name: str) -> str: | |
| (value,) = re.findall(f"^{field_name}:\s*(.+)", lscpu_output, re.MULTILINE) | |
| return value | |
| def get_linux_cpu_arch(lscpu_output: str) -> str: | |
| """Returns CPU Architecture, e.g., 'x86_64'.""" | |
| return _get_lscpu_field(lscpu_output, "Architecture") | |
| def get_linux_cpu_features(lscpu_output: str) -> Sequence[str]: | |
| """Returns CPU feature lists, e.g., ['mmx', 'fxsr', 'sse', 'sse2'].""" | |
| return _get_lscpu_field(lscpu_output, "Flags").split(" ") | |
| def canonicalize_gpu_name(gpu_name: str) -> str: | |
| # Replace all consecutive non-word characters with a single hypen. | |
| return re.sub(r"\W+", "-", gpu_name) | |
| def get_linux_device_info(device_model: str = "Unknown", | |
| cpu_uarch: Optional[str] = None, | |
| gpu_id: str = "0", | |
| verbose: bool = False) -> DeviceInfo: | |
| """Returns device info for the Linux device. | |
| Args: | |
| - device_model: the device model name, e.g., 'ThinkStation P520' | |
| - cpu_uarch: the CPU microarchitecture, e.g., 'CascadeLake' | |
| - gpu_id: the target GPU ID, e.g., '0' or 'GPU-<UUID>' | |
| """ | |
| lscpu_output = execute_cmd_and_get_output(["lscpu"], verbose) | |
| try: | |
| gpu_name = execute_cmd_and_get_output([ | |
| "nvidia-smi", "--query-gpu=name", "--format=csv,noheader", | |
| f"--id={gpu_id}" | |
| ], verbose) | |
| except FileNotFoundError: | |
| # Set GPU name to Unknown if the tool "nvidia-smi" doesn't exist. | |
| gpu_name = "Unknown" | |
| return DeviceInfo( | |
| PlatformType.LINUX, | |
| # Includes CPU model as it is the key factor of the device performance. | |
| model=device_model, | |
| # Currently we only have x86, so CPU ABI = CPU arch. | |
| cpu_abi=get_linux_cpu_arch(lscpu_output), | |
| cpu_uarch=cpu_uarch, | |
| cpu_features=get_linux_cpu_features(lscpu_output), | |
| gpu_name=canonicalize_gpu_name(gpu_name)) |