Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support external (i.e. user-defined) trace annotations #195

Merged
merged 5 commits into from
Nov 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/ubuntu-focal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -573,4 +573,3 @@ jobs:
-DOMNITRACE_MAX_THREADS=32
-DOMNITRACE_DISABLE_EXAMPLES="transpose;rccl"
-DOMNITRACE_BUILD_NUMBER=${{ github.run_attempt }}
-DMPI_HEADERS_ALLOW_MPICH=ON
8 changes: 5 additions & 3 deletions cmake/Packages.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,10 @@ set(OMNITRACE_EXTENSION_LIBRARIES
omnitrace::omnitrace-perfetto)

target_include_directories(
omnitrace-headers INTERFACE ${PROJECT_SOURCE_DIR}/source/lib/omnitrace
${PROJECT_BINARY_DIR}/source/lib/omnitrace)
omnitrace-headers
INTERFACE ${PROJECT_BINARY_DIR}/source/lib ${PROJECT_BINARY_DIR}/source/lib/omnitrace
${PROJECT_SOURCE_DIR}/source/lib ${PROJECT_SOURCE_DIR}/source/lib/omnitrace
${PROJECT_SOURCE_DIR}/source/lib/omnitrace-user)

# include threading because of rooflines
target_link_libraries(omnitrace-headers INTERFACE omnitrace::omnitrace-threading)
Expand Down Expand Up @@ -372,7 +374,7 @@ else()
OMNITRACE_DYNINST_API_RT dyninstAPI_RT
HINTS ${Dyninst_ROOT_DIR} ${Dyninst_DIR}
PATHS ${Dyninst_ROOT_DIR} ${Dyninst_DIR}
PATH_SUFFIXES lib)
PATH_SUFFIXES lib NO_CACHE)

if(OMNITRACE_DYNINST_API_RT)
omnitrace_target_compile_definitions(
Expand Down
2 changes: 1 addition & 1 deletion examples/python/builtin.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def inefficient(n):
a += i
for j in range(n):
a += j
_len = a * n * n * n
_len = a * n * n
_arr = [random.random() for _ in range(_len)]
_sum = sum(_arr)
print(f"[{_prefix}] ... sum of {_len} random elements: {_sum}")
Expand Down
2 changes: 1 addition & 1 deletion examples/python/external.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def inefficient(n):
a += i
for j in range(n):
a += j
_len = a * n * n * n
_len = a * n * n
_arr = [random.random() for _ in range(_len)]
_sum = sum(_arr)
print(f"[{_prefix}] ... sum of {_len} random elements: {_sum}")
Expand Down
2 changes: 1 addition & 1 deletion examples/python/noprofile.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def inefficient(n):
a += i
for j in range(n):
a += j
_len = a * n * n * n
_len = a * n * n
_arr = [random.random() for _ in range(_len)]
_sum = sum(_arr)
print(f"[{_prefix}] ... sum of {_len} random elements: {_sum}")
Expand Down
4 changes: 2 additions & 2 deletions examples/python/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def inefficient(n):
a += i
for j in range(n):
a += j
_len = a * n * n * n
_len = a * n * n
_ret = np.random.rand(_len).sum()
print(f"[{_prefix}] ... sum of {_len} random elements: {_ret}")
return _ret
Expand All @@ -41,7 +41,7 @@ def inefficient(n):
a += i
for j in range(n):
a += j
_len = a * n * n * n
_len = a * n * n
_arr = [random.random() for _ in range(_len)]
_ret = _sum(_arr)
print(f"[{_prefix}] ... sum of {_len} random elements: {_ret}")
Expand Down
41 changes: 31 additions & 10 deletions examples/user-api/user-api.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@

#include "omnitrace/categories.h"
#include "omnitrace/types.h"
#include <omnitrace/user.h>

#include <atomic>
#include <cassert>
#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <thread>
#include <vector>
Expand All @@ -22,19 +26,16 @@ custom_push_region(const char* name);

namespace
{
int (*omnitrace_push_region_f)(const char*) = nullptr;
}
omnitrace_user_callbacks_t custom_callbacks = OMNITRACE_USER_CALLBACKS_INIT;
omnitrace_user_callbacks_t original_callbacks = OMNITRACE_USER_CALLBACKS_INIT;
} // namespace

int
main(int argc, char** argv)
{
// get the internal callback to start a user-defined region
omnitrace_user_get_callbacks(OMNITRACE_USER_REGION, (void**) &omnitrace_push_region_f,
nullptr);
// assign the custom callback to start a user-defined region
if(omnitrace_push_region_f)
omnitrace_user_configure(OMNITRACE_USER_REGION, (void*) &custom_push_region,
nullptr);
custom_callbacks.push_region = &custom_push_region;
omnitrace_user_configure(OMNITRACE_USER_UNION_CONFIG, custom_callbacks,
&original_callbacks);

omnitrace_user_push_region(argv[0]);
omnitrace_user_push_region("initialization");
Expand Down Expand Up @@ -100,6 +101,26 @@ run(size_t nitr, long n)
int
custom_push_region(const char* name)
{
if(!original_callbacks.push_region || !original_callbacks.push_annotated_region)
return OMNITRACE_USER_ERROR_NO_BINDING;

printf("Pushing custom region :: %s\n", name);
return (*omnitrace_push_region_f)(name);

if(original_callbacks.push_annotated_region)
{
int32_t _err = errno;
char* _msg = nullptr;
char _buff[1024];
if(_err != 0) _msg = strerror_r(_err, _buff, sizeof(_buff));

omnitrace_annotation_t _annotations[] = {
{ "errno", OMNITRACE_INT32, &_err }, { "strerror", OMNITRACE_STRING, _msg }
};

errno = 0; // reset errno
return (*original_callbacks.push_annotated_region)(
name, _annotations, sizeof(_annotations) / sizeof(omnitrace_annotation_t));
}

return (*original_callbacks.push_region)(name);
}
2 changes: 1 addition & 1 deletion external/timemory
Submodule timemory updated 39 files
+1 −1 .circleci/config.yml
+9 −9 .github/workflows/continuous-integration.yml
+1 −1 cmake/Modules/ConfigBinutils.cmake
+26 −3 pyctest-runner.py
+1 −0 source/python/tools/timem.py
+6 −6 source/tests/traits_tests.cpp
+58 −22 source/timemory/backends/gotcha.cpp
+6 −0 source/timemory/backends/gotcha.hpp
+6 −1 source/timemory/components/cupti/cupti_pcsampling.cpp
+4 −0 source/timemory/components/cupti/cupti_pcsampling.hpp
+13 −5 source/timemory/components/gotcha/components.cpp
+8 −4 source/timemory/components/ompt/configure.hpp
+7 −2 source/timemory/components/ompt/start_tool.hpp
+1 −1 source/timemory/components/ompt/tool.hpp
+3 −1 source/timemory/components/ompt/types.hpp
+5 −6 source/timemory/environment/declaration.hpp
+2 −1 source/timemory/environment/definition.hpp
+25 −6 source/timemory/log/macros.hpp
+5 −3 source/timemory/math/plus.hpp
+6 −0 source/timemory/operations/types.hpp
+17 −141 source/timemory/plotting/declaration.hpp
+4 −95 source/timemory/plotting/definition.hpp
+16 −9 source/timemory/plotting/macros.hpp
+184 −0 source/timemory/plotting/plotting.cpp
+16 −21 source/timemory/plotting/types.hpp
+18 −22 source/timemory/settings/macros.hpp
+86 −70 source/timemory/settings/settings.cpp
+55 −55 source/timemory/settings/settings.hpp
+3 −4 source/timemory/settings/tsettings.hpp
+5 −4 source/timemory/settings/types.hpp
+3 −3 source/timemory/settings/vsettings.hpp
+22 −18 source/timemory/signals/signal_handlers.cpp
+9 −1 source/timemory/signals/signal_settings.cpp
+84 −143 source/timemory/storage/graph.hpp
+1 −2 source/timemory/utility/argparse.hpp
+2 −2 source/timemory/utility/filepath.cpp
+17 −2 source/timemory/utility/launch_process.cpp
+2 −2 source/timemory/utility/launch_process.hpp
+6 −3 source/timemory/utility/popen.cpp
1 change: 1 addition & 0 deletions source/lib/common/defines.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
#define OMNITRACE_INLINE OMNITRACE_ATTRIBUTE(always_inline) inline
#define OMNITRACE_NOINLINE OMNITRACE_ATTRIBUTE(noinline)
#define OMNITRACE_HOT OMNITRACE_ATTRIBUTE(hot)
#define OMNITRACE_COLD OMNITRACE_ATTRIBUTE(cold)
#define OMNITRACE_CONST OMNITRACE_ATTRIBUTE(const)
#define OMNITRACE_PURE OMNITRACE_ATTRIBUTE(pure)
#define OMNITRACE_WEAK OMNITRACE_ATTRIBUTE(weak)
Expand Down
132 changes: 100 additions & 32 deletions source/lib/omnitrace-dl/dl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
#include "common/join.hpp"
#include "common/setup.hpp"
#include "dl.hpp"
#include "omnitrace/categories.h"
#include "omnitrace/types.h"

#include <cassert>
#include <gnu/libc-version.h>
Expand Down Expand Up @@ -256,6 +258,10 @@ struct OMNITRACE_HIDDEN_API indirect
OMNITRACE_DLSYM(omnitrace_pop_trace_f, m_omnihandle, "omnitrace_pop_trace");
OMNITRACE_DLSYM(omnitrace_push_region_f, m_omnihandle, "omnitrace_push_region");
OMNITRACE_DLSYM(omnitrace_pop_region_f, m_omnihandle, "omnitrace_pop_region");
OMNITRACE_DLSYM(omnitrace_push_category_region_f, m_omnihandle,
"omnitrace_push_category_region");
OMNITRACE_DLSYM(omnitrace_pop_category_region_f, m_omnihandle,
"omnitrace_pop_category_region");
OMNITRACE_DLSYM(omnitrace_register_source_f, m_omnihandle,
"omnitrace_register_source");
OMNITRACE_DLSYM(omnitrace_register_coverage_f, m_omnihandle,
Expand Down Expand Up @@ -330,37 +336,43 @@ struct OMNITRACE_HIDDEN_API indirect

if(omnitrace_user_configure_f)
{
(*omnitrace_user_configure_f)(
OMNITRACE_USER_START_STOP,
reinterpret_cast<void*>(&omnitrace_user_start_trace_dl),
reinterpret_cast<void*>(&omnitrace_user_stop_trace_dl));
(*omnitrace_user_configure_f)(
OMNITRACE_USER_START_STOP_THREAD,
reinterpret_cast<void*>(&omnitrace_user_start_thread_trace_dl),
reinterpret_cast<void*>(&omnitrace_user_stop_thread_trace_dl));
(*omnitrace_user_configure_f)(
OMNITRACE_USER_REGION,
reinterpret_cast<void*>(&omnitrace_user_push_region_dl),
reinterpret_cast<void*>(&omnitrace_user_pop_region_dl));
omnitrace_user_callbacks_t _cb = {};
_cb.start_trace = &omnitrace_user_start_trace_dl;
_cb.stop_trace = &omnitrace_user_stop_trace_dl;
_cb.start_thread_trace = &omnitrace_user_start_thread_trace_dl;
_cb.stop_thread_trace = &omnitrace_user_stop_thread_trace_dl;
_cb.push_region = &omnitrace_user_push_region_dl;
_cb.pop_region = &omnitrace_user_pop_region_dl;
_cb.push_annotated_region = &omnitrace_user_push_annotated_region_dl;
_cb.pop_annotated_region = &omnitrace_user_pop_annotated_region_dl;
(*omnitrace_user_configure_f)(OMNITRACE_USER_REPLACE_CONFIG, _cb, nullptr);
}
}

public:
// omnitrace functions
void (*omnitrace_init_library_f)(void) = nullptr;
void (*omnitrace_init_tooling_f)(void) = nullptr;
void (*omnitrace_init_f)(const char*, bool, const char*) = nullptr;
void (*omnitrace_finalize_f)(void) = nullptr;
void (*omnitrace_set_env_f)(const char*, const char*) = nullptr;
void (*omnitrace_set_mpi_f)(bool, bool) = nullptr;
using user_cb_t = omnitrace_user_callbacks_t;

// libomnitrace functions
void (*omnitrace_init_library_f)(void) = nullptr;
void (*omnitrace_init_tooling_f)(void) = nullptr;
void (*omnitrace_init_f)(const char*, bool, const char*) = nullptr;
void (*omnitrace_finalize_f)(void) = nullptr;
void (*omnitrace_set_env_f)(const char*, const char*) = nullptr;
void (*omnitrace_set_mpi_f)(bool, bool) = nullptr;
void (*omnitrace_register_source_f)(const char*, const char*, size_t, size_t,
const char*) = nullptr;
void (*omnitrace_register_coverage_f)(const char*, const char*, size_t) = nullptr;
void (*omnitrace_push_trace_f)(const char*) = nullptr;
void (*omnitrace_pop_trace_f)(const char*) = nullptr;
int (*omnitrace_push_region_f)(const char*) = nullptr;
int (*omnitrace_pop_region_f)(const char*) = nullptr;
int (*omnitrace_user_configure_f)(int, void*, void*) = nullptr;
const char*) = nullptr;
void (*omnitrace_register_coverage_f)(const char*, const char*, size_t) = nullptr;
void (*omnitrace_push_trace_f)(const char*) = nullptr;
void (*omnitrace_pop_trace_f)(const char*) = nullptr;
int (*omnitrace_push_region_f)(const char*) = nullptr;
int (*omnitrace_pop_region_f)(const char*) = nullptr;
int (*omnitrace_push_category_region_f)(omnitrace_category_t, const char*,
omnitrace_annotation_t*, size_t) = nullptr;
int (*omnitrace_pop_category_region_f)(omnitrace_category_t, const char*,
omnitrace_annotation_t*, size_t) = nullptr;

// libomnitrace-user functions
int (*omnitrace_user_configure_f)(int, user_cb_t, user_cb_t*) = nullptr;

// KokkosP functions
void (*kokkosp_print_help_f)(char*) = nullptr;
Expand Down Expand Up @@ -626,30 +638,66 @@ extern "C"
}
}

void omnitrace_push_region(const char* name)
int omnitrace_push_region(const char* name)
{
if(!dl::get_active()) return;
if(!dl::get_active()) return 0;
if(dl::get_thread_enabled())
{
OMNITRACE_DL_INVOKE(get_indirect().omnitrace_push_region_f, name);
return OMNITRACE_DL_INVOKE(get_indirect().omnitrace_push_region_f, name);
}
else
{
++dl::get_thread_count();
}
return 0;
}

void omnitrace_pop_region(const char* name)
int omnitrace_pop_region(const char* name)
{
if(!dl::get_active()) return;
if(!dl::get_active()) return 0;
if(dl::get_thread_enabled())
{
OMNITRACE_DL_INVOKE(get_indirect().omnitrace_pop_region_f, name);
return OMNITRACE_DL_INVOKE(get_indirect().omnitrace_pop_region_f, name);
}
else
{
if(dl::get_thread_count()-- == 0) omnitrace_user_start_thread_trace_dl();
}
return 0;
}

int omnitrace_push_category_region(omnitrace_category_t _category, const char* name,
omnitrace_annotation_t* _annotations,
size_t _annotation_count)
{
if(!dl::get_active()) return 0;
if(dl::get_thread_enabled())
{
return OMNITRACE_DL_INVOKE(get_indirect().omnitrace_push_category_region_f,
_category, name, _annotations, _annotation_count);
}
else
{
++dl::get_thread_count();
}
return 0;
}

int omnitrace_pop_category_region(omnitrace_category_t _category, const char* name,
omnitrace_annotation_t* _annotations,
size_t _annotation_count)
{
if(!dl::get_active()) return 0;
if(dl::get_thread_enabled())
{
return OMNITRACE_DL_INVOKE(get_indirect().omnitrace_pop_category_region_f,
_category, name, _annotations, _annotation_count);
}
else
{
++dl::get_thread_count();
}
return 0;
}

void omnitrace_set_env(const char* a, const char* b)
Expand Down Expand Up @@ -724,6 +772,26 @@ extern "C"
return OMNITRACE_DL_INVOKE(get_indirect().omnitrace_pop_region_f, name);
}

int omnitrace_user_push_annotated_region_dl(const char* name,
omnitrace_annotation_t* _annotations,
size_t _annotation_count)
{
if(!dl::get_active()) return 0;
return OMNITRACE_DL_INVOKE(get_indirect().omnitrace_push_category_region_f,
OMNITRACE_CATEGORY_USER, name, _annotations,
_annotation_count);
}

int omnitrace_user_pop_annotated_region_dl(const char* name,
omnitrace_annotation_t* _annotations,
size_t _annotation_count)
{
if(!dl::get_active()) return 0;
return OMNITRACE_DL_INVOKE(get_indirect().omnitrace_pop_category_region_f,
OMNITRACE_CATEGORY_USER, name, _annotations,
_annotation_count);
}

//----------------------------------------------------------------------------------//
//
// KokkosP
Expand Down
18 changes: 15 additions & 3 deletions source/lib/omnitrace-dl/dl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
// SOFTWARE.

#ifndef OMNITRACE_DL_HPP_
#define OMNITRACE_DL_HPP_ 1
#define OMNITRACE_DL_HPP_

#if defined(OMNITRACE_DL_SOURCE) && (OMNITRACE_DL_SOURCE > 0)
# include "common/defines.h"
Expand Down Expand Up @@ -78,8 +78,15 @@ extern "C"
void omnitrace_set_mpi(bool use, bool attached) OMNITRACE_PUBLIC_API;
void omnitrace_push_trace(const char* name) OMNITRACE_PUBLIC_API;
void omnitrace_pop_trace(const char* name) OMNITRACE_PUBLIC_API;
void omnitrace_push_region(const char*) OMNITRACE_PUBLIC_API;
void omnitrace_pop_region(const char*) OMNITRACE_PUBLIC_API;
int omnitrace_push_region(const char*) OMNITRACE_PUBLIC_API;
int omnitrace_pop_region(const char*) OMNITRACE_PUBLIC_API;
int omnitrace_push_category_region(omnitrace_category_t, const char*,
omnitrace_annotation_t*,
size_t) OMNITRACE_PUBLIC_API;
int omnitrace_pop_category_region(omnitrace_category_t, const char*,
omnitrace_annotation_t*,
size_t) OMNITRACE_PUBLIC_API;

void omnitrace_register_source(const char* file, const char* func, size_t line,
size_t address,
const char* source) OMNITRACE_PUBLIC_API;
Expand All @@ -99,6 +106,11 @@ extern "C"
int omnitrace_user_push_region_dl(const char*) OMNITRACE_HIDDEN_API;
int omnitrace_user_pop_region_dl(const char*) OMNITRACE_HIDDEN_API;

int omnitrace_user_push_annotated_region_dl(const char*, omnitrace_annotation_t*,
size_t) OMNITRACE_HIDDEN_API;
int omnitrace_user_pop_annotated_region_dl(const char*, omnitrace_annotation_t*,
size_t) OMNITRACE_HIDDEN_API;

// KokkosP
struct OMNITRACE_HIDDEN_API SpaceHandle
{
Expand Down
8 changes: 5 additions & 3 deletions source/lib/omnitrace-user/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,11 @@ set_target_properties(

omnitrace_strip_target(omnitrace-user-library)

install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/omnitrace/user.h
${CMAKE_CURRENT_SOURCE_DIR}/omnitrace/types.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/omnitrace)
install(
FILES ${CMAKE_CURRENT_SOURCE_DIR}/omnitrace/user.h
${CMAKE_CURRENT_SOURCE_DIR}/omnitrace/types.h
${CMAKE_CURRENT_SOURCE_DIR}/omnitrace/categories.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/omnitrace)

install(
TARGETS omnitrace-user-library
Expand Down
Loading