Skip to content

Commit

Permalink
Add ScopedProfileRegion
Browse files Browse the repository at this point in the history
Co-authored-by: Damien L-G <dalg24@gmail.com>
  • Loading branch information
aprokop and dalg24 committed Mar 6, 2023
1 parent a75aa23 commit 73de258
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 0 deletions.
48 changes: 48 additions & 0 deletions core/src/Kokkos_Profiling_ScopedProfileRegion.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//@HEADER
// ************************************************************************
//
// Kokkos v. 4.0
// Copyright (2022) National Technology & Engineering
// Solutions of Sandia, LLC (NTESS).
//
// Under the terms of Contract DE-NA0003525 with NTESS,
// the U.S. Government retains certain rights in this software.
//
// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions.
// See https://kokkos.org/LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//@HEADER

#ifndef KOKKOSP_SCOPED_PROFILE_REGION_HPP
#define KOKKOSP_SCOPED_PROFILE_REGION_HPP
#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
#define KOKKOS_IMPL_PUBLIC_INCLUDE
#define KOKKOS_IMPL_PUBLIC_INCLUDE_PROFILING_SCOPEDPROFILEREGION
#endif

#include <Kokkos_Macros.hpp>
#include <impl/Kokkos_Profiling.hpp>

#include <string>

namespace Kokkos::Profiling {

class ScopedProfileRegion {
public:
ScopedProfileRegion(ScopedProfileRegion const &) = delete;
ScopedProfileRegion &operator=(ScopedProfileRegion const &) = delete;

explicit ScopedProfileRegion(std::string const &name) {
Kokkos::Profiling::pushRegion(name);
}
~ScopedProfileRegion() { Kokkos::Profiling::popRegion(); }
};

} // namespace Kokkos::Profiling

#ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_CORE
#undef KOKKOS_IMPL_PUBLIC_INCLUDE
#undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_PROFILING_SCOPEDPROFILEREGION
#endif
#endif
1 change: 1 addition & 0 deletions core/unit_test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -922,6 +922,7 @@ KOKKOS_ADD_ADVANCED_TEST( UnitTest_PushFinalizeHook_terminate
tools/TestEventCorrectness.cpp
tools/TestWithoutInitializing.cpp
tools/TestProfilingSection.cpp
tools/TestScopedProfileRegion.cpp
)

# FIXME_OPENMPTARGET This test causes internal compiler errors as of 09/01/22
Expand Down
77 changes: 77 additions & 0 deletions core/unit_test/tools/TestScopedProfileRegion.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
//@HEADER
// ************************************************************************
//
// Kokkos v. 4.0
// Copyright (2022) National Technology & Engineering
// Solutions of Sandia, LLC (NTESS).
//
// Under the terms of Contract DE-NA0003525 with NTESS,
// the U.S. Government retains certain rights in this software.
//
// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions.
// See https://kokkos.org/LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//@HEADER

#include <Kokkos_Profiling_ScopedProfileRegion.hpp>

#include <gtest/gtest.h>

#include <string>
#include <stack>

namespace {

std::stack<std::string> test_region_stack;

// NOTE: cannot use lambdas because they can only be converted to function
// pointers if they don't capture anything
void test_push_region(char const *label) { test_region_stack.push(label); }

void test_pop_region() { test_region_stack.pop(); }

TEST(defaultdevicetype, scoped_profile_region) {
Kokkos::Tools::Experimental::set_push_region_callback(test_push_region);
Kokkos::Tools::Experimental::set_pop_region_callback(test_pop_region);

ASSERT_TRUE(test_region_stack.empty());

// Unnamed guard! Profile region is popped at the end of the statement.
Kokkos::Profiling::ScopedProfileRegion("bug");

ASSERT_TRUE(test_region_stack.empty());

{
std::string outer_identifier = "outer";
Kokkos::Profiling::ScopedProfileRegion guard_outer(outer_identifier);

ASSERT_EQ(test_region_stack.size(), 1u);
ASSERT_EQ(test_region_stack.top(), outer_identifier);

{
std::string inner_identifier = "inner";
Kokkos::Profiling::ScopedProfileRegion guard_inner(inner_identifier);
ASSERT_EQ(test_region_stack.size(), 2u);
ASSERT_EQ(test_region_stack.top(), inner_identifier);
}

ASSERT_EQ(test_region_stack.size(), 1u);
ASSERT_EQ(test_region_stack.top(), outer_identifier);
}

ASSERT_TRUE(test_region_stack.empty());

// Unset callbacks
Kokkos::Tools::Experimental::set_push_region_callback(nullptr);
Kokkos::Tools::Experimental::set_pop_region_callback(nullptr);
}

using Kokkos::Profiling::ScopedProfileRegion;
static_assert(!std::is_default_constructible<ScopedProfileRegion>::value);
static_assert(!std::is_copy_constructible<ScopedProfileRegion>::value);
static_assert(!std::is_move_constructible<ScopedProfileRegion>::value);
static_assert(!std::is_copy_assignable<ScopedProfileRegion>::value);
static_assert(!std::is_move_assignable<ScopedProfileRegion>::value);

} // namespace

0 comments on commit 73de258

Please sign in to comment.