Separate agent cache from queue controller (#145)
* 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
This commit is contained in:
committed by
GitHub
parent
87cc748c3d
commit
7f631de401
@@ -19,7 +19,11 @@
|
||||
// THE SOFTWARE.
|
||||
|
||||
#include "lib/rocprofiler/hsa/queue_controller.hpp"
|
||||
#include "lib/rocprofiler/agent.hpp"
|
||||
#include "lib/rocprofiler/context/context.hpp"
|
||||
#include "lib/rocprofiler/hsa/agent_cache.hpp"
|
||||
|
||||
#include <rocprofiler/fwd.h>
|
||||
|
||||
#include <glog/logging.h>
|
||||
|
||||
@@ -42,7 +46,7 @@ create_queue(hsa_agent_t agent,
|
||||
{
|
||||
for(const auto& [_, agent_info] : get_queue_controller().get_supported_agents())
|
||||
{
|
||||
if(agent_info.get_agent().handle == agent.handle)
|
||||
if(agent_info.get_hsa_agent().handle == agent.handle)
|
||||
{
|
||||
auto new_queue = std::make_unique<Queue>(agent_info,
|
||||
size,
|
||||
@@ -76,7 +80,7 @@ QueueController::add_queue(hsa_queue_t* id, std::unique_ptr<Queue> queue)
|
||||
CHECK(queue);
|
||||
_callback_cache.wlock([&](auto& callbacks) {
|
||||
_queues.wlock([&](auto& map) {
|
||||
const auto agent_id = queue->get_agent().agent_t().id.handle;
|
||||
const auto agent_id = queue->get_agent().get_rocp_agent().id.handle;
|
||||
map[id] = std::move(queue);
|
||||
for(const auto& [cbid, cb_tuple] : callbacks)
|
||||
{
|
||||
@@ -110,7 +114,7 @@ QueueController::add_callback(const rocprofiler_agent_t& agent,
|
||||
_queues.wlock([&](auto& map) {
|
||||
for(auto& [_, queue] : map)
|
||||
{
|
||||
if(queue->get_agent().agent_t().id.handle == agent.id.handle)
|
||||
if(queue->get_agent().get_rocp_agent().id.handle == agent.id.handle)
|
||||
{
|
||||
queue->register_callback(return_id, qcb, ccb);
|
||||
}
|
||||
@@ -140,31 +144,17 @@ QueueController::init(CoreApiTable& core_table, AmdExtTable& ext_table)
|
||||
_core_table = core_table;
|
||||
_ext_table = ext_table;
|
||||
|
||||
auto agents = agent::get_agents();
|
||||
|
||||
// Generate supported agents
|
||||
rocprofiler_query_available_agents(
|
||||
[](const rocprofiler_agent_t** agents, size_t num_agents, void* user_data) {
|
||||
CHECK(user_data);
|
||||
QueueController& queue = *reinterpret_cast<QueueController*>(user_data);
|
||||
for(size_t i = 0; i < num_agents; i++)
|
||||
{
|
||||
const auto& agent = *agents[i];
|
||||
if(agent.type != ROCPROFILER_AGENT_TYPE_GPU) continue;
|
||||
try
|
||||
{
|
||||
queue.get_supported_agents().emplace(
|
||||
i, AgentCache{agent, i, queue.get_core_table(), queue.get_ext_table()});
|
||||
} catch(std::runtime_error& error)
|
||||
{
|
||||
LOG(ERROR) << fmt::format("GPU Agent Construction Failed (HSA queue will not "
|
||||
"be intercepted): {} ({})",
|
||||
agent.id.handle,
|
||||
error.what());
|
||||
}
|
||||
}
|
||||
return ROCPROFILER_STATUS_SUCCESS;
|
||||
},
|
||||
sizeof(rocprofiler_agent_t),
|
||||
this);
|
||||
for(const auto* itr : agents)
|
||||
{
|
||||
auto cached_agent = agent::get_agent_cache(itr);
|
||||
if(cached_agent && cached_agent->get_rocp_agent().type == ROCPROFILER_AGENT_TYPE_GPU)
|
||||
{
|
||||
get_supported_agents().emplace(cached_agent->index(), *cached_agent);
|
||||
}
|
||||
}
|
||||
|
||||
auto enable_intercepter = false;
|
||||
for(const auto& itr : context::get_registered_contexts())
|
||||
|
||||
Reference in New Issue
Block a user