kokkos-utils
0.0.5
Toggle main menu visibility
Loading...
Searching...
No Matches
test_Manager.cpp
Go to the documentation of this file.
1
#include "gmock/gmock.h"
2
#include "gtest/gtest.h"
3
4
#include "Kokkos_Core.hpp"
5
6
#include "
kokkos-utils/callbacks/Helpers.hpp
"
7
#include "
kokkos-utils/impl/type_traits.hpp
"
8
#include "
kokkos-utils/tests/scoped/ExecutionSpace.hpp
"
9
#include "
kokkos-utils/tests/scoped/callbacks/Manager.hpp
"
10
11
#include "
tests/callbacks/TestWorkload.hpp
"
12
21
22
using
execution_space
= Kokkos::DefaultExecutionSpace;
23
24
namespace
Kokkos::utils::tests::callbacks
25
{
26
27
using namespace
Kokkos::utils::callbacks;
28
30
constexpr
bool
test_singleton_traits
()
31
{
32
static_assert
( ! std::is_copy_constructible_v<Manager>);
33
static_assert
( ! std::is_copy_assignable_v <Manager>);
34
35
static_assert
( ! std::is_move_constructible_v<Manager>);
36
static_assert
( ! std::is_move_assignable_v <Manager>);
37
38
return
true
;
39
}
40
static_assert
(
test_singleton_traits
());
41
46
TEST
(
Manager
, initialize_finalize)
47
{
48
ASSERT_FALSE(
Manager::is_initialized
());
49
50
Manager::initialize
();
51
ASSERT_TRUE(
Manager::is_initialized
());
52
53
const
auto
* ptr = std::addressof(
Manager::get_instance
());
54
55
Manager::initialize
();
56
ASSERT_TRUE(
Manager::is_initialized
());
57
58
ASSERT_EQ(ptr, std::addressof(
Manager::get_instance
()));
59
60
Manager::initialize
();
61
ASSERT_TRUE(
Manager::is_initialized
());
62
63
ASSERT_EQ(ptr, std::addressof(
Manager::get_instance
()));
64
65
Manager::finalize
();
66
ASSERT_FALSE(
Manager::is_initialized
());
67
68
Manager::finalize
();
69
ASSERT_FALSE(
Manager::is_initialized
());
70
71
Manager::finalize
();
72
ASSERT_FALSE(
Manager::is_initialized
());
73
}
74
79
TEST
(
Manager
,
dispatch
) {
80
ASSERT_FALSE(
Manager::is_initialized
());
81
82
dispatch
(
ProfileEvent
{});
83
}
84
89
TEST
(
Manager
,
get_next_event_id
) {
90
ASSERT_FALSE(
Manager::is_initialized
());
91
92
ASSERT_EQ(
get_next_event_id
(),
EventTraits::invalid_event_id
);
93
94
Manager::initialize
();
95
96
ASSERT_TRUE(
Manager::is_initialized
());
97
98
ASSERT_NE(
get_next_event_id
(),
EventTraits::invalid_event_id
);
99
100
Manager::finalize
();
101
}
102
103
class
ManagerTest
:
public
::testing::Test,
104
public
scoped::callbacks::Manager
,
105
public
scoped::ExecutionSpace
<execution_space>
106
{};
107
115
template
<Event... EventTypes>
116
struct
TesterListener
117
{
118
template
<
Kokkos::utils::impl::IsTypeOneOf
<EventTypes...> EventType>
119
void
operator()
(
const
EventType& event) {
120
std::get<std::vector<EventType>>(
events
).push_back(event);
121
}
122
123
std::tuple<std::vector<EventTypes>...>
events
{};
124
};
125
127
TEST_F
(
ManagerTest
, dispatch_to_call_operators_of_single_listener)
128
{
129
const
auto
tester_listener = std::make_shared<TesterListener<BeginParallelForEvent, EndParallelForEvent, BeginFenceEvent>>();
130
131
Kokkos::utils::callbacks::Manager::register_listener
(tester_listener);
132
133
MyWorkload<execution_space>
{}.
execute
(exec);
134
135
Kokkos::utils::callbacks::Manager::unregister_listener
(tester_listener.get());
136
137
const
auto
& [begin_parallel_for_events, end_parallel_for_events, begin_fence_events] = tester_listener->events;
138
140
ASSERT_EQ(begin_parallel_for_events.size(), 1);
141
ASSERT_EQ(begin_parallel_for_events[0].name,
"computation - level 0 - pfor"
);
142
144
ASSERT_EQ(end_parallel_for_events.size(), 1);
145
ASSERT_EQ(begin_parallel_for_events[0].event_id, end_parallel_for_events[0].event_id);
146
148
ASSERT_GT(begin_fence_events.size(), 2);
149
ASSERT_THAT(
150
begin_fence_events,
151
::testing::Contains(::testing::Field(&
BeginFenceEvent::name
, ::testing::StrEq(
"computation - level 0 - fence after pfor"
)))
152
);
153
ASSERT_THAT(
154
begin_fence_events,
155
::testing::Contains(::testing::Field(&
BeginFenceEvent::name
, ::testing::StrEq(
"other fence after stopping the profile section"
)))
156
);
157
}
158
160
TEST_F
(
ManagerTest
, dispatch_to_call_operators_of_multiple_listeners)
161
{
162
const
auto
tester_listener_a = std::make_shared<TesterListener<BeginParallelForEvent>>();
163
const
auto
tester_listener_b = std::make_shared<TesterListener<BeginParallelForEvent, EndParallelForEvent>>();
164
165
Kokkos::utils::callbacks::Manager::register_listener
(tester_listener_a);
166
Kokkos::utils::callbacks::Manager::register_listener
(tester_listener_b);
167
168
MyWorkload<execution_space>
{}.
execute
(exec);
169
170
Kokkos::utils::callbacks::Manager::unregister_listener
(tester_listener_a.get());
171
Kokkos::utils::callbacks::Manager::unregister_listener
(tester_listener_b.get());
172
173
const
auto
& [begin_parallel_for_events_listener_a] = tester_listener_a->events;
174
const
auto
& [begin_parallel_for_events_listener_b, end_parallel_for_events_listener_b] = tester_listener_b->events;
175
177
ASSERT_EQ(begin_parallel_for_events_listener_a.size(), 1);
178
ASSERT_EQ(begin_parallel_for_events_listener_a[0].name,
"computation - level 0 - pfor"
);
179
ASSERT_EQ(begin_parallel_for_events_listener_b.size(), 1);
180
ASSERT_EQ(begin_parallel_for_events_listener_b[0].name,
"computation - level 0 - pfor"
);
181
183
ASSERT_EQ(end_parallel_for_events_listener_b.size(), 1);
184
ASSERT_EQ(begin_parallel_for_events_listener_b[0].event_id, end_parallel_for_events_listener_b[0].event_id);
185
}
186
188
TEST_F
(
ManagerTest
, listener_from_lambda)
189
{
190
bool
matched =
false
;
191
192
using
view_t = Kokkos::View<int, execution_space>;
193
194
const
view_t my_src_view(Kokkos::view_alloc(Kokkos::WithoutInitializing, exec,
"my rank-0 src view"
));
195
const
view_t my_dst_view(Kokkos::view_alloc(Kokkos::WithoutInitializing, exec,
"my rank-0 dst view"
));
196
197
const
auto
listener_handle =
Kokkos::utils::callbacks::Manager::register_listener
(
198
[&](
const
BeginDeepCopyEvent
& event) {
199
if
(event.
dst
.
size
==
sizeof
(
int
) && event.
src
.
ptr
== my_src_view.data()
200
&& event.
dst
.
ptr
== my_dst_view.data()) matched =
true
;
201
}
202
);
203
204
Kokkos::deep_copy(exec, my_dst_view, my_src_view);
205
206
ASSERT_TRUE(matched);
207
208
Kokkos::utils::callbacks::Manager::unregister_listener
(listener_handle);
209
}
210
211
}
// namespace Kokkos::utils::tests::callbacks
ExecutionSpace.hpp
TestWorkload.hpp
Kokkos::utils::callbacks::Manager
Class to manage Kokkos profiling callback calls.
Definition
Manager.hpp:141
Kokkos::utils::callbacks::Manager::unregister_listener
static void unregister_listener(const Callable *const callable)
Unregister a callable object as a listener.
Definition
Manager.hpp:197
Kokkos::utils::callbacks::Manager::get_instance
static Manager & get_instance()
Definition
Manager.hpp:166
Kokkos::utils::callbacks::Manager::initialize
static void initialize()
Definition
Manager.hpp:161
Kokkos::utils::callbacks::Manager::is_initialized
static bool is_initialized()
Definition
Manager.hpp:164
Kokkos::utils::callbacks::Manager::finalize
static void finalize()
Definition
Manager.hpp:162
Kokkos::utils::callbacks::Manager::register_listener
static listener_list_const_iter_t register_listener(std::shared_ptr< Callable > callable)
Register a callable object, passed as a shared pointer, as a listener.
Definition
Manager.hpp:174
Kokkos::utils::tests::callbacks::ManagerTest
Definition
test_Manager.cpp:106
Kokkos::utils::impl::IsTypeOneOf
Check if T is the same as one of the types Ts.
Definition
type_traits.hpp:37
Helpers.hpp
Kokkos::utils::callbacks::get_next_event_id
auto get_next_event_id() noexcept
If the Manager is initialized, return Manager::get_next_event_id. Otherwise, return EventTraits::inva...
Definition
Manager.hpp:492
Kokkos::utils::callbacks::dispatch
void dispatch(const EventType &event)
If the Manager is initialized, call Manager::dispatch with event.
Definition
Manager.hpp:486
Kokkos::utils::tests::callbacks
Definition
Helpers.hpp:7
Kokkos::utils::tests::callbacks::TEST_F
TEST_F(EnqueuedEventTimerTest, duration)
Definition
test_EnqueuedEventTimer.cpp:47
Kokkos::utils::tests::callbacks::test_singleton_traits
constexpr bool test_singleton_traits()
Definition
test_Manager.cpp:30
Kokkos::utils::tests::callbacks::TEST
TEST(EventTest, BeginEvent)
Definition
test_Events.cpp:28
Kokkos::utils::callbacks::AllocDescriptor::size
uint64_t size
Definition
Events.hpp:113
Kokkos::utils::callbacks::AllocDescriptor::ptr
const void * ptr
Definition
Events.hpp:112
Kokkos::utils::callbacks::BeginDeepCopyEvent
Begin-deep-copy event associated with Kokkos::Tools::Experimental::EventSet::begin_deep_copy.
Definition
Events.hpp:136
Kokkos::utils::callbacks::BeginDeepCopyEvent::src
AllocDescriptor src
Definition
Events.hpp:138
Kokkos::utils::callbacks::BeginDeepCopyEvent::dst
AllocDescriptor dst
Definition
Events.hpp:137
Kokkos::utils::callbacks::BeginFenceEvent::name
std::string name
Definition
Events.hpp:92
Kokkos::utils::callbacks::EventTraits::invalid_event_id
static constexpr event_id_t invalid_event_id
Definition
Events.hpp:17
Kokkos::utils::callbacks::ProfileEvent
Profile event associated with Kokkos::Tools::Experimental::EventSet::profile_event.
Definition
Events.hpp:198
Kokkos::utils::tests::callbacks::MyWorkload
Definition
TestWorkload.hpp:13
Kokkos::utils::tests::callbacks::MyWorkload::execute
void execute(const Exec &exec) const
Definition
TestWorkload.hpp:21
Kokkos::utils::tests::callbacks::TesterListener
Listener that stores the events it receives.
Definition
test_Manager.cpp:117
Kokkos::utils::tests::callbacks::TesterListener::operator()
void operator()(const EventType &event)
Definition
test_Manager.cpp:119
Kokkos::utils::tests::callbacks::TesterListener::events
std::tuple< std::vector< EventTypes >... > events
Definition
test_Manager.cpp:123
Kokkos::utils::tests::scoped::ExecutionSpace
Create a new execution space instance with RAII semantics.
Definition
ExecutionSpace.hpp:12
Kokkos::utils::tests::scoped::callbacks::Manager
Initializing and finalizing Kokkos::utils::callbacks::Manager in a RAII manner.
Definition
Manager.hpp:10
execution_space
Kokkos::DefaultExecutionSpace execution_space
Definition
test_InsertOp.cpp:8
Manager.hpp
type_traits.hpp
tests
callbacks
test_Manager.cpp
Generated on
for kokkos-utils by
1.18.0