Misc fixes before v1.8.0 release (#239)

* Update timemory submodule for OMPT

- Updated OMPT support for OpenMP 5.2

* omnitrace exe cleanup

- fixed "omnitrace --" segfault
- added nullptr checks

* CMake updates

- moved omnitrace-interface-library definition up a directory
- general cleanup
- fixed branch/tag/ref for git submodule checkouts

* Improve shutdown of causal profiling after duration limit

* Fix dyninst minimum version number

* Removed debug print from binary::get_link_map

* Remove use of thread-pool in causal

* Relax causal testing when variance is high

* causal_gotcha utilities for blocking signals

* Tweak to causal example

* Install validate-causal-json as omnitrace-causal-print

* simplify address_multirange

* improve causal line saving
This commit is contained in:
Jonathan R. Madsen
2023-02-08 11:54:45 -06:00
committed by GitHub
parent 32b15fe7b7
commit aadffbe2b1
21 changed files with 244 additions and 96 deletions
+3 -47
View File
@@ -1,47 +1,3 @@
# ------------------------------------------------------------------------------#
#
# omnitrace interface library
#
# ------------------------------------------------------------------------------#
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.20)
cmake_policy(SET CMP0115 NEW)
endif()
add_library(omnitrace-interface-library INTERFACE)
add_library(omnitrace::omnitrace-interface-library ALIAS omnitrace-interface-library)
target_include_directories(
omnitrace-interface-library INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR})
target_compile_definitions(omnitrace-interface-library
INTERFACE OMNITRACE_MAX_THREADS=${OMNITRACE_MAX_THREADS})
target_link_libraries(
omnitrace-interface-library
INTERFACE
$<BUILD_INTERFACE:omnitrace::omnitrace-headers>
$<BUILD_INTERFACE:omnitrace::omnitrace-threading>
$<BUILD_INTERFACE:omnitrace::omnitrace-common-library>
$<BUILD_INTERFACE:omnitrace::omnitrace-compile-options>
$<BUILD_INTERFACE:omnitrace::omnitrace-compile-definitions>
$<BUILD_INTERFACE:omnitrace::omnitrace-perfetto>
$<BUILD_INTERFACE:omnitrace::omnitrace-timemory>
$<BUILD_INTERFACE:omnitrace::omnitrace-elfutils>
$<BUILD_INTERFACE:omnitrace::omnitrace-bfd>
$<BUILD_INTERFACE:omnitrace::omnitrace-mpi>
$<BUILD_INTERFACE:omnitrace::omnitrace-ptl>
$<BUILD_INTERFACE:omnitrace::omnitrace-hip>
$<BUILD_INTERFACE:omnitrace::omnitrace-roctracer>
$<BUILD_INTERFACE:omnitrace::omnitrace-rocprofiler>
$<BUILD_INTERFACE:omnitrace::omnitrace-rocm-smi>
$<BUILD_INTERFACE:omnitrace::omnitrace-rccl>
$<BUILD_INTERFACE:omnitrace::omnitrace-static-libgcc-optional>
$<BUILD_INTERFACE:omnitrace::omnitrace-static-libstdcxx-optional>
$<BUILD_INTERFACE:omnitrace::omnitrace-sanitizer>
$<BUILD_INTERFACE:$<IF:$<BOOL:${OMNITRACE_BUILD_LTO}>,omnitrace::omnitrace-lto,>>)
# ------------------------------------------------------------------------------#
#
# omnitrace object library
@@ -69,7 +25,7 @@ endif()
# ------------------------------------------------------------------------------#
#
# omnitrace shared library
# omnitrace static library
#
# ------------------------------------------------------------------------------#
@@ -79,7 +35,7 @@ add_library(omnitrace::libomnitrace-static ALIAS omnitrace-static-library)
target_link_libraries(
omnitrace-static-library
PRIVATE omnitrace::omnitrace-interface-library omnitrace::omnitrace-core
omnitrace::omnitrace-core omnitrace::omnitrace-binary)
omnitrace::omnitrace-binary)
set_target_properties(omnitrace-static-library PROPERTIES OUTPUT_NAME omnitrace)
@@ -96,7 +52,7 @@ add_library(omnitrace::omnitrace-library ALIAS omnitrace-shared-library)
target_link_libraries(
omnitrace-shared-library
PRIVATE omnitrace::omnitrace-interface-library omnitrace::omnitrace-core
omnitrace::omnitrace-core omnitrace::omnitrace-binary)
omnitrace::omnitrace-binary)
set_target_properties(
omnitrace-shared-library
@@ -37,6 +37,7 @@
#include <timemory/components/timing/backends.hpp>
#include <timemory/components/timing/wall_clock.hpp>
#include <timemory/mpl/concepts.hpp>
#include <timemory/mpl/type_traits.hpp>
#include <timemory/mpl/types.hpp>
#include <timemory/process/threading.hpp>
#include <timemory/units.hpp>
@@ -126,7 +127,8 @@ backtrace::sample(int _sig)
// update the last sample for backtrace signal(s) even when in use
static thread_local int64_t _last_sample = 0;
if(is_in_use())
if(is_in_use() ||
OMNITRACE_UNLIKELY(!trait::runtime_enabled<causal::component::backtrace>::get()))
{
if(_sig == get_realtime_signal()) _last_sample = tracing::now();
return;
@@ -26,6 +26,7 @@
#include "library/causal/components/unblocking_gotcha.hpp"
#include <timemory/backends/threading.hpp>
#include <timemory/signals/signal_mask.hpp>
#include <timemory/utility/macros.hpp>
#include <timemory/utility/types.hpp>
@@ -40,6 +41,8 @@ namespace component
{
namespace
{
namespace signals = ::tim::signals;
using bundle_t = tim::lightweight_tuple<blocking_gotcha_t, unblocking_gotcha_t>;
auto&
@@ -50,6 +53,13 @@ get_bundle()
return _v;
}
const auto&
sampling_signals()
{
static auto _v = get_sampling_signals();
return _v;
}
bool is_configured = false;
} // namespace
@@ -90,6 +100,31 @@ causal_gotcha::stop()
get_bundle()->stop();
shutdown();
}
void
causal_gotcha::block_signals()
{
signals::block_signals(sampling_signals(), signals::sigmask_scope::thread);
}
void
causal_gotcha::unblock_signals()
{
signals::unblock_signals(sampling_signals(), signals::sigmask_scope::thread);
}
void
causal_gotcha::remove_signals(sigset_t* _set)
{
for(auto _sig : sampling_signals())
{
if(sigismember(_set, _sig) != 0) sigdelset(_set, _sig);
}
if(sigismember(_set, SIGSEGV) != 0) sigdelset(_set, SIGSEGV);
if(sigismember(_set, SIGABRT) != 0) sigdelset(_set, SIGABRT);
}
} // namespace component
} // namespace causal
} // namespace omnitrace
@@ -48,6 +48,10 @@ struct causal_gotcha : tim::component::base<causal_gotcha, void>
static void start();
static void stop();
static void block_signals();
static void unblock_signals();
static void remove_signals(sigset_t*);
};
} // namespace component
} // namespace causal
+8 -7
View File
@@ -424,7 +424,13 @@ void
compute_eligible_lines()
{
static auto _once = std::once_flag{};
std::call_once(_once, compute_eligible_lines_impl);
std::call_once(_once, []() {
compute_eligible_lines_impl();
auto _cfg = settings::compose_filename_config{};
_cfg.subdirectory = "causal/binary-info";
_cfg.use_suffix = config::get_use_pid();
save_line_info(_cfg, config::get_verbose());
});
}
void
@@ -435,7 +441,7 @@ perform_experiment_impl(std::shared_ptr<std::promise<void>> _started) // NOLINT
using duration_sec_t = std::chrono::duration<double, std::ratio<1>>;
const auto& _thr_info = thread_info::init(true);
OMNITRACE_SCOPED_THREAD_STATE(ThreadState::Internal);
set_thread_state(ThreadState::Disabled);
OMNITRACE_CONDITIONAL_THROW(!_thr_info->is_offset,
"Error! causal profiling thread should be offset");
@@ -919,11 +925,6 @@ start_experimenting()
compute_eligible_lines();
auto _cfg = settings::compose_filename_config{};
_cfg.subdirectory = "causal/binary-info";
_cfg.use_suffix = config::get_use_pid();
save_line_info(_cfg, config::get_verbose());
if(get_state() < State::Finalized)
{
OMNITRACE_SCOPED_SAMPLING_ON_CHILD_THREADS(false);
@@ -23,6 +23,7 @@
#include "library/causal/delay.hpp"
#include "core/state.hpp"
#include "core/utility.hpp"
#include "library/causal/components/causal_gotcha.hpp"
#include "library/causal/experiment.hpp"
#include "library/runtime.hpp"
#include "library/thread_data.hpp"
@@ -108,10 +109,12 @@ delay::process()
}
else if(get_global() > get_local())
{
::omnitrace::causal::component::causal_gotcha::block_signals();
auto _beg = tracing::now();
std::this_thread::sleep_for(
std::chrono::nanoseconds{ get_global() - get_local() });
get_local() += (tracing::now() - _beg);
::omnitrace::causal::component::causal_gotcha::unblock_signals();
}
}
else
@@ -25,6 +25,7 @@
#include "core/concepts.hpp"
#include "core/config.hpp"
#include "core/debug.hpp"
#include "core/locking.hpp"
#include "core/state.hpp"
#include "core/utility.hpp"
#include "library/causal/components/backtrace.hpp"
@@ -172,12 +173,10 @@ causal_offload_buffer(int64_t, causal_sampler_buffer_t&& _buf)
if(!_processed.empty())
{
tasking::general::get_task_group().exec([_processed]() {
static std::mutex _mutex;
auto _lk = std::scoped_lock<std::mutex>{ _mutex };
for(const auto& itr : _processed)
add_samples(itr.first, itr.second);
});
static auto _mutex = locking::atomic_mutex{};
auto _lk = locking::atomic_lock{ _mutex };
for(const auto& itr : _processed)
add_samples(itr.first, itr.second);
}
}
@@ -252,11 +251,16 @@ configure(bool _setup, int64_t _tid)
for(int64_t i = 1; i < OMNITRACE_MAX_THREADS; ++i)
{
if(get_causal_sampler(i)) get_causal_sampler(i)->reset();
if(get_causal_sampler(i))
{
get_causal_sampler(i)->stop();
get_causal_sampler(i)->reset();
}
}
}
_causal->stop();
_causal->reset();
OMNITRACE_DEBUG("Causal sampler destroyed for thread %lu\n", _tid);
}
@@ -293,11 +297,13 @@ void
block_samples()
{
trait::runtime_enabled<causal_sampler_t>::set(false);
trait::runtime_enabled<causal::component::backtrace>::set(false);
}
void
unblock_samples()
{
trait::runtime_enabled<causal::component::backtrace>::set(true);
trait::runtime_enabled<causal_sampler_t>::set(true);
}
@@ -327,6 +333,8 @@ post_process()
OMNITRACE_VERBOSE(2 || get_debug_sampling(),
"Stopping causal sampling components...\n");
block_samples();
for(size_t i = 0; i < max_supported_threads; ++i)
{
auto& _causal = get_causal_sampler(i);