Skip to content

Commit

Permalink
Pthread category region (#102)
Browse files Browse the repository at this point in the history
* Perfetto args support for pthread functions

* Add pthread category
  • Loading branch information
jrmadsen authored Jul 22, 2022
1 parent 45acadf commit 0729e17
Show file tree
Hide file tree
Showing 6 changed files with 210 additions and 53 deletions.
141 changes: 114 additions & 27 deletions source/lib/omnitrace/library/components/category_region.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,24 @@
#include "library/tracing.hpp"

#include <timemory/components/gotcha/backends.hpp>
#include <timemory/mpl/concepts.hpp>
#include <timemory/mpl/types.hpp>
#include <timemory/utility/types.hpp>

#include <string_view>

namespace tim
{
namespace quirk
{
struct perfetto : concepts::quirk_type
{};

struct timemory : concepts::quirk_type
{};
} // namespace quirk
} // namespace tim

namespace omnitrace
{
namespace audit = ::tim::audit;
Expand All @@ -47,23 +63,32 @@ struct category_region : comp::base<category_region<CategoryT>, void>

static std::string label() { return JOIN('_', "omnitrace", category_name, "region"); }

template <typename... Args>
static void start(const char* name, Args&&...);
template <typename... OptsT, typename... Args>
static void start(std::string_view name, Args&&...);

template <typename... Args>
static void stop(const char* name, Args&&...);
template <typename... OptsT, typename... Args>
static void stop(std::string_view name, Args&&...);

template <typename... Args>
template <typename... OptsT, typename... Args>
static void audit(const gotcha_data_t&, audit::incoming, Args&&...);

template <typename... Args>
template <typename... OptsT, typename... Args>
static void audit(const gotcha_data_t&, audit::outgoing, Args&&...);

template <typename... OptsT, typename... Args>
static void audit(std::string_view, audit::incoming, Args&&...);

template <typename... OptsT, typename... Args>
static void audit(std::string_view, audit::outgoing, Args&&...);

template <typename... OptsT, typename... Args>
static void audit(quirk::config<OptsT...>, Args&&...);
};

template <typename CategoryT>
template <typename... Args>
template <typename... OptsT, typename... Args>
void
category_region<CategoryT>::start(const char* name, Args&&... args)
category_region<CategoryT>::start(std::string_view name, Args&&... args)
{
OMNITRACE_SCOPED_THREAD_STATE(ThreadState::Internal);

Expand All @@ -72,12 +97,12 @@ category_region<CategoryT>::start(const char* name, Args&&... args)
{
OMNITRACE_CONDITIONAL_BASIC_PRINT(
tracing::debug_user, "omnitrace_push_region(%s) called during finalization\n",
name);
name.data());
return;
}

OMNITRACE_CONDITIONAL_BASIC_PRINT(tracing::debug_push, "omnitrace_push_region(%s)\n",
name);
name.data());

// the expectation here is that if the state is not active then the call
// to omnitrace_init_tooling_hidden will activate all the appropriate
Expand All @@ -86,78 +111,140 @@ category_region<CategoryT>::start(const char* name, Args&&... args)
{
static auto _debug = get_debug_env() || get_debug_init();
OMNITRACE_CONDITIONAL_BASIC_PRINT(
_debug, "omnitrace_push_region(%s) ignored :: not active. state = %s\n", name,
std::to_string(get_state()).c_str());
_debug, "omnitrace_push_region(%s) ignored :: not active. state = %s\n",
name.data(), std::to_string(get_state()).c_str());
return;
}

OMNITRACE_DEBUG("[%s] omnitrace_push_region(%s)\n", category_name, name);
OMNITRACE_DEBUG("[%s] omnitrace_push_region(%s)\n", category_name, name.data());

auto _use_timemory = get_use_timemory();
auto _use_perfetto = get_use_perfetto();

constexpr bool _ct_use_timemory =
(sizeof...(OptsT) == 0 ||
tim::is_one_of<quirk::timemory, tim::type_list<OptsT...>>::value);

constexpr bool _ct_use_perfetto =
(sizeof...(OptsT) == 0 ||
tim::is_one_of<quirk::perfetto, tim::type_list<OptsT...>>::value);

if(_use_timemory || _use_perfetto) tracing::thread_init();

if(_use_perfetto)
{
tracing::push_perfetto(CategoryT{}, name, std::forward<Args>(args)...);
if constexpr(_ct_use_perfetto)
{
tracing::push_perfetto(CategoryT{}, name.data(), std::forward<Args>(args)...);
}
}
if(_use_timemory)
{
tracing::push_timemory(name, std::forward<Args>(args)...);
if constexpr(_ct_use_timemory)
{
tracing::push_timemory(name.data(), std::forward<Args>(args)...);
}
}
if(_use_timemory || _use_perfetto) tracing::thread_init_sampling();
}

template <typename CategoryT>
template <typename... Args>
template <typename... OptsT, typename... Args>
void
category_region<CategoryT>::stop(const char* name, Args&&... args)
category_region<CategoryT>::stop(std::string_view name, Args&&... args)
{
OMNITRACE_SCOPED_THREAD_STATE(ThreadState::Internal);

constexpr bool _ct_use_timemory =
(sizeof...(OptsT) == 0 ||
tim::is_one_of<quirk::timemory, tim::type_list<OptsT...>>::value);

constexpr bool _ct_use_perfetto =
(sizeof...(OptsT) == 0 ||
tim::is_one_of<quirk::perfetto, tim::type_list<OptsT...>>::value);

// only execute when active
if(get_state() == State::Active)
{
OMNITRACE_CONDITIONAL_PRINT(tracing::debug_pop || get_debug(),
"omnitrace_pop_region(%s)\n", name);
"omnitrace_pop_region(%s)\n", name.data());
if(get_use_timemory())
{
tracing::pop_timemory(name, std::forward<Args>(args)...);
if constexpr(_ct_use_timemory)
{
tracing::pop_timemory(name.data(), std::forward<Args>(args)...);
}
}
if(get_use_perfetto())
{
tracing::pop_perfetto(CategoryT{}, name, std::forward<Args>(args)...);
if constexpr(_ct_use_perfetto)
{
tracing::pop_perfetto(CategoryT{}, name.data(),
std::forward<Args>(args)...);
}
}
}
else
{
static auto _debug = get_debug_env();
OMNITRACE_CONDITIONAL_BASIC_PRINT(
_debug, "omnitrace_pop_region(%s) ignored :: state = %s\n", name,
_debug, "omnitrace_pop_region(%s) ignored :: state = %s\n", name.data(),
std::to_string(get_state()).c_str());
}
}

template <typename CategoryT>
template <typename... Args>
template <typename... OptsT, typename... Args>
void
category_region<CategoryT>::audit(const gotcha_data_t& _data, audit::incoming,
Args&&... _args)
{
OMNITRACE_SCOPED_THREAD_STATE(ThreadState::Internal);
start(_data.tool_id.c_str(), "args",
JOIN(", ",
JOIN('=', tim::try_demangle<std::remove_reference_t<Args>>(), _args)...));
start<OptsT...>(
_data.tool_id.c_str(), "args",
JOIN(", ",
JOIN('=', tim::try_demangle<std::remove_reference_t<Args>>(), _args)...));
}

template <typename CategoryT>
template <typename... Args>
template <typename... OptsT, typename... Args>
void
category_region<CategoryT>::audit(const gotcha_data_t& _data, audit::outgoing,
Args&&... _args)
{
OMNITRACE_SCOPED_THREAD_STATE(ThreadState::Internal);
stop(_data.tool_id.c_str(), "return", JOIN(", ", _args...));
stop<OptsT...>(_data.tool_id.c_str(), "return", JOIN(", ", _args...));
}

template <typename CategoryT>
template <typename... OptsT, typename... Args>
void
category_region<CategoryT>::audit(std::string_view _name, audit::incoming,
Args&&... _args)
{
OMNITRACE_SCOPED_THREAD_STATE(ThreadState::Internal);
start<OptsT...>(
_name.data(), "args",
JOIN(", ",
JOIN('=', tim::try_demangle<std::remove_reference_t<Args>>(), _args)...));
}

template <typename CategoryT>
template <typename... OptsT, typename... Args>
void
category_region<CategoryT>::audit(std::string_view _name, audit::outgoing,
Args&&... _args)
{
OMNITRACE_SCOPED_THREAD_STATE(ThreadState::Internal);
stop<OptsT...>(_name.data(), "return", JOIN(", ", _args...));
}

template <typename CategoryT>
template <typename... OptsT, typename... Args>
void
category_region<CategoryT>::audit(quirk::config<OptsT...>, Args&&... _args)
{
audit<OptsT...>(std::forward<Args>(_args)...);
}
} // namespace component
} // namespace omnitrace
2 changes: 2 additions & 0 deletions source/lib/omnitrace/library/components/fwd.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ TIMEMORY_DEFINE_NS_API(category, rocm_hip)
TIMEMORY_DEFINE_NS_API(category, rocm_hsa)
TIMEMORY_DEFINE_NS_API(category, rocm_smi)
TIMEMORY_DEFINE_NS_API(category, rocm_roctx)
TIMEMORY_DEFINE_NS_API(category, pthread)
TIMEMORY_DEFINE_NS_API(category, kokkos)
TIMEMORY_DEFINE_NS_API(category, mpi)
TIMEMORY_DEFINE_NS_API(category, ompt)
Expand All @@ -88,6 +89,7 @@ TIMEMORY_DEFINE_NAME_TRAIT("rocm_smi", category::rocm_smi);
TIMEMORY_DEFINE_NAME_TRAIT("rocm_roctx", category::rocm_roctx);
TIMEMORY_DEFINE_NAME_TRAIT("sampling", category::sampling);
TIMEMORY_DEFINE_NAME_TRAIT("thread_sampling", category::thread_sampling);
TIMEMORY_DEFINE_NAME_TRAIT("pthread", category::pthread);
TIMEMORY_DEFINE_NAME_TRAIT("kokkos", category::kokkos);
TIMEMORY_DEFINE_NAME_TRAIT("mpi", category::mpi);
TIMEMORY_DEFINE_NAME_TRAIT("ompt", category::ompt);
Expand Down
Loading

0 comments on commit 0729e17

Please sign in to comment.