#!/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-' """ 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), )