1#include "gtest/gtest.h"
3#include "Kokkos_Macros.hpp"
4#ifdef KOKKOS_ENABLE_EXPERIMENTAL_CXX20_MODULES
7# include "Kokkos_Core.hpp"
39 return std::is_constant_evaluated();
80 static_assert(std::is_aggregate_v<typename ParallelForDataTest::data_t>);
81 static_assert(std::is_aggregate_v<typename ParallelForDataTest::labeled_data_t>);
82 static_assert(std::is_aggregate_v<typename ParallelForDataTest::multi_data_t>);
85 static_assert(std::is_nothrow_move_constructible_v<typename ParallelForDataTest::data_t>);
86 static_assert(std::is_nothrow_move_constructible_v<typename ParallelForDataTest::labeled_data_t>);
87 static_assert(std::is_nothrow_move_constructible_v<typename ParallelForDataTest::multi_data_t>);
91 std::same_as<typename ParallelForDataTest::data_t::functor_t, typename ParallelForDataTest::functor_t>);
92 static_assert(std::same_as<
97 std::same_as<typename ParallelForDataTest::data_t::properties_t, Kokkos::Execution::Impl::properties<>>);
98 static_assert(std::same_as<
115 static_assert(std::alignment_of_v<typename ParallelForDataTest::functor_t> == 1);
118 static_assert(std::alignment_of_v<typename ParallelForDataTest::iter_space_t> == 4);
120 static_assert(std::is_empty_v<typename ParallelForDataTest::functor_t>);
121 static_assert(std::is_standard_layout_v<typename ParallelForDataTest::data_t>);
144 Kokkos::RangePolicy<TEST_EXECUTION_SPACE>,
148 constexpr labeled_data_iter_space_t with_iter_space{
154 const auto with_range_policy = with_iter_space.transform_policy_or_iter_space(
155 [](
const auto& pol) {
return Kokkos::RangePolicy<TEST_EXECUTION_SPACE>(pol.first, pol.last); });
157 static_assert(std::same_as<
decltype(with_range_policy),
const labeled_data_range_policy_t>);
159 ASSERT_EQ(with_range_policy.policy_or_iter_space.begin(), 4);
160 ASSERT_EQ(with_range_policy.policy_or_iter_space.end(), 6);
175 data_with_counter_t from_xvalue{counter_t{}, counter_t{},
iter_space_t{}};
177 const auto data_from_xvalue = std::move(from_xvalue).transform_policy_or_iter_space([](
const auto&) {
180 ASSERT_EQ(counter_t::copy_assignments, 0);
181 ASSERT_EQ(counter_t::copy_constructions, 0);
182 ASSERT_EQ(counter_t::move_assignments, 0);
183#if defined(KOKKOS_COMPILER_CLANG) || defined(KOKKOS_COMPILER_INTEL_LLVM)
184 ASSERT_EQ(counter_t::move_constructions, 3);
186 ASSERT_EQ(counter_t::move_constructions, 2);
193 const auto data_from_prvalue = data_with_counter_t{counter_t{}, counter_t{},
iter_space_t{}}
194 .transform_policy_or_iter_space(
196 ASSERT_EQ(counter_t::copy_assignments, 0);
197 ASSERT_EQ(counter_t::copy_constructions, 0);
198 ASSERT_EQ(counter_t::move_assignments, 0);
199#if defined(KOKKOS_COMPILER_CLANG) || defined(KOKKOS_COMPILER_INTEL_LLVM)
200 ASSERT_EQ(counter_t::move_constructions, 3);
202 ASSERT_EQ(counter_t::move_constructions, 2);
209 using label_t = std::string;
210 using policy_t = Kokkos::RangePolicy<TEST_EXECUTION_SPACE>;
213 std::declval<label_t>(),
214 std::declval<policy_t>(),
218 std::declval<const label_t&>(),
219 std::declval<policy_t>(),
223 std::declval<const char*>(),
224 std::declval<policy_t>(),
228 std::declval<label_t>(),
229 std::declval<policy_t>(),
233 std::declval<label_t>(),
234 std::declval<policy_t>(),
237 static_assert(
noexcept(
240 std::declval<label_t>(),
241 std::declval<policy_t>(),
244 static_assert(!
noexcept(
247 std::declval<const label_t&>(),
248 std::declval<policy_t>(),
256 std::declval<policy_t>(),
258 std::declval<label_of_string_t>())));
262 std::declval<policy_t>(),
264 std::declval<const label_of_string_t&>())));
276 static_assert(std::same_as<
277 decltype(clsr_literal),
278 const stdexec::__closure<
280 Kokkos::dims<1, int>,
285 static_assert(std::same_as<
286 decltype(clsr_label),
287 const stdexec::__closure<
289 Kokkos::dims<1, int>,
306 Kokkos::dims<1, int>{42},
312 static_assert(std::same_as<
313 decltype(clsr_props),
315 stdexec::just_t::__sender<>,
318 Kokkos::dims<1, int>,
334 using just_sndr_t =
decltype(stdexec::just());
337 using label_t = std::string;
339 using policy_t = Kokkos::RangePolicy<TEST_EXECUTION_SPACE>;
344 static_assert(stdexec::__sender_for<pfor_sndr_t, Kokkos::Execution::parallel_for_t>);
346 static_assert(std::same_as<stdexec::__data_of<pfor_sndr_t>, pfor_data_t>);
348 static_assert(stdexec::__nbr_children_of<pfor_sndr_t> == 1);
349 static_assert(std::same_as<stdexec::__child_of<pfor_sndr_t>, just_sndr_t>);
357TEST(ParallelForTest, closure_object_creation_perfectly_forwards_functor) {
360 const Kokkos::RangePolicy<TEST_EXECUTION_SPACE> policy(0, 1);
367 ASSERT_EQ(counter_t::copy_constructions, 1);
368 ASSERT_EQ(counter_t::move_constructions, 0);
373 ASSERT_EQ(counter_t::copy_constructions, 1);
374 ASSERT_EQ(counter_t::move_constructions, 1);
379 ASSERT_EQ(counter_t::copy_constructions, 1);
380 ASSERT_EQ(counter_t::move_constructions, 2);
Kokkos::Execution::Impl::ParallelForData< functor_t, iter_space_t > data_t
Tests::Utils::Functors::NoOp< false, false, false > functor_t
Kokkos::range_slice< int, int > iter_space_t
Kokkos::Execution::Impl::ParallelForData< functor_t, iter_space_t, Kokkos::Execution::Impl::Label< std::string_view > > labeled_data_t
Kokkos::Execution::Impl::ParallelForData< functor_t, iter_space_t, Kokkos::Execution::Impl::Label< std::string >, std::monostate > multi_data_t
consteval Impl::Label< std::string_view > label(std::string_view str) noexcept
constexpr parallel_for_t parallel_for
consteval bool test_parallel_for_sndr_decomposition()
consteval bool test_parallel_for_noexcept_contract()
consteval bool test_parallel_for_in_constant_expression()
consteval bool test_parallel_for_data_size()
consteval bool test_parallel_for_data_traits()
consteval bool test_parallel_for_data_concept()
consteval bool test_label_storage()
consteval bool test_parallel_for_many_properties()
properties< Properties... > properties_t
ExecPolicyOrIterSpace policy_or_iter_space_t
Custom algorithm for the Kokkos::parallel_for construct.
Count construction, move/copy construction, move/copy assignment and destruction atomically on host.