fb1b61d79a
* Add ToolsApiTable
Add ToolsApiTable wrapping for
scratch memory tracking
* Add initial support for scratch memory tracking
Buffering is implemented
* cmake formatting (cmake-format) (#525)
Co-authored-by: MythreyaK <MythreyaK@users.noreply.github.com>
* source formatting (clang-format v11) (#524)
Co-authored-by: MythreyaK <MythreyaK@users.noreply.github.com>
* Add callback tracing for scratch
Fixed the error where scratch tracking init was called irrespective of whether any client requested for it
* Apply suggestions from code review
Co-authored-by: Jonathan R. Madsen <jrmadsen@users.noreply.github.com>
* Fix tools api copy/update
Table were saved/updated incorrectly in previous
commit. Also adds passing user data through the callback
* Fix OpKind sequence for scratch tracking
Previously scratch was using OpKind from rocprofiler-sdk, but
templates were instantiated using API ID. These differ by 1
* Integration tests for scratch reporting
Added buffer and callback integration tests for scratch reporting
* source formatting (clang-format v11) (#550)
Co-authored-by: MythreyaK <26112391+MythreyaK@users.noreply.github.com>
* cmake formatting (cmake-format) (#551)
Co-authored-by: MythreyaK <26112391+MythreyaK@users.noreply.github.com>
* python formatting (black) (#549)
Co-authored-by: MythreyaK <26112391+MythreyaK@users.noreply.github.com>
* CI fixes
* source formatting (clang-format v11) (#554)
Co-authored-by: MythreyaK <26112391+MythreyaK@users.noreply.github.com>
* Update api
Rebase on main and updates based on PR feedback
* Update scratch reporting and address PR comments
- Added agent id to buffer records
- Updated `test_internal_correlation_ids` - Is almost identical to
one in async-copy
- Updated scratch test to check for agent id
- Updated queue id serialization in callback records (prints
handle as nested key)
- Remove `marker_api_traces` from scratch `test_internal_correlation_ids`
validation test
- Rename `amd_tools_api` to `scratch_memory`
- Added doxygen comments
- Remove scratch callback from `tool.cpp`
- Replace assert with `LOF_IF` in `scratch_memory.cpp`
* Update tools table
Changed to match up with changes to hsa tables in main branch
* Rework scratch memory structure
* Update tests
- Added suggestions from PR review, and updated tests accordingly
* Misc cleanup
* Update scratch test
As of Apr 4th, `hsa_amd_agent_set_async_scratch_limit` is disabled.
Note,
> This API: `hsa_amd_agent_set_async_scratch_limit` is currently
> disabled. We need some changes in CP firmware to be able to do this
> and these changes are not ready yet.
> With the current code, you will also not get notifications for
> alternate-scratch allocations because this feature has been disabled
> while CP firmware is making additional changes
> We are hoping to have that feature enabled by ROCm-6.3
* Minor update to lib/rocprofiler-sdk/internal_threading.*
- delay destruction of shared_ptrs of the tasks to prevent rare (but possible) data race on the destruction of the shared_ptr
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: MythreyaK <MythreyaK@users.noreply.github.com>
Co-authored-by: Jonathan R. Madsen <jrmadsen@users.noreply.github.com>
Co-authored-by: Jonathan R. Madsen <jonathanrmadsen@gmail.com>
[ROCm/rocprofiler-sdk commit: 4fa165ec1a]
167 righe
6.4 KiB
C++
167 righe
6.4 KiB
C++
// MIT License
|
|
//
|
|
// Copyright (c) 2023 Advanced Micro Devices, Inc. All rights reserved.
|
|
//
|
|
// 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 "helper.hpp"
|
|
#include "config.hpp"
|
|
|
|
#include <rocprofiler-sdk/fwd.h>
|
|
|
|
#include <glog/logging.h>
|
|
|
|
#include <atomic>
|
|
#include <iostream>
|
|
#include <mutex>
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
#include <utility>
|
|
|
|
rocprofiler_tool_buffer_name_info_t
|
|
get_buffer_id_names()
|
|
{
|
|
static auto supported = std::unordered_set<rocprofiler_buffer_tracing_kind_t>{
|
|
ROCPROFILER_BUFFER_TRACING_HSA_CORE_API,
|
|
ROCPROFILER_BUFFER_TRACING_HSA_AMD_EXT_API,
|
|
ROCPROFILER_BUFFER_TRACING_HSA_IMAGE_EXT_API,
|
|
ROCPROFILER_BUFFER_TRACING_HSA_FINALIZE_EXT_API,
|
|
ROCPROFILER_BUFFER_TRACING_HIP_RUNTIME_API,
|
|
ROCPROFILER_BUFFER_TRACING_HIP_COMPILER_API,
|
|
ROCPROFILER_BUFFER_TRACING_MARKER_CORE_API,
|
|
ROCPROFILER_BUFFER_TRACING_MARKER_CONTROL_API,
|
|
ROCPROFILER_BUFFER_TRACING_MARKER_NAME_API,
|
|
ROCPROFILER_BUFFER_TRACING_MEMORY_COPY,
|
|
ROCPROFILER_BUFFER_TRACING_SCRATCH_MEMORY,
|
|
};
|
|
|
|
auto cb_name_info = rocprofiler_tool_buffer_name_info_t{};
|
|
//
|
|
// callback for each kind operation
|
|
//
|
|
static auto tracing_kind_operation_cb =
|
|
[](rocprofiler_buffer_tracing_kind_t kindv, uint32_t operation, void* data_v) {
|
|
auto* name_info_v = static_cast<rocprofiler_tool_buffer_name_info_t*>(data_v);
|
|
|
|
if(supported.count(kindv) > 0)
|
|
{
|
|
const char* name = nullptr;
|
|
ROCPROFILER_CALL(rocprofiler_query_buffer_tracing_kind_operation_name(
|
|
kindv, operation, &name, nullptr),
|
|
"query buffer failed");
|
|
if(name) name_info_v->operation_names[kindv][operation] = name;
|
|
}
|
|
|
|
return 0;
|
|
};
|
|
|
|
//
|
|
// callback for each kind (i.e. domain)
|
|
//
|
|
static auto tracing_kind_cb = [](rocprofiler_buffer_tracing_kind_t kind, void* data) {
|
|
// store the buffer kind name
|
|
auto* name_info_v = static_cast<rocprofiler_tool_buffer_name_info_t*>(data);
|
|
const char* name = nullptr;
|
|
ROCPROFILER_CALL(rocprofiler_query_buffer_tracing_kind_name(kind, &name, nullptr),
|
|
"query buffer failed");
|
|
|
|
if(name) name_info_v->kind_names[kind] = name;
|
|
|
|
if(supported.count(kind) > 0)
|
|
{
|
|
ROCPROFILER_CALL(rocprofiler_iterate_buffer_tracing_kind_operations(
|
|
kind, tracing_kind_operation_cb, static_cast<void*>(data)),
|
|
"query buffer failed");
|
|
}
|
|
|
|
return 0;
|
|
};
|
|
|
|
ROCPROFILER_CALL(rocprofiler_iterate_buffer_tracing_kinds(tracing_kind_cb,
|
|
static_cast<void*>(&cb_name_info)),
|
|
"iterate_buffer failed");
|
|
|
|
return cb_name_info;
|
|
}
|
|
|
|
rocprofiler_tool_callback_name_info_t
|
|
get_callback_id_names()
|
|
{
|
|
static auto supported = std::unordered_set<rocprofiler_callback_tracing_kind_t>{
|
|
ROCPROFILER_CALLBACK_TRACING_HSA_CORE_API,
|
|
ROCPROFILER_CALLBACK_TRACING_HSA_AMD_EXT_API,
|
|
ROCPROFILER_CALLBACK_TRACING_HSA_IMAGE_EXT_API,
|
|
ROCPROFILER_CALLBACK_TRACING_HSA_FINALIZE_EXT_API,
|
|
ROCPROFILER_CALLBACK_TRACING_HIP_RUNTIME_API,
|
|
ROCPROFILER_CALLBACK_TRACING_HIP_COMPILER_API,
|
|
ROCPROFILER_CALLBACK_TRACING_MARKER_CORE_API,
|
|
ROCPROFILER_CALLBACK_TRACING_MARKER_CONTROL_API,
|
|
ROCPROFILER_CALLBACK_TRACING_MARKER_NAME_API,
|
|
ROCPROFILER_CALLBACK_TRACING_CODE_OBJECT,
|
|
};
|
|
|
|
auto cb_name_info = rocprofiler_tool_callback_name_info_t{};
|
|
//
|
|
// callback for each kind operation
|
|
//
|
|
static auto tracing_kind_operation_cb =
|
|
[](rocprofiler_callback_tracing_kind_t kindv, uint32_t operation, void* data_v) {
|
|
auto* name_info_v = static_cast<rocprofiler_tool_callback_name_info_t*>(data_v);
|
|
|
|
if(supported.count(kindv) > 0)
|
|
{
|
|
const char* name = nullptr;
|
|
ROCPROFILER_CALL(rocprofiler_query_callback_tracing_kind_operation_name(
|
|
kindv, operation, &name, nullptr),
|
|
"query callback failed");
|
|
if(name) name_info_v->operation_names[kindv][operation] = name;
|
|
}
|
|
|
|
return 0;
|
|
};
|
|
|
|
//
|
|
// callback for each kind (i.e. domain)
|
|
//
|
|
static auto tracing_kind_cb = [](rocprofiler_callback_tracing_kind_t kind, void* data) {
|
|
// store the callback kind name
|
|
auto* name_info_v = static_cast<rocprofiler_tool_callback_name_info_t*>(data);
|
|
const char* name = nullptr;
|
|
ROCPROFILER_CALL(rocprofiler_query_callback_tracing_kind_name(kind, &name, nullptr),
|
|
"query callback failed");
|
|
|
|
if(name) name_info_v->kind_names[kind] = name;
|
|
|
|
if(supported.count(kind) > 0)
|
|
{
|
|
ROCPROFILER_CALL(rocprofiler_iterate_callback_tracing_kind_operations(
|
|
kind, tracing_kind_operation_cb, static_cast<void*>(data)),
|
|
"query callback failed");
|
|
}
|
|
|
|
return 0;
|
|
};
|
|
|
|
ROCPROFILER_CALL(rocprofiler_iterate_callback_tracing_kinds(tracing_kind_cb,
|
|
static_cast<void*>(&cb_name_info)),
|
|
"iterate_callback failed");
|
|
|
|
return cb_name_info;
|
|
}
|