CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
302 lines
9.1 KiB
C++
302 lines
9.1 KiB
C++
// Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#pragma once
|
|
#include <iostream>
|
|
#include <chrono>
|
|
#include <iomanip>
|
|
#include <fstream>
|
|
#include <sstream>
|
|
#include <map>
|
|
#include <set>
|
|
#include <string>
|
|
|
|
#include <miopen/env.hpp>
|
|
#include <miopen/kernel_tuning_mode.hpp>
|
|
|
|
#ifdef __linux__
|
|
#include <unistd.h>
|
|
#include <sys/utsname.h>
|
|
#endif
|
|
|
|
#ifndef MIOPEN_HIP_RUNTIME_COMPILE
|
|
#include <hip/hip_runtime.h>
|
|
#endif
|
|
|
|
namespace RocmPerf {
|
|
|
|
#define HIP_CHECK(call) \
|
|
{ \
|
|
hipError_t err_ = call; \
|
|
if(err_ != hipSuccess) \
|
|
{ \
|
|
std::cerr << "HIP error: " << hipGetErrorString(err_) << std::endl; \
|
|
} \
|
|
}
|
|
|
|
class SysInfo
|
|
{
|
|
public:
|
|
SysInfo(size_t major, size_t minor, size_t patch)
|
|
: miopMajor(major), miopMinor(minor), miopPatch(patch)
|
|
{
|
|
}
|
|
|
|
void ShowSysInfo()
|
|
{
|
|
#ifdef __linux__
|
|
// Check if JSON mode is enabled
|
|
const bool json_mode = miopen::IsPerformanceLoggingEnabled();
|
|
|
|
// System information collection
|
|
const std::string timestamp = GetTimestamp();
|
|
const std::string hostname = GetHostname();
|
|
const std::string osInfo = GetOsInfo();
|
|
const std::string hipVer = GetHipVersion();
|
|
auto [cpuVendor, cpuModel] = GetCpuInfo();
|
|
const std::string ramSize = GetRamSize();
|
|
const std::string gpuInfo = GetGpuInfo();
|
|
const std::string amdgpuVer = GetAmdGpuVersion();
|
|
|
|
// Format final output
|
|
if(json_mode)
|
|
{
|
|
std::cout << "{\"timestamp\":\"" << JsonEscape(timestamp) << "\","
|
|
<< "\"system_info\":{" << "\"hostname\":\"" << JsonEscape(hostname) << "\","
|
|
<< "\"os\":\"" << JsonEscape(osInfo) << "\"," << "\"cpu_vendor\":\""
|
|
<< JsonEscape(cpuVendor) << "\"," << "\"cpu_model\":\""
|
|
<< JsonEscape(cpuModel) << "\"," << "\"ram_size\":\"" << JsonEscape(ramSize)
|
|
<< "\"," << "\"gpu_model\":\"" << JsonEscape(gpuInfo) << "\"},"
|
|
<< "\"build_info\":{" << "\"rocm\":\"" << JsonEscape(hipVer) << "\","
|
|
<< "\"miopen_version\":\"" << miopMajor << "." << miopMinor << "."
|
|
<< miopPatch << "\"," << "\"amdgpu_driver\":\"" << JsonEscape(amdgpuVer)
|
|
<< "\"}}" << std::endl;
|
|
}
|
|
else
|
|
{
|
|
std::cout << "Timestamp: " << timestamp << "; " << "Host Name: " << hostname << "; "
|
|
<< "Operating System: " << osInfo << "; " << "ROCm: " << hipVer << "; "
|
|
<< "MIOpen Driver: " << miopMajor << "." << miopMinor << "." << miopPatch
|
|
<< "; " << "CPU Vendor: " << cpuVendor << "; " << "CPU Model: " << cpuModel
|
|
<< "; " << "RAM Size: " << ramSize << "; " << "GPU Model: " << gpuInfo << "; "
|
|
<< "AMDGPU Driver: " << amdgpuVer << std::endl;
|
|
}
|
|
#else
|
|
const bool json_mode = miopen::IsPerformanceLoggingEnabled();
|
|
if(json_mode)
|
|
{
|
|
std::cout << "{\"build_info\":{" << "\"miopen_version\":\"" << miopMajor << "."
|
|
<< miopMinor << "." << miopPatch << "\"}}" << std::endl;
|
|
}
|
|
else
|
|
{
|
|
(void)miopMajor;
|
|
(void)miopMinor;
|
|
(void)miopPatch;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
std::string JsonEscape(const std::string& str)
|
|
{
|
|
std::ostringstream oss;
|
|
for(char c : str)
|
|
{
|
|
switch(c)
|
|
{
|
|
case '"': oss << "\\\""; break;
|
|
case '\\': oss << "\\\\"; break;
|
|
case '\b': oss << "\\b"; break;
|
|
case '\f': oss << "\\f"; break;
|
|
case '\n': oss << "\\n"; break;
|
|
case '\r': oss << "\\r"; break;
|
|
case '\t': oss << "\\t"; break;
|
|
default:
|
|
if(c < 32 || c > 126)
|
|
{
|
|
oss << "\\u" << std::hex << std::setw(4) << std::setfill('0')
|
|
<< static_cast<int>(static_cast<unsigned char>(c));
|
|
}
|
|
else
|
|
{
|
|
oss << c;
|
|
}
|
|
}
|
|
}
|
|
return oss.str();
|
|
}
|
|
|
|
std::string GetTimestamp()
|
|
{
|
|
std::stringstream ss;
|
|
#ifdef __linux__
|
|
auto now = std::chrono::system_clock::now();
|
|
auto now_c = std::chrono::system_clock::to_time_t(now);
|
|
|
|
ss << std::put_time(std::gmtime(&now_c), "%Y-%m-%d %H:%M:%S UTC");
|
|
#endif
|
|
return ss.str();
|
|
}
|
|
|
|
std::string GetHostname()
|
|
{
|
|
char name[256] = "";
|
|
#ifdef __linux__
|
|
gethostname(name, sizeof(name));
|
|
#endif
|
|
return name;
|
|
}
|
|
|
|
std::string GetOsInfo()
|
|
{
|
|
#ifdef __linux__
|
|
struct utsname buf;
|
|
uname(&buf);
|
|
return std::string(buf.sysname) + " " + buf.release;
|
|
#else
|
|
return "unimplemented";
|
|
#endif
|
|
}
|
|
|
|
std::pair<std::string, std::string> GetCpuInfo()
|
|
{
|
|
std::string line;
|
|
std::string vendor_id, model_name;
|
|
std::set<std::string> physical_ids;
|
|
std::string socket_info;
|
|
#ifdef __linux__
|
|
std::ifstream cpuinfo("/proc/cpuinfo");
|
|
while(getline(cpuinfo, line))
|
|
{
|
|
if(line.find("vendor_id") == 0 && vendor_id.empty())
|
|
{
|
|
vendor_id = line.substr(line.find(": ") + 2);
|
|
}
|
|
if(line.find("model name") == 0 && model_name.empty())
|
|
{
|
|
model_name = line.substr(line.find(": ") + 2);
|
|
}
|
|
if(line.find("physical id") == 0)
|
|
{
|
|
physical_ids.insert(line.substr(line.find(": ") + 2));
|
|
}
|
|
}
|
|
|
|
if(vendor_id.find("AuthenticAMD") != std::string::npos)
|
|
{
|
|
vendor_id = "AMD";
|
|
size_t start_pos = model_name.find("AMD ");
|
|
if(start_pos != std::string::npos)
|
|
{
|
|
model_name = model_name.substr(start_pos + 4);
|
|
}
|
|
std::istringstream iss(model_name);
|
|
std::string part1, part2;
|
|
iss >> part1 >> part2;
|
|
model_name = part1 + " " + part2;
|
|
}
|
|
else if(vendor_id.find("GenuineIntel") != std::string::npos)
|
|
{
|
|
vendor_id = "Intel";
|
|
}
|
|
else
|
|
{
|
|
vendor_id = "unknown";
|
|
}
|
|
|
|
// Format socket count
|
|
socket_info = physical_ids.empty() ? "" : std::to_string(physical_ids.size()) + " x ";
|
|
return {vendor_id, socket_info + model_name};
|
|
#else
|
|
return {"unimplemented", "unimplemented"};
|
|
#endif
|
|
}
|
|
|
|
std::string GetRamSize()
|
|
{
|
|
#ifdef __linux__
|
|
std::ifstream meminfo("/proc/meminfo");
|
|
std::string line;
|
|
while(getline(meminfo, line))
|
|
{
|
|
if(line.find("MemTotal") == 0)
|
|
{
|
|
size_t start = line.find(":") + 2;
|
|
size_t end = line.find(" kB");
|
|
long kb = std::stol(line.substr(start, end - start));
|
|
return std::to_string(kb / (1024 * 1024)) + " GB";
|
|
}
|
|
}
|
|
#endif
|
|
return "Unknown";
|
|
}
|
|
|
|
std::string GetAmdGpuVersion()
|
|
{
|
|
std::string version = "0.0.0";
|
|
#ifdef __linux__
|
|
std::ifstream amdgpuVer("/sys/module/amdgpu/version");
|
|
if(amdgpuVer.is_open())
|
|
{
|
|
std::getline(amdgpuVer, version);
|
|
}
|
|
#endif
|
|
|
|
return version;
|
|
}
|
|
|
|
std::string GetHipVersion()
|
|
{
|
|
int runtime_version = 0;
|
|
#ifndef MIOPEN_HIP_RUNTIME_COMPILE
|
|
HIP_CHECK(hipRuntimeGetVersion(&runtime_version));
|
|
#endif
|
|
const int patch = runtime_version % 100000;
|
|
runtime_version = runtime_version / 100000;
|
|
|
|
const int major = runtime_version / 100;
|
|
const int minor = runtime_version % 100;
|
|
return std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(patch);
|
|
}
|
|
|
|
std::string GetGpuInfo()
|
|
{
|
|
std::string result;
|
|
int deviceCount = 0;
|
|
#ifndef MIOPEN_HIP_RUNTIME_COMPILE
|
|
HIP_CHECK(hipGetDeviceCount(&deviceCount));
|
|
#endif
|
|
if(deviceCount < 1)
|
|
{
|
|
result = "None";
|
|
}
|
|
else
|
|
{
|
|
std::map<std::string, int> gpuList;
|
|
#ifndef MIOPEN_HIP_RUNTIME_COMPILE
|
|
for(int i = 0; i < deviceCount; i++)
|
|
{
|
|
hipDeviceProp_t props;
|
|
HIP_CHECK(hipGetDeviceProperties(&props, i));
|
|
gpuList[props.name]++;
|
|
}
|
|
#endif
|
|
for(const auto& [name, count] : gpuList)
|
|
{
|
|
if(!result.empty())
|
|
result += ", ";
|
|
result += std::to_string(count) + " x " + name;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
private:
|
|
size_t miopMajor{};
|
|
size_t miopMinor{};
|
|
size_t miopPatch{};
|
|
};
|
|
} // namespace RocmPerf
|