Files
rocm-systems/source/lib/rocprofiler/config_helpers.hpp
T

108 lines
2.7 KiB
C++
Raw Normal View History

2023-08-08 18:39:01 -05:00
#pragma once
2023-08-22 13:29:11 -05:00
#include "rocprofiler/rocprofiler.h"
2023-08-08 18:39:01 -05:00
#include <array>
#include <atomic>
#include <cstddef>
#include <utility>
namespace
{
inline size_t // NOLINTNEXTLINE
get_domain_max_op(rocprofiler_tracer_activity_domain_t _domain)
{
switch(_domain)
{
2023-08-22 13:29:11 -05:00
case ROCPROFILER_TRACER_ACTIVITY_DOMAIN_NONE: return -1;
case ROCPROFILER_TRACER_ACTIVITY_DOMAIN_HSA_API: return 0;
case ROCPROFILER_TRACER_ACTIVITY_DOMAIN_HIP_API: return 0;
case ROCPROFILER_TRACER_ACTIVITY_DOMAIN_MARKER_API: return 0;
case ROCPROFILER_TRACER_ACTIVITY_DOMAIN_KFD_API: return -1;
case ROCPROFILER_TRACER_ACTIVITY_DOMAIN_EXT_API: return -1;
case ROCPROFILER_TRACER_ACTIVITY_DOMAIN_HSA_OPS: return 0;
case ROCPROFILER_TRACER_ACTIVITY_DOMAIN_HIP_OPS: return 0;
case ROCPROFILER_TRACER_ACTIVITY_DOMAIN_HSA_EVT: return 0;
case ROCPROFILER_TRACER_ACTIVITY_DOMAIN_LAST: return -1;
2023-08-08 18:39:01 -05:00
}
return -1;
}
template <typename Tp, size_t N = 8>
struct allocator
{
void construct(Tp* const _p, const Tp& _v) const { ::new((void*) _p) Tp{_v}; }
void construct(Tp* const _p, Tp&& _v) const { ::new((void*) _p) Tp{std::move(_v)}; }
void destroy(Tp* const _p) const { _p->~Tp(); }
static constexpr auto size = sizeof(Tp);
using buffer_value_t = char[size];
struct buffer_entry
{
std::atomic_flag flag = ATOMIC_FLAG_INIT;
buffer_value_t value = {};
void* get()
{
if(flag.test_and_set())
{
return &value[0];
}
return nullptr;
}
bool reset(void* p)
{
if(static_cast<void*>(&value[0]) == p)
{
flag.clear();
return true;
}
return false;
}
};
static auto& get_buffer()
{
static auto _v = std::array<buffer_entry, N>{};
return _v;
}
Tp* allocate(const size_t n) const
{
if(n == 0) return nullptr;
if(n == 1)
{
// try an find in buffer for data locality
for(auto& itr : get_buffer())
{
auto* _p = itr.get();
if(_p) return static_cast<Tp*>(_p);
}
}
auto* _p = new char[n * size];
return reinterpret_cast<Tp*>(_p);
}
void deallocate(Tp* const ptr, const size_t /*unused*/) const
{
for(auto& itr : get_buffer())
{
if(itr.reset(ptr)) return;
}
delete ptr;
}
Tp* allocate(const size_t n, const void* const /* hint */) const { return allocate(n); }
void reserve(const size_t) {}
};
} // namespace