Enable ATT continuous mode and code object tracing registration (#850)

* Adding ATT continuous mode and ATT code object tracking

* Fixing aql_packet.cpp

* Updating to aqlprofile codeobj changes

* Removing kernel packet from ATT dispatch callback

* Changing getSymbolMap() to return relative vaddr

* Tidy fixes

* Formatting

* Fix shadowing

* Fixing packet test

* Updating tests

* Simplifying multi-agent traces

* Adding dynamic codeobj tracking

* leftover book-keeping for codeobj markers

* Formatting

* Formatting

* Temporary removing codeobj marker

* Formatting

* Re-enabling codeobj tracking

* Making copy of coreapi table

* Fixing issues with toolData lifetile

* Formatting

* Fixing issues with ASAN

* Improving memory profile

* Removing misplaced annotation

* Fixing queue type and allowing shared_locks in globalThreadTracer

* Update logging

* Changing ATT formats to be more in line with the SDk (#883)

* Fixing some merge conflicts

* Fixing cmakelists

* Fixing merge conflicts

* Formatting
This commit is contained in:
Giovanni Lenzi Baraldi
2024-05-29 13:09:28 -03:00
committed by GitHub
parent 2225153c23
commit 1b95089c28
24 changed files with 1696 additions and 824 deletions
+13 -16
View File
@@ -26,7 +26,7 @@
#endif
/**
* @file samples/code_object_isa_decode/client.cpp
* @file samples/advanced_thread_trace/client.cpp
*
* @brief Example rocprofiler client (tool)
*/
@@ -140,9 +140,9 @@ struct ToolData
std::mutex output_mut;
CodeobjAddressTranslate codeobjTranslate;
std::map<pcinfo_t, std::unique_ptr<isa_map_elem_t>> isa_map;
std::unordered_map<uint64_t, SymbolInfo> kernels_in_codeobj = {};
std::unordered_map<uint64_t, std::string> kernel_object_to_kernel_name = {};
int num_waves = 0;
std::unordered_map<uint64_t, SymbolInfo> kernels_in_codeobj = {};
std::unordered_map<uint64_t, std::string> kernel_id_to_kernel_name = {};
int num_waves = 0;
std::ostream& output()
{
@@ -205,7 +205,7 @@ tool_codeobj_tracing_callback(rocprofiler_callback_tracing_record_t record,
{
std::unique_lock<std::shared_mutex> lg(tool.isa_map_mut);
auto* data = static_cast<kernel_symbol_data_t*>(record.payload);
tool.kernel_object_to_kernel_name.emplace(data->kernel_object, data->kernel_name);
tool.kernel_id_to_kernel_name.emplace(data->kernel_id, data->kernel_name);
}
if(record.operation != ROCPROFILER_CODE_OBJECT_LOAD) return;
@@ -242,9 +242,8 @@ rocprofiler_att_control_flags_t
dispatch_callback(rocprofiler_queue_id_t /* queue_id */,
const rocprofiler_agent_t* /* agent */,
rocprofiler_correlation_id_t /* correlation_id */,
const hsa_kernel_dispatch_packet_t* dispatch_packet,
uint64_t /* kernel_id */,
void* userdata)
rocprofiler_kernel_id_t kernel_id,
void* userdata)
{
C_API_BEGIN
assert(userdata && "Dispatch callback passed null!");
@@ -252,22 +251,20 @@ dispatch_callback(rocprofiler_queue_id_t /* queue_id */,
std::shared_lock<std::shared_mutex> lg(tool.isa_map_mut);
constexpr int desired_call_iteration = 1;
static std::atomic<int> call_id{0};
static std::string_view desired_func_name = "transposeLdsSwapInplace";
static std::string_view desired_func_name = "transposeLds";
try
{
auto& kernel_name = tool.kernel_object_to_kernel_name.at(dispatch_packet->kernel_object);
auto& kernel_name = tool.kernel_id_to_kernel_name.at(kernel_id);
if(kernel_name.find(desired_func_name) == std::string::npos)
return ROCPROFILER_ATT_CONTROL_NONE;
if(call_id.fetch_add(1) == desired_call_iteration)
return ROCPROFILER_ATT_CONTROL_START_AND_STOP;
int id = call_id.fetch_add(1);
if(id == 1) return ROCPROFILER_ATT_CONTROL_START_AND_STOP;
} catch(...)
{
std::cerr << "Could not find kernel object: " << dispatch_packet->kernel_object
<< std::endl;
std::cerr << "Could not find kernel id: " << kernel_id << std::endl;
}
C_API_END
@@ -512,7 +509,7 @@ tool_fini(void* tool_data)
<< scalar_latency / float(scalar_exec) << " cycles.\n"
<< "Vector memory ops occupied: " << vmc_fraction << "% of cycles.\n"
<< "Scalar and LDS memory ops occupied: " << lgk_fraction << "% of cycles.\n"
<< std::endl;
<< "Num waves created: " << (tool.num_waves / 2) << std::endl;
}
} // namespace client
+12 -11
View File
@@ -130,7 +130,7 @@ tool_codeobj_tracing_callback(rocprofiler_callback_tracing_record_t record,
return;
}
auto symbolmap = codeobjTranslate.getSymbolMap(data->code_object_id);
auto symbolmap = codeobjTranslate.getSymbolMap();
for(auto& [vaddr, symbol] : symbolmap)
registered_kernels.insert({symbol.name, {vaddr, vaddr + symbol.mem_size}});
}
@@ -160,14 +160,17 @@ tool_codeobj_tracing_callback(rocprofiler_callback_tracing_record_t record,
size_t vaddr = begin_end.first;
while(vaddr < begin_end.second)
{
auto inst = codeobjTranslate.get(vaddr);
std::string_view source = inst->comment;
if(source.rfind('/') < source.size()) source = source.substr(source.rfind('/'));
if(vaddr < begin_end.first + 64) output_stream() << '\t' << inst->inst << '\n';
auto inst = codeobjTranslate.get(vaddr);
if(inst->comment.size())
{
std::string_view source = inst->comment;
if(source.rfind('/') < source.size()) source = source.substr(source.rfind('/'));
if(vaddr < begin_end.first + 64) output_stream() << '\t' << inst->inst << '\n';
if(source.rfind(':') < source.size()) source = source.substr(0, source.rfind(':'));
if(source.rfind(':') < source.size()) source = source.substr(0, source.rfind(':'));
references.insert(std::string(source));
references.insert(std::string(source));
}
if(inst->inst.find("v_") == 0)
num_vector++;
else if(inst->inst.find("s_waitcnt") == 0)
@@ -227,10 +230,8 @@ tool_init(rocprofiler_client_finalize_t fini_func, void* tool_data)
}
void
tool_fini(void* tool_data)
{
(void) tool_data;
}
tool_fini(void* /* tool_data */)
{}
} // namespace