7f631de401
* Update lib/rocprofiler/agent.{hpp,cpp}
- get_agents() function for internal access to agent pointers
* Update AgentCache
- make member variables and member functions distinguish b/t hsa agent and rocprofiler agent clear
* Change ctor of AgentCache
* Update lib/rocprofiler/hsa/queue_controller.cpp
- QueueController::init uses agent::get_agent_cache
* Update lib/rocprofiler/hsa/agent_cache.*
- member function to get index
- operator== for rocprofiler_agent_t and hsa_agent_t
- removed hsa_iterate_agents from ctor (now in agent.cpp)
* Update lib/rocprofiler/agent.*
- construct_agent_cache function
- functions for rocprofiler agent <-> HSA agent
- functions for getting agent cache
* Update lib/rocprofiler/registration.cpp
- invoke construct_agent_cache when HSA table is receieved
* Update lib/rocprofiler/agent.cpp
- loosen failure conditions
- handle spurious duplicate entry warning
* Update lib/rocprofiler/agent.cpp
- improve read_map diagnostics
* Update lib/rocprofiler/agent.cpp
- avoid infinite loop in read_map
* Update lib/rocprofiler/agent.cpp
- handle empty kfd node properties file
* Update lib/rocprofiler/agent.cpp
- check for permissions to read a node properties file
* Update lib/rocprofiler/agent.cpp
- more checks on file readability
* Update lib/rocprofiler/tests/agent.cpp
- print virtual kfd topology
* Update lib/rocprofiler/tests/agent.cpp
- verify id.handle == hsa_agent internal node id
* Update lib/rocprofiler/tests/agent.cpp
- check node_id
- check location id
- check device id
- update abi test
* Update include/rocprofiler/agent.h
- add node_id field
- add reserved0 field to ensure new field increases struct size
* Update lib/rocprofiler/agent.cpp
- node_id instead of id.handle
* Update lib/rocprofiler/agent_cache.cpp
- node_id instead of id.handle
* Update samples/pc_sampling
- node_id for agent instead of id.handle
* Update lib/rocprofiler/buffer.cpp
- remove debug prints
114 行
4.0 KiB
C++
114 行
4.0 KiB
C++
#include <rocprofiler/rocprofiler.h>
|
|
|
|
#include "lib/common/synchronized.hpp"
|
|
#include "lib/rocprofiler/aql/helpers.hpp"
|
|
#include "lib/rocprofiler/counters/evaluate_ast.hpp"
|
|
#include "lib/rocprofiler/counters/metrics.hpp"
|
|
#include "lib/rocprofiler/hsa/agent_cache.hpp"
|
|
#include "lib/rocprofiler/hsa/queue.hpp"
|
|
#include "lib/rocprofiler/hsa/queue_controller.hpp"
|
|
|
|
extern "C" {
|
|
/**
|
|
* @brief Query Counter name.
|
|
*
|
|
* @param [in] counter_id
|
|
* @param [out] name if nullptr, size will be returned
|
|
* @param [out] size
|
|
* @return ::rocprofiler_status_t
|
|
*/
|
|
rocprofiler_status_t ROCPROFILER_API
|
|
rocprofiler_query_counter_name(rocprofiler_counter_id_t counter_id, const char** name, size_t* size)
|
|
{
|
|
const auto& id_map = rocprofiler::counters::getMetricIdMap();
|
|
|
|
if(const auto* metric_ptr = rocprofiler::common::get_val(id_map, counter_id.handle))
|
|
{
|
|
*name = metric_ptr->name().c_str();
|
|
*size = metric_ptr->name().size();
|
|
return ROCPROFILER_STATUS_SUCCESS;
|
|
}
|
|
|
|
return ROCPROFILER_STATUS_ERROR_COUNTER_NOT_FOUND;
|
|
}
|
|
|
|
/**
|
|
* @brief Query Counter Instances Count.
|
|
*
|
|
* @param [in] counter_id
|
|
* @param [out] instance_count
|
|
* @return rocprofiler_status_t
|
|
*/
|
|
rocprofiler_status_t ROCPROFILER_API
|
|
rocprofiler_query_counter_instance_count(rocprofiler_agent_t agent,
|
|
rocprofiler_counter_id_t counter_id,
|
|
size_t* instance_count)
|
|
{
|
|
const auto& id_map = rocprofiler::counters::getMetricIdMap();
|
|
const auto* metric_ptr = rocprofiler::common::get_val(id_map, counter_id.handle);
|
|
if(!metric_ptr) return ROCPROFILER_STATUS_ERROR_COUNTER_NOT_FOUND;
|
|
|
|
*instance_count = 0;
|
|
// Special counters like KERNEL_DURATION are not real counters and wont
|
|
// have any query info.
|
|
if(!metric_ptr->special().empty())
|
|
{
|
|
*instance_count = 1;
|
|
return ROCPROFILER_STATUS_SUCCESS;
|
|
}
|
|
|
|
// Returns the set of hardware counters needed to evaluate the metric.
|
|
// For derived metrics, this can be more than one counter. In that case,
|
|
// we return the maximum instance count among all underlying counters.
|
|
auto req_counters =
|
|
rocprofiler::counters::get_required_hardware_counters(std::string(agent.name), *metric_ptr);
|
|
if(!req_counters) return ROCPROFILER_STATUS_ERROR_COUNTER_NOT_FOUND;
|
|
|
|
// NOTE: to look up instance information, we require HSA be init'd. Reason
|
|
// for this is the call to get instance information is an HSA call.
|
|
const auto* maybe_agent = rocprofiler::common::get_val(
|
|
rocprofiler::hsa::get_queue_controller().get_supported_agents(), agent.id.handle);
|
|
if(!maybe_agent)
|
|
{
|
|
LOG(ERROR) << "HSA must be loaded to obtain instance information.";
|
|
return ROCPROFILER_STATUS_ERROR;
|
|
}
|
|
|
|
for(const auto& counter : *req_counters)
|
|
{
|
|
if(!counter.special().empty())
|
|
{
|
|
*instance_count = std::max(size_t(1), *instance_count);
|
|
continue;
|
|
}
|
|
auto query_info = rocprofiler::aql::get_query_info(maybe_agent->get_hsa_agent(), counter);
|
|
*instance_count = std::max(static_cast<size_t>(query_info.instance_count), *instance_count);
|
|
}
|
|
|
|
return ROCPROFILER_STATUS_SUCCESS;
|
|
}
|
|
/**
|
|
* @brief Query Agent Counters Availability.
|
|
*
|
|
* @param [in] agent
|
|
* @param [out] counters_list
|
|
* @param [out] counters_count
|
|
* @return ::rocprofiler_status_t
|
|
*/
|
|
rocprofiler_status_t ROCPROFILER_API
|
|
rocprofiler_iterate_agent_supported_counters(rocprofiler_agent_t agent,
|
|
rocprofiler_available_counters_cb_t cb,
|
|
void* user_data)
|
|
{
|
|
const auto& metrics = rocprofiler::counters::getMetricsForAgent(std::string(agent.name));
|
|
std::vector<rocprofiler_counter_id_t> ids;
|
|
ids.reserve(metrics.size());
|
|
for(const auto& metric : metrics)
|
|
{
|
|
ids.push_back({.handle = metric.id()});
|
|
}
|
|
|
|
return cb(ids.data(), ids.size(), user_data);
|
|
}
|
|
}
|