From c9d3b1282d98b1ba52a1e0d939d4a3c2d9805b34 Mon Sep 17 00:00:00 2001 From: David Poliakoff Date: Wed, 21 Apr 2021 12:50:09 -0600 Subject: [PATCH 1/2] Add handling for metadata in a Kokkos-specific Adiak service --- src/caliper/controllers/controllers.cpp | 2 +- src/services/kokkos/CMakeLists.txt | 8 +- src/services/kokkos/KokkosMetadataService.cpp | 87 +++++++++++++++++++ .../kokkos/KokkosProfilingSymbols.cpp | 3 + src/services/kokkos/types.hpp | 9 +- 5 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 src/services/kokkos/KokkosMetadataService.cpp diff --git a/src/caliper/controllers/controllers.cpp b/src/caliper/controllers/controllers.cpp index 198671184..a43c94f4a 100644 --- a/src/caliper/controllers/controllers.cpp +++ b/src/caliper/controllers/controllers.cpp @@ -152,7 +152,7 @@ const char* builtin_option_specs = " \"type\" : \"bool\"," " \"description\" : \"Profile Kokkos functions\"," " \"category\" : \"region\"," - " \"services\" : [ \"kokkostime\" ]" + " \"services\" : [ \"kokkostime\", \"kokkosadiak\" ]" "}," "{" " \"name\" : \"main_thread_only\"," diff --git a/src/services/kokkos/CMakeLists.txt b/src/services/kokkos/CMakeLists.txt index aac0cccd8..9dc4090f3 100644 --- a/src/services/kokkos/CMakeLists.txt +++ b/src/services/kokkos/CMakeLists.txt @@ -2,8 +2,12 @@ set(CALIPER_KOKKOS_SOURCES KokkosProfilingSymbols.cpp KokkosLookup.cpp KokkosTime.cpp -) - + ) +if(WITH_ADIAK) +include_directories(${adiak_INCLUDE_DIRS}) + list(APPEND CALIPER_KOKKOS_SOURCES "KokkosMetadataService.cpp") + add_caliper_service("kokkosadiak") +endif() add_library(caliper-kokkos OBJECT ${CALIPER_KOKKOS_SOURCES}) add_service_objlib("caliper-kokkos") diff --git a/src/services/kokkos/KokkosMetadataService.cpp b/src/services/kokkos/KokkosMetadataService.cpp new file mode 100644 index 000000000..a53348205 --- /dev/null +++ b/src/services/kokkos/KokkosMetadataService.cpp @@ -0,0 +1,87 @@ +// +// Created by Poliakoff, David Zoeller on 4/21/21. +// + +#include "caliper/CaliperService.h" + +#include "caliper/Caliper.h" +#include "../../caliper/MemoryPool.h" + +#include "caliper/common/Log.h" +#include "caliper/common/RuntimeConfig.h" +#include "caliper/Annotation.h" + +#include +#include + +#include "types.hpp" +#include "adiak.hpp" +using namespace cali; + +namespace { + + class KokkosAdiak { + static const ConfigSet::Entry s_configdata[]; + + KokkosAdiak(Caliper *c, Channel *chn) { + adiak::user(); + adiak::launchdate(); + adiak::executablepath(); + adiak::libraries(); + adiak::cmdline(); + adiak::clustername(); + adiak::jobsize(); + } + + public: + + void declare(const char* key, const char* value){ + std::string parseme(value); + try { + size_t end; + float v = std::stof(parseme,&end); + adiak::value(key, v); + return; + } + catch(std::invalid_argument){ + } + try { + size_t end; + int i = std::stoi(parseme,&end); + adiak::value(key, i); + return; + } + catch(std::invalid_argument){ + } + adiak::value(key,value); + } + static void kokkosadiak_register(Caliper *c, Channel *chn) { + + auto *instance = new KokkosAdiak(c, chn); + chn->events().post_init_evt.connect( + [instance](Caliper *c, Channel *chn) { + kokkosp_callbacks.kokkosp_declare_metadata.connect([&](const char* name, const char* value){ + instance->declare(name,value); + }); + }); + chn->events().finish_evt.connect( + [instance](Caliper*, Channel*){ + delete instance; + }); + + Log(1).stream() << chn->name() << ": Registered kokkosadiak service" << std::endl; + } + }; + + const ConfigSet::Entry KokkosAdiak::s_configdata[] = { + ConfigSet::Terminator + }; + +} // namespace [anonymous] + + +namespace cali { + + CaliperService kokkosadiak_service{"kokkosadiak", ::KokkosAdiak::kokkosadiak_register}; + +} diff --git a/src/services/kokkos/KokkosProfilingSymbols.cpp b/src/services/kokkos/KokkosProfilingSymbols.cpp index 51b594107..434972d39 100644 --- a/src/services/kokkos/KokkosProfilingSymbols.cpp +++ b/src/services/kokkos/KokkosProfilingSymbols.cpp @@ -105,3 +105,6 @@ kokkosp_begin_deep_copy(const SpaceHandle dst_handle, const char *dst_name, extern "C" void kokkosp_end_deep_copy() { kokkosp_callbacks.kokkosp_end_deep_copy_callback(); } +extern "C" void kokkosp_declare_metadata(const char* key, const char* value){ + kokkosp_callbacks.kokkosp_declare_metadata(key, value); +} \ No newline at end of file diff --git a/src/services/kokkos/types.hpp b/src/services/kokkos/types.hpp index 932f89e49..322b642ed 100644 --- a/src/services/kokkos/types.hpp +++ b/src/services/kokkos/types.hpp @@ -32,8 +32,9 @@ namespace kokkos { using end_deep_copy_callback = util::callback; using begin_fence_callback = util::callback; - using end_fence_callback = util::callback; - struct callbacks { + using end_fence_callback = util::callback; + using metadata_callback = util::callback; + struct callbacks { init_callback kokkosp_init_callback; finalize_callback kokkosp_finalize_callback; @@ -58,7 +59,9 @@ namespace kokkos { begin_fence_callback kokkosp_begin_fence_callback; end_fence_callback kokkosp_end_fence_callback; - }; + + metadata_callback kokkosp_declare_metadata; + }; } // end namespace kokkos From 88e537a40fa9a8a7a52f6cb23918a4cad4d49e2b Mon Sep 17 00:00:00 2001 From: David Poliakoff Date: Wed, 21 Apr 2021 14:27:00 -0600 Subject: [PATCH 2/2] Added adiak_init --- src/services/kokkos/KokkosMetadataService.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/kokkos/KokkosMetadataService.cpp b/src/services/kokkos/KokkosMetadataService.cpp index a53348205..63bbcdc8f 100644 --- a/src/services/kokkos/KokkosMetadataService.cpp +++ b/src/services/kokkos/KokkosMetadataService.cpp @@ -24,6 +24,7 @@ namespace { static const ConfigSet::Entry s_configdata[]; KokkosAdiak(Caliper *c, Channel *chn) { + adiak_init(nullptr); adiak::user(); adiak::launchdate(); adiak::executablepath();