From a78150c99b119edf99f97bd86c23504d6bf9ee44 Mon Sep 17 00:00:00 2001 From: Kevin Huck Date: Mon, 12 Aug 2019 16:43:14 -0700 Subject: [PATCH] Adding perfstubs implementation. Needs work. --- CMakeLists.txt | 19 ++++ src/apex/CMakeLists.standalone | 2 +- src/apex/perftool_implementation.cpp | 141 +++++++++++++++++++++++++++ 3 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 src/apex/perftool_implementation.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f5598b7e..e2dc0aa3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -669,6 +669,25 @@ else() "Try manually check out https://github.com/cameron314/concurrentqueue.git to ${PROJECT_SOURCE_DIR}") endif() +### Set up perfstubs stuff +git_external(perfstubs + https://github.com/khuck/perfstubs.git + master + VERBOSE) + +find_file( + PERFSTUBS_HEADER + NAMES perfstubs_api/Tool.h + PATHS ${PROJECT_SOURCE_DIR}/perfstubs) + +if(PERFSTUBS_HEADER) + message(INFO " Found perfstubs at ${PROJECT_SOURCE_DIR}/perfstubs") + include_directories(${PROJECT_SOURCE_DIR}) +else() + message(FATAL_ERROR " perfstubs not found. This should have been checked out automatically. " + "Try manually check out https://github.com/khuck/perfstubs.git to ${PROJECT_SOURCE_DIR}") +endif() + if(USE_PLUGINS) message(INFO " apex will be built with plugin support.") set(LIBS ${LIBS} ${CMAKE_DL_LIBS}) diff --git a/src/apex/CMakeLists.standalone b/src/apex/CMakeLists.standalone index e7b645cc..bf9a2c9b 100644 --- a/src/apex/CMakeLists.standalone +++ b/src/apex/CMakeLists.standalone @@ -25,7 +25,7 @@ if (OTF2_FOUND) SET(OTF2_SOURCE otf2_listener.cpp) endif(OTF2_FOUND) -SET(all_SOURCE task_identifier.cpp apex.cpp thread_instance.cpp event_listener.cpp concurrency_handler.cpp policy_handler.cpp handler.cpp utils.cpp ${tau_SOURCE} profiler_listener.cpp ${bfd_SOURCE} apex_options.cpp apex_policies.cpp ${PROC_SOURCE} ${OMPT_SOURCE} ${SENSOR_SOURCE} ${OTF2_SOURCE}) +SET(all_SOURCE task_identifier.cpp apex.cpp thread_instance.cpp event_listener.cpp concurrency_handler.cpp policy_handler.cpp handler.cpp utils.cpp ${tau_SOURCE} profiler_listener.cpp ${bfd_SOURCE} apex_options.cpp apex_policies.cpp perftool_implementation.cpp ${PROC_SOURCE} ${OMPT_SOURCE} ${SENSOR_SOURCE} ${OTF2_SOURCE}) add_library (apex ${all_SOURCE}) add_library (taudummy tau_dummy.cpp) diff --git a/src/apex/perftool_implementation.cpp b/src/apex/perftool_implementation.cpp new file mode 100644 index 00000000..9acbb709 --- /dev/null +++ b/src/apex/perftool_implementation.cpp @@ -0,0 +1,141 @@ +// Copyright (c) 2014-2018 University of Oregon +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include "perfstubs/perfstubs_api/Tool.h" +#include +#include "apex.h" +#include "thread_instance.hpp" + +extern "C" { + // library function declarations + void perftool_init(void) { + apex_init("PerfStubs API", 0, 1); + } + void perftool_register_thread(void) { + apex_register_thread("PerfStubs Thread"); + } + void perftool_exit(void) { + apex_exit_thread(); + } + void perftool_dump(void) { + apex_dump(false); + } + + // measurement function declarations + void perftool_timer_start(const char *timer_name) { + apex_start(APEX_NAME_STRING, (void*)timer_name); + } + void perftool_timer_stop(const char *timer_name) { + apex_stop(apex::thread_instance::instance().get_current_profiler()); + } + void perftool_static_phase_start(const char *phase_name) { + apex_start(APEX_NAME_STRING, (void*)phase_name); + } + void perftool_static_phase_stop(const char *phase_name) { + apex_stop(apex::thread_instance::instance().get_current_profiler()); + } + void perftool_dynamic_phase_start(const char *iteration_prefix, + int iteration_number) { + std::stringstream ss; + ss << iteration_prefix << " " << iteration_number; + apex_start(APEX_NAME_STRING, (void*)(ss.str().c_str())); + } + void perftool_dynamic_phase_stop(const char *iteration_prefix, + int iteration_number) { + apex_stop(apex::thread_instance::instance().get_current_profiler()); + } + void perftool_sample_counter(const char *counter_name, double value) { + apex_sample_value(counter_name, value); + } + void perftool_metadata(const char *name, const char *value) { + // do nothing + } + + // data query function declarations + void perftool_get_timer_data(perftool_timer_data_t *timer_data) { + memset(timer_data, 0, sizeof(perftool_timer_data_t)); + } + void perftool_free_timer_data(perftool_timer_data_t *timer_data) { + if (timer_data == nullptr) + { + return; + } + if (timer_data->timer_names != nullptr) + { + free(timer_data->timer_names); + timer_data->timer_names = nullptr; + } + if (timer_data->metric_names != nullptr) + { + free(timer_data->metric_names); + timer_data->metric_names = nullptr; + } + if (timer_data->values != nullptr) + { + free(timer_data->values); + timer_data->values = nullptr; + } + } + void perftool_get_counter_data(perftool_counter_data_t *counter_data) { + memset(counter_data, 0, sizeof(perftool_counter_data_t)); + } + void perftool_free_counter_data(perftool_counter_data_t *counter_data) { + if (counter_data == nullptr) + { + return; + } + if (counter_data->counter_names != nullptr) + { + free(counter_data->counter_names); + counter_data->counter_names = nullptr; + } + if (counter_data->num_samples != nullptr) + { + free(counter_data->num_samples); + counter_data->num_samples = nullptr; + } + if (counter_data->value_total != nullptr) + { + free(counter_data->value_total); + counter_data->value_total = nullptr; + } + if (counter_data->value_min != nullptr) + { + free(counter_data->value_min); + counter_data->value_min = nullptr; + } + if (counter_data->value_max != nullptr) + { + free(counter_data->value_max); + counter_data->value_max = nullptr; + } + if (counter_data->value_sumsqr != nullptr) + { + free(counter_data->value_sumsqr); + counter_data->value_sumsqr = nullptr; + } + } + void perftool_get_metadata(perftool_metadata_t *metadata) { + memset(metadata, 0, sizeof(perftool_metadata_t)); + } + void perftool_free_metadata(perftool_metadata_t *metadata) { + if (metadata == nullptr) + { + return; + } + if (metadata->names != nullptr) + { + free(metadata->names); + metadata->names = nullptr; + } + if (metadata->values != nullptr) + { + free(metadata->values); + metadata->values = nullptr; + } + } + +} \ No newline at end of file