| #!/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_stdout, 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 hyphen. |
| 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_stdout(["lscpu"], verbose) |
| |
| try: |
| gpu_name = execute_cmd_and_get_stdout([ |
| "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)) |