a798a26227
* Agent information w/o using hsa-runtime
- remove lib/rocprofiler/hsa/agent.{hpp,cpp}
- update include/rocprofiler/agent.h
- basically all possible info from /sys/class/kfd/kfd/topology/nodes/*
* Print topology in rocprofiler_lib.agent test
- hack to help diagnose errors
* Update lib/rocprofiler/tests/details/agent.cpp
- use LOG_IF(WARNING, ...) instead of LOG_IF(FATAL, ...)
* Update lib/rocprofiler/tests/agent.cpp
- print rocminfo at beginning of test
- fix comparison of agent handle
- misc other checks
* Updte lib/rocprofiler/agent.cpp
- handle unreadable /sys/class/kfd/kfd/topology/nodes/<N>/properties file
* Update lib/tests/buffering/CMakeLists.txt
- increase timeout to 120
- buffering.parallel will timeout when thread sanitizing is enabled
* Update cmake: rocprofiler-drm
- find drm headers and libraries
* Update include/rocprofiler/agent.h
- add family_id field
* Update lib/rocprofiler/agent.cpp
- parse /proc/cpuinfo for name, family, apicid, etc.
- read_topology uses unique pointers to cleanup memory allocations
- implement name and gfxip
* Update lib/rocprofiler/tests/agent.cpp
- improved failure message
- check name/gfxip
- remove check against hsa_agent_t.handle
- this value is dependent on the address of C++ class
* Update lib/rocprofiler/tests/details/agent.cpp
- tweak gfxip_ variable which is broken for CPU
* Update lib/rocprofiler/agent.cpp
- update string handling for name and gfxip
* Update lib/rocprofiler/tests/agent.cpp
- minor output tweak
* Update lib/rocprofiler/registration.{hpp,cpp}
- registration::init_logging() function
* Update lib/rocprofiler/agent.cpp
- fix hex handling of GFX step version
* Update lib/rocprofiler/tests/details/agent.cpp
- fix format string when nearest CPUs not found
* Update lib/rocprofiler/tests/CMakeLists.txt
- exclude details/agent.cpp from being parsed for gtest tests
* Update include/rocprofiler/fwd.h
- add ROCPROFILER_STATUS_ERROR_INCOMPATIBLE_ABI status
* Update lib/rocprofiler/tests/details/agent.{hpp,cpp}
- replace with slightly modified implementation of rocminfo
- primary change was not printing
* Update lib/rocprofiler/tests/agent.cpp
- update test to use rocminfo data
* Update lib/rocprofiler/agent.cpp
- add pc_sampling_configs
- return error on incompatible ABI
* Update counters and counters tests
- rename test names for consistency
- fixed incorrect spelling of derived
* Add lib/rocprofiler/tests/{timestamp,version}.cpp
- add timestamp and version tests for rocprofiler_get_timestamp and rocprofiler_get_version, respectively
* Update lib/rocprofiler/tests/agent
- fix double free of name_str from isa_info_t
* Update include/rocprofiler/agent.h
- comments for rocprofiler_agent_mem_bank_t
- add rocprofiler_dim3_t
- comments for rocprofiler_agent_t
- add new fields to rocprofiler_agent_t
- cu_count
- workgroup_max_size
- workgroup_max_dim
- grid_max_size
- grid_max_dim
- vendor_name
- product_name
- change prototype of rocprofiler_available_agents_cb_t to be const agent**
* Update lib/rocprofiler/agent.cpp
- set size field
- implement:
- product_name
- vendor_name
- workgroup_max_size
- workgroup_max_dim
- grid_max_size
- grid_max_dim
- cu_count
* Update lib/rocprofiler/tests/agent.cpp
- changes for const agent*
* Update samples/pc_sampling
- updates for const agent*
* Update lib/rocprofiler/agent.cpp
- fix ABI compatibility check
- return incompatible if tool agent is larger than our agent
* Update include/rocprofiler/agent.h
- doxygen comments
- make size field of rocprofiler_agent_t uint64_t for consistency
- add gpu_id via /sys/class/kfd/kfd/.../<idx>/gpu_id
- add model_name via /sys/class/kfd/kfd/.../<idx>/name
* Update lib/rocprofiler/agent.cpp
- add read_file function (vector of strings)
- support enum in read_property
- assign model_name and gpu_id fields
- remove unique_id
* Update lib/rocprofiler/tests/details/agent.*
- support family id, ucode_version, sdma_ucode_version
* Update lib/rocprofiler/tests/agent.cpp
- Add rocprofiler_lib.agent_abi test
- Verify family_id, ucode_version, sdma_ucode_version
218 строки
11 KiB
C++
218 строки
11 KiB
C++
// MIT License
|
|
//
|
|
// Copyright (c) 2023 ROCm Developer Tools
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to deal
|
|
// in the Software without restriction, including without limitation the rights
|
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
// copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in all
|
|
// copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
// SOFTWARE.
|
|
|
|
#include <rocprofiler/agent.h>
|
|
#include <rocprofiler/fwd.h>
|
|
#include <rocprofiler/registration.h>
|
|
|
|
#include "lib/rocprofiler/registration.hpp"
|
|
#include "lib/rocprofiler/tests/details/agent.hpp"
|
|
|
|
#include <fmt/core.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <pthread.h>
|
|
#include <cstdint>
|
|
#include <cstdlib>
|
|
#include <iostream>
|
|
#include <random>
|
|
#include <sstream>
|
|
#include <typeinfo>
|
|
|
|
TEST(rocprofiler_lib, agent_abi)
|
|
{
|
|
constexpr auto msg = "ABI break. NEW FIELDS MAY ONLY BE ADDED AT END OF STRUCT";
|
|
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, size), 0) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, id), 8) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, type), 16) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, cpu_cores_count), 20) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, simd_count), 24) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, mem_banks_count), 28) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, caches_count), 32) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, io_links_count), 36) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, cpu_core_id_base), 40) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, simd_id_base), 44) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, max_waves_per_simd), 48) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, lds_size_in_kb), 52) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, gds_size_in_kb), 56) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, num_gws), 60) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, wave_front_size), 64) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, num_xcc), 68) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, cu_count), 72) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, array_count), 76) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, num_shader_banks), 80) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, simd_arrays_per_engine), 84) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, cu_per_simd_array), 88) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, simd_per_cu), 92) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, max_slots_scratch_cu), 96) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, gfx_target_version), 100) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, vendor_id), 104) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, device_id), 106) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, location_id), 108) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, domain), 112) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, drm_render_minor), 116) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, num_sdma_engines), 120) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, num_sdma_xgmi_engines), 124) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, num_sdma_queues_per_engine), 128) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, num_cp_queues), 132) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, max_engine_clk_ccompute), 136) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, max_engine_clk_fcompute), 140) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, sdma_fw_version), 144) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, fw_version), 148) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, capability), 152) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, cu_per_engine), 156) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, max_waves_per_cu), 160) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, family_id), 164) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, workgroup_max_size), 168) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, grid_max_size), 172) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, local_mem_size), 176) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, hive_id), 184) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, gpu_id), 192) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, workgroup_max_dim), 200) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, grid_max_dim), 212) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, mem_banks), 224) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, caches), 232) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, io_links), 240) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, name), 248) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, vendor_name), 256) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, product_name), 264) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, model_name), 272) << msg;
|
|
EXPECT_EQ(offsetof(rocprofiler_agent_t, pc_sampling_configs), 280) << msg;
|
|
// Add test for offset of new field above this. Do NOT change any existing values!
|
|
|
|
// If a new field is added, increase this value by the size of the new field(s)
|
|
EXPECT_EQ(sizeof(rocprofiler_agent_t), 296)
|
|
<< "ABI break. If you added a new field, make sure that this is the only new check that "
|
|
"failed. Please add a check for the new field at the offset and update this test to the "
|
|
"new size";
|
|
}
|
|
|
|
TEST(rocprofiler_lib, agent)
|
|
{
|
|
rocprofiler::registration::init_logging();
|
|
|
|
auto info_ret = std::system("/usr/bin/rocminfo");
|
|
EXPECT_EQ(info_ret, 0);
|
|
|
|
auto sys_ret = std::system(
|
|
"/bin/bash -c 'for i in $(find /sys/class/kfd/kfd/topology/nodes -maxdepth 2 -type f | "
|
|
"grep properties | sort); do echo -e \"\n##### ${i} #####\n\"; cat ${i}; echo \"\"; done'");
|
|
EXPECT_EQ(sys_ret, 0);
|
|
|
|
auto agents = std::vector<const rocprofiler_agent_t*>{};
|
|
rocprofiler_available_agents_cb_t iterate_cb =
|
|
[](const rocprofiler_agent_t** agents_arr, size_t num_agents, void* user_data) {
|
|
auto* agents_v = static_cast<std::vector<const rocprofiler_agent_t*>*>(user_data);
|
|
// EXPECT_EQ(num_agents, hsa_agents_v.size());
|
|
for(size_t i = 0; i < num_agents; ++i)
|
|
{
|
|
const auto* agent = agents_arr[i];
|
|
agents_v->emplace_back(agent);
|
|
}
|
|
return ROCPROFILER_STATUS_SUCCESS;
|
|
};
|
|
|
|
auto status =
|
|
rocprofiler_query_available_agents(iterate_cb,
|
|
sizeof(rocprofiler_agent_t),
|
|
const_cast<void*>(static_cast<const void*>(&agents)));
|
|
|
|
EXPECT_EQ(status, ROCPROFILER_STATUS_SUCCESS);
|
|
|
|
auto _rocm_info = rocprofiler::test::rocm_info{};
|
|
EXPECT_EQ(rocprofiler::test::get_info(_rocm_info), 0);
|
|
|
|
auto& hsa_agents_v = _rocm_info.agents;
|
|
|
|
ASSERT_EQ(agents.size(), hsa_agents_v.size());
|
|
for(size_t i = 0; i < agents.size(); ++i)
|
|
{
|
|
const auto* agent = agents.at(i);
|
|
|
|
auto msg = fmt::format("name={}, model={}, gfx version={}, id={}, type={}",
|
|
agent->name,
|
|
agent->model_name,
|
|
agent->gfx_target_version,
|
|
agent->id.handle,
|
|
agent->type == ROCPROFILER_AGENT_TYPE_CPU ? "CPU" : "GPU");
|
|
|
|
// std::cout << msg << std::endl;
|
|
EXPECT_LT(i, hsa_agents_v.size()) << msg;
|
|
if(i >= hsa_agents_v.size()) continue;
|
|
|
|
auto* hsa_agent = &hsa_agents_v.at(i);
|
|
|
|
if(agent->type == ROCPROFILER_AGENT_TYPE_CPU)
|
|
{
|
|
EXPECT_EQ(hsa_agent->device_type, HSA_DEVICE_CPU) << msg;
|
|
}
|
|
else if(agent->type == ROCPROFILER_AGENT_TYPE_GPU)
|
|
{
|
|
EXPECT_EQ(hsa_agent->device_type, HSA_DEVICE_GPU) << msg;
|
|
}
|
|
else
|
|
{
|
|
EXPECT_TRUE(false) << msg << " :: agent-type != CPU|GPU :: " << agent->type;
|
|
}
|
|
|
|
EXPECT_EQ(std::string_view{agent->name}, std::string_view{hsa_agent->name}) << msg;
|
|
EXPECT_EQ(std::string_view{agent->vendor_name}, std::string_view{hsa_agent->vendor_name})
|
|
<< msg;
|
|
EXPECT_EQ(std::string_view{agent->product_name},
|
|
std::string_view{hsa_agent->device_mkt_name})
|
|
<< msg;
|
|
EXPECT_EQ(agent->simd_count, hsa_agent->compute_unit * hsa_agent->simds_per_cu) << msg;
|
|
EXPECT_EQ(agent->cu_count, hsa_agent->compute_unit) << msg;
|
|
EXPECT_EQ(agent->simd_per_cu, hsa_agent->simds_per_cu) << msg;
|
|
EXPECT_EQ(agent->wave_front_size, hsa_agent->wavefront_size) << msg;
|
|
EXPECT_EQ(agent->simd_arrays_per_engine, hsa_agent->shader_arrs_per_sh_eng) << msg;
|
|
EXPECT_EQ(agent->max_waves_per_cu, hsa_agent->max_waves_per_cu) << msg;
|
|
EXPECT_EQ(agent->num_shader_banks, hsa_agent->shader_engs) << msg;
|
|
EXPECT_EQ(agent->workgroup_max_size, hsa_agent->workgroup_max_size) << msg;
|
|
EXPECT_EQ(agent->workgroup_max_dim.x, hsa_agent->workgroup_max_dim[0]) << msg;
|
|
EXPECT_EQ(agent->workgroup_max_dim.y, hsa_agent->workgroup_max_dim[1]) << msg;
|
|
EXPECT_EQ(agent->workgroup_max_dim.z, hsa_agent->workgroup_max_dim[2]) << msg;
|
|
EXPECT_EQ(agent->grid_max_size, hsa_agent->grid_max_size) << msg;
|
|
EXPECT_EQ(agent->grid_max_dim.x, hsa_agent->grid_max_dim.x) << msg;
|
|
EXPECT_EQ(agent->grid_max_dim.y, hsa_agent->grid_max_dim.y) << msg;
|
|
EXPECT_EQ(agent->grid_max_dim.z, hsa_agent->grid_max_dim.z) << msg;
|
|
if(agent->type == ROCPROFILER_AGENT_TYPE_GPU)
|
|
{
|
|
// HSA lib doesn't set family ID for CPU-only but we do
|
|
EXPECT_EQ(agent->family_id, hsa_agent->family_id) << msg;
|
|
}
|
|
EXPECT_EQ(agent->fw_version.ui32.uCode, hsa_agent->ucode_version) << msg;
|
|
EXPECT_EQ(agent->sdma_fw_version.uCodeSDMA, hsa_agent->sdma_ucode_version) << msg;
|
|
|
|
if(hsa_agent->shader_engs > 0)
|
|
{
|
|
EXPECT_EQ(agent->cu_per_engine, hsa_agent->compute_unit / hsa_agent->shader_engs)
|
|
<< msg;
|
|
}
|
|
}
|
|
|
|
// clean up memory leak
|
|
for(auto& itr : _rocm_info.isas)
|
|
delete[] itr.name_str;
|
|
}
|