From a6aaa4860ddb67746af9ad16a2a68c98cdbed72b Mon Sep 17 00:00:00 2001 From: Anton Afanasyev Date: Thu, 16 Dec 2021 10:10:12 +0100 Subject: [PATCH 01/19] removing tuple_util::make --- include/gridtools/common/array.hpp | 3 ++ include/gridtools/common/hymap.hpp | 54 ++++++++++++++----- include/gridtools/common/pair.hpp | 2 + include/gridtools/reduction/frontend.hpp | 2 +- include/gridtools/sid/composite.hpp | 5 +- include/gridtools/stencil/core/grid.hpp | 7 +-- .../stencil/cpu_ifirst/entry_point.hpp | 4 +- include/gridtools/stencil/cpu_kfirst.hpp | 18 +++---- include/gridtools/stencil/gpu/entry_point.hpp | 2 +- include/gridtools/stencil/gpu/ij_cache.hpp | 5 +- .../gridtools/stencil/gpu/tmp_storage_sid.hpp | 16 +++--- .../stencil/gpu_horizontal/entry_point.hpp | 3 +- include/gridtools/stencil/naive.hpp | 9 ++-- include/gridtools/storage/builder.hpp | 10 ++-- .../regression/gcl/test_halo_exchange_3D.cpp | 2 +- tests/unit_tests/common/test_hymap.cpp | 20 ++++--- .../common/test_hypercube_iterator.cpp | 11 ++-- tests/unit_tests/common/test_stride_util.cpp | 10 ++-- .../test_layout_transformation.cpp | 21 +++----- tests/unit_tests/sid/test_sid_block.cpp | 15 +++--- tests/unit_tests/sid/test_sid_composite.cpp | 14 ++--- tests/unit_tests/sid/test_sid_delegate.cpp | 4 +- tests/unit_tests/sid/test_sid_loop.cpp | 8 ++- tests/unit_tests/sid/test_sid_multi_shift.cpp | 8 ++- .../sid/test_sid_rename_dimensions.cpp | 8 +-- .../sid/test_sid_shift_sid_origin.cpp | 8 +-- .../unit_tests/storage/test_storage_info.cpp | 36 ++++++------- 27 files changed, 162 insertions(+), 143 deletions(-) diff --git a/include/gridtools/common/array.hpp b/include/gridtools/common/array.hpp index a36d76620a..429b910d85 100644 --- a/include/gridtools/common/array.hpp +++ b/include/gridtools/common/array.hpp @@ -89,6 +89,9 @@ namespace gridtools { GT_FUNCTION static constexpr size_t size() { return D; } }; + template + array(T, Ts...) -> array; + namespace array_impl_ { template struct deduce_array_type : std::common_type {}; diff --git a/include/gridtools/common/hymap.hpp b/include/gridtools/common/hymap.hpp index 748de35e05..110a296baa 100644 --- a/include/gridtools/common/hymap.hpp +++ b/include/gridtools/common/hymap.hpp @@ -85,7 +85,7 @@ * - transforming the values of the hymap: * `auto dst_hymap = tuple_util::transform(change_value_functor, src_hymap);` * - making a map: - * `auto a_map = tuple_util::make::values>('a', 42)` + * `auto a_map = hymap::keys::values('a', 42)` * - converting to a map: * `auto a_map = tuple_util::convert_to::values>(a_tuple_with_values)` */ @@ -164,15 +164,15 @@ namespace gridtools { using element_at = tuple_util::element, Key>::value, Map>; template > - struct keys_are_legit_sfinae : bool_constant< - meta::is_set::value && meta::length::value == tuple_util::size::value> {}; + struct keys_are_legit_sfinae + : bool_constant::value && meta::length::value == tuple_util::size::value> {}; template struct keys_are_legit : std::false_type {}; template struct keys_are_legit::value>> : std::true_type {}; - + } // namespace hymap_impl_ template @@ -193,19 +193,47 @@ namespace gridtools { using has_key = meta::st_contains, Key>; namespace hymap { - template + template struct keys { - template - struct values { - static_assert(sizeof...(Vals) == sizeof...(Keys), "invalid hymap"); + template + struct values; - tuple m_vals; +#if defined(__clang__) && __clang_major__ <= 13 + template + values(Vs const&...) -> values; +#endif + }; - GT_TUPLE_UTIL_FORWARD_CTORS_TO_MEMBER(values, m_vals); - GT_TUPLE_UTIL_FORWARD_GETTER_TO_MEMBER(values, m_vals); + template + template + struct keys::values { + static_assert(sizeof...(Vals) == sizeof...(Keys), "invalid hymap"); - friend keys hymap_get_keys(values const &) { return {}; } - }; + tuple m_vals; + + template ), int> = 0> + constexpr GT_FUNCTION values(Args &&...args) noexcept : m_vals{wstd::forward(args)...} {} + + constexpr GT_FUNCTION values(Vals const &...args) noexcept : m_vals(args...) {} + + constexpr GT_FUNCTION values(tuple&& args) noexcept : m_vals(wstd::move(args)) {} + constexpr GT_FUNCTION values(tuple const & args) noexcept : m_vals(args) {} + + values() = default; + values(values const &) = default; + values(values &&) = default; + values &operator=(values const &) = default; + values &operator=(values &&) = default; + + GT_TUPLE_UTIL_FORWARD_GETTER_TO_MEMBER(values, m_vals); + + friend keys hymap_get_keys(values const &) { return {}; } + }; + + template <> + template <> + struct keys<>::values<> { + friend values tuple_getter(values const &) { return {}; } }; template diff --git a/include/gridtools/common/pair.hpp b/include/gridtools/common/pair.hpp index 55661e4335..a3927e02e8 100644 --- a/include/gridtools/common/pair.hpp +++ b/include/gridtools/common/pair.hpp @@ -40,6 +40,8 @@ namespace gridtools { template GT_CONSTEXPR GT_FUNCTION pair(std::pair &&p) : pair(wstd::move(p.first), wstd::move(p.second)) {} + GT_CONSTEXPR GT_FUNCTION pair(T1 const &t1_, T2 const &t2_) : first(t1_), second(t2_) {} + template GT_CONSTEXPR GT_FUNCTION pair(U1 &&t1_, U2 &&t2_) : first(wstd::forward(t1_)), second(wstd::forward(t2_)) {} diff --git a/include/gridtools/reduction/frontend.hpp b/include/gridtools/reduction/frontend.hpp index 5ad4319081..e9037971fc 100644 --- a/include/gridtools/reduction/frontend.hpp +++ b/include/gridtools/reduction/frontend.hpp @@ -60,7 +60,7 @@ namespace gridtools { auto make_reducible(T const &neutral_value, Dims... dims) { auto alloc = sid::host_device::make_cached_allocator( [](size_t size) { return storage::traits::allocate(size); }); - auto lengths = tuple_util::make(dims...); + auto lengths = tuple(dims...); auto info = storage::traits::make_info(lengths); auto strides = info.native_strides(); size_t data_size = info.length(); diff --git a/include/gridtools/sid/composite.hpp b/include/gridtools/sid/composite.hpp index 828c60edd9..c3858b129c 100644 --- a/include/gridtools/sid/composite.hpp +++ b/include/gridtools/sid/composite.hpp @@ -173,8 +173,11 @@ namespace gridtools { static_assert(sizeof...(Keys) == sizeof...(Ptrs), GT_INTERNAL_ERROR); tuple m_vals; - GT_TUPLE_UTIL_FORWARD_GETTER_TO_MEMBER(composite_ptr, m_vals); + GT_TUPLE_UTIL_FORWARD_CTORS_TO_MEMBER(composite_ptr, m_vals); + + GT_TUPLE_UTIL_FORWARD_GETTER_TO_MEMBER(composite_ptr, m_vals); + GT_CONSTEXPR GT_FUNCTION decltype(auto) operator*() const { return tuple_util::host_device::convert_to::template values>( tuple_util::host_device::transform([](auto const &ptr) diff --git a/include/gridtools/stencil/core/grid.hpp b/include/gridtools/stencil/core/grid.hpp index 6ae1937edd..118bf8eef2 100644 --- a/include/gridtools/stencil/core/grid.hpp +++ b/include/gridtools/stencil/core/grid.hpp @@ -89,8 +89,7 @@ namespace gridtools { } auto origin() const { - return tuple_util::make::values>( - m_i_start, m_j_start, offset()); + return hymap::keys::values(m_i_start, m_j_start, offset()); } template > @@ -123,9 +122,7 @@ namespace gridtools { return extent.extend(dim::k(), 1_c + splitter_size(x) + offset(To()) - offset(From())); } - auto size() const { - return tuple_util::make::values>(i_size(), j_size(), k_size()); - } + auto size() const { return hymap::keys::values(i_size(), j_size(), k_size()); } }; template diff --git a/include/gridtools/stencil/cpu_ifirst/entry_point.hpp b/include/gridtools/stencil/cpu_ifirst/entry_point.hpp index 3f827ffbdd..eabb5003d4 100644 --- a/include/gridtools/stencil/cpu_ifirst/entry_point.hpp +++ b/include/gridtools/stencil/cpu_ifirst/entry_point.hpp @@ -61,8 +61,8 @@ namespace gridtools { }); auto blocked_externals = tuple_util::transform( - [block_size = tuple_util::make::values>( - info.i_block_size(), info.j_block_size())](auto &&data_store) { + [block_size = hymap::keys::values(info.i_block_size(), info.j_block_size())]( + auto &&data_store) { return sid::block(std::forward(data_store), block_size); }, std::move(external_data_stores)); diff --git a/include/gridtools/stencil/cpu_kfirst.hpp b/include/gridtools/stencil/cpu_kfirst.hpp index 8fb15bb0d0..de87716b4e 100644 --- a/include/gridtools/stencil/cpu_kfirst.hpp +++ b/include/gridtools/stencil/cpu_kfirst.hpp @@ -104,16 +104,14 @@ namespace gridtools { auto extent = info.extent(); auto interval = stages_t::interval(); auto num_colors = info.num_colors(); - auto offsets = - tuple_util::make::values>(-extent.minus(dim::i()), - -extent.minus(dim::j()), - -grid.k_start(interval) - extent.minus(dim::k())); - auto sizes = - tuple_util::make::values>(num_colors, - grid.k_size(interval, extent), - extent.extend(dim::j(), JBlockSize()), - extent.extend(dim::i(), IBlockSize()), - thread_pool::get_max_threads(ThreadPool())); + auto offsets = hymap::keys::values(-extent.minus(dim::i()), + -extent.minus(dim::j()), + -grid.k_start(interval) - extent.minus(dim::k())); + auto sizes = hymap::keys::values(num_colors, + grid.k_size(interval, extent), + extent.extend(dim::j(), JBlockSize()), + extent.extend(dim::i(), IBlockSize()), + thread_pool::get_max_threads(ThreadPool())); using stride_kind = meta::list; return sid::shift_sid_origin( diff --git a/include/gridtools/stencil/gpu/entry_point.hpp b/include/gridtools/stencil/gpu/entry_point.hpp index 11b71179f3..ece838f18a 100644 --- a/include/gridtools/stencil/gpu/entry_point.hpp +++ b/include/gridtools/stencil/gpu/entry_point.hpp @@ -179,7 +179,7 @@ namespace gridtools { return tuple_util::transform( [=](auto &&src) { return sid::block(std::forward(src), - tuple_util::make::values>(IBlockSize(), JBlockSize())); + hymap::keys::values(IBlockSize(), JBlockSize())); }, std::move(data_stores)); } diff --git a/include/gridtools/stencil/gpu/ij_cache.hpp b/include/gridtools/stencil/gpu/ij_cache.hpp index 3574640b02..ab1b89ab20 100644 --- a/include/gridtools/stencil/gpu/ij_cache.hpp +++ b/include/gridtools/stencil/gpu/ij_cache.hpp @@ -25,13 +25,12 @@ namespace gridtools { namespace ij_cache_impl_ { template auto origin_offset(Extent) { - return tuple_util::make::values>( - -Extent::minus(dim::i()), -Extent::minus(dim::j())); + return hymap::keys::values(-Extent::minus(dim::i()), -Extent::minus(dim::j())); } template auto sizes(NumColors num_colors, IBlockSize i_block_size, JBlockSize j_block_size, Extent) { - return tuple_util::make::values>( + return hymap::keys::values( num_colors, Extent::extend(dim::i(), i_block_size), Extent::extend(dim::j(), j_block_size)); } diff --git a/include/gridtools/stencil/gpu/tmp_storage_sid.hpp b/include/gridtools/stencil/gpu/tmp_storage_sid.hpp index c7462ccdee..da459f4151 100644 --- a/include/gridtools/stencil/gpu/tmp_storage_sid.hpp +++ b/include/gridtools/stencil/gpu/tmp_storage_sid.hpp @@ -38,14 +38,14 @@ namespace gridtools { int_t n_blocks_i, int_t n_blocks_j, int_t k_size) { - return tuple_util::make, sid::blocked_dim, dim::k>:: - values>(Extent::extend(dim::i(), i_block_size), - Extent::extend(dim::j(), j_block_size), - num_colors, - n_blocks_i, - n_blocks_j, - Extent::extend(dim::k(), k_size)); + return hymap:: + keys, sid::blocked_dim, dim::k>:: + values(Extent::extend(dim::i(), i_block_size), + Extent::extend(dim::j(), j_block_size), + num_colors, + n_blocks_i, + n_blocks_j, + Extent::extend(dim::k(), k_size)); } } // namespace tmp_impl_ diff --git a/include/gridtools/stencil/gpu_horizontal/entry_point.hpp b/include/gridtools/stencil/gpu_horizontal/entry_point.hpp index 17aff8f9d0..355ab3045a 100644 --- a/include/gridtools/stencil/gpu_horizontal/entry_point.hpp +++ b/include/gridtools/stencil/gpu_horizontal/entry_point.hpp @@ -176,8 +176,7 @@ namespace gridtools { [&](std::false_type, auto info) { return sid::add_const(info.is_const(), sid::block(at_key(data_stores), - tuple_util::make::values>( - IBlockSize(), JBlockSize()))); + hymap::keys::values(IBlockSize(), JBlockSize()))); }), meta::transform(), plh_map_t())); diff --git a/include/gridtools/stencil/naive.hpp b/include/gridtools/stencil/naive.hpp index 75f327f69c..3a375e28dc 100644 --- a/include/gridtools/stencil/naive.hpp +++ b/include/gridtools/stencil/naive.hpp @@ -39,11 +39,10 @@ namespace gridtools { auto extent = info.extent(); auto interval = stages_t::interval(); auto num_colors = info.num_colors(); - auto offsets = - tuple_util::make::values>(-extent.minus(dim::i()), - -extent.minus(dim::j()), - -grid.k_start(interval) - extent.minus(dim::k())); - auto sizes = tuple_util::make::values>( + auto offsets = hymap::keys::values(-extent.minus(dim::i()), + -extent.minus(dim::j()), + -grid.k_start(interval) - extent.minus(dim::k())); + auto sizes = hymap::keys::values( num_colors, grid.k_size(interval, extent), grid.j_size(extent), grid.i_size(extent)); using stride_kind = meta::list; return sid::shift_sid_origin( diff --git a/include/gridtools/storage/builder.hpp b/include/gridtools/storage/builder.hpp index 8586c7bdbc..61ed569323 100644 --- a/include/gridtools/storage/builder.hpp +++ b/include/gridtools/storage/builder.hpp @@ -122,7 +122,7 @@ namespace gridtools { class... Args, std::enable_if_t, Arg &&, Args &&...>::value, int> = 0> - constexpr values(Arg &&arg, Args &&... args) noexcept + constexpr values(Arg &&arg, Args &&...args) noexcept : m_vals{std::forward(arg), std::forward(args)...} {} values() = default; @@ -270,22 +270,22 @@ namespace gridtools { } template - auto dimensions(Args const &... values) const { + auto dimensions(Args const &...values) const { static_assert(!has::value, "storage dimensions are set twice"); static_assert(conjunction...>::value, "builder.dimensions(...) arguments should be convertible to unsigned int"); check_dimensions_number(); return add_value( - tuple_util::make(normalize_dimension(values, is_integral_constant())...)); + tuple(normalize_dimension(values, is_integral_constant())...)); } template - auto halos(Args const &... values) const { + auto halos(Args const &...values) const { static_assert(!has::value, "storage dimensions are set twice"); static_assert(conjunction...>::value, "builder.halos(...) arguments should be convertible to int"); check_dimensions_number(); - return add_value(tuple_util::make(values...)); + return add_value(array{static_cast(values)...}); } template diff --git a/tests/regression/gcl/test_halo_exchange_3D.cpp b/tests/regression/gcl/test_halo_exchange_3D.cpp index 04d4801f3c..45ee36b92c 100644 --- a/tests/regression/gcl/test_halo_exchange_3D.cpp +++ b/tests/regression/gcl/test_halo_exchange_3D.cpp @@ -99,7 +99,7 @@ class halo_exchange_3D_test : public testing::TestWithParam { }) .build(); }; - return tuple_util::make(make_storage(0), make_storage(1), make_storage(2)); + return array{make_storage(0), make_storage(1), make_storage(2)}; } template diff --git a/tests/unit_tests/common/test_hymap.cpp b/tests/unit_tests/common/test_hymap.cpp index 0b2973cb6b..92acf3d3c2 100644 --- a/tests/unit_tests/common/test_hymap.cpp +++ b/tests/unit_tests/common/test_hymap.cpp @@ -28,6 +28,8 @@ namespace gridtools { static_assert(!is_hymap::value, ""); static_assert(is_hymap>::value, ""); static_assert(is_hymap>::value, ""); + static_assert(is_hymap::values<>>::value, ""); + static_assert(is_hymap::values>::value, ""); static_assert(is_hymap::values>::value, ""); TEST(tuple_like, smoke) { @@ -86,15 +88,19 @@ namespace gridtools { EXPECT_EQ(7.3, at_key(dst)); } - TEST(make_hymap, smoke) { - auto testee = tuple_util::make::values>(42, 5.3); + TEST(deduction, smoke) { + auto testee = hymap::keys::values(42, 5.3); EXPECT_EQ(42, at_key(testee)); EXPECT_EQ(5.3, at_key(testee)); + + EXPECT_EQ(42, at_key(hymap::keys::values(42))); } + TEST(deduction, empty) { hymap::keys<>::values(); } + TEST(convert_hymap, smoke) { - hymap::keys::values src = {42, 5.3}; + auto src = hymap::keys::values(42, 5.3); auto dst = tuple_util::convert_to::values>(src); @@ -161,8 +167,8 @@ namespace gridtools { } TEST(merge, smoke) { - auto m1 = tuple_util::make::values>(1, 2); - auto m2 = tuple_util::make::values>(3.5, 16); + auto m1 = hymap::keys::values(1, 2); + auto m2 = hymap::keys::values(3.5, 16); auto testee = hymap::merge(m1, m2); EXPECT_EQ(1, at_key(testee)); @@ -171,8 +177,8 @@ namespace gridtools { } TEST(concat, smoke) { - auto m1 = tuple_util::make::values>(1, 2); - auto m2 = tuple_util::make::values>(3.5); + auto m1 = hymap::keys::values(1, 2); + auto m2 = hymap::keys::values(3.5); auto testee = hymap::concat(m1, m2); EXPECT_EQ(1, at_key(testee)); diff --git a/tests/unit_tests/common/test_hypercube_iterator.cpp b/tests/unit_tests/common/test_hypercube_iterator.cpp index 309ae79347..26dd720679 100644 --- a/tests/unit_tests/common/test_hypercube_iterator.cpp +++ b/tests/unit_tests/common/test_hypercube_iterator.cpp @@ -19,7 +19,6 @@ #include using namespace gridtools; -using tuple_util::make; class hypercube_iteration : public ::testing::Test { using range_t = std::array; @@ -48,27 +47,27 @@ class hypercube_iteration : public ::testing::Test { TEST_F(hypercube_iteration, view_from_array_of_ranges) { expect_ranges({1, 3}, {4, 8}, {2, 10}); - call_testee(make(make(1, 3), make(4, 8), make(2, 10))); + call_testee(array{pair(1, 3), pair(4, 8), pair(2, 10)}); } TEST_F(hypercube_iteration, view_from_tuple_of_ranges) { expect_ranges({1, 3}, {4, 8}, {2, 10}); - call_testee(make(make(1, 3), make(4, 8), make(2, 10))); + call_testee(tuple(pair(1, 3), pair(4, 8), pair(2, 10))); } TEST_F(hypercube_iteration, from_array_of_integers) { expect_ranges({0, 3}, {0, 8}, {0, 10}); - call_testee(make(3, 8, 10)); + call_testee(array{3, 8, 10}); } TEST_F(hypercube_iteration, from_zero_to_zero) { expect_ranges({}, {}, {}); - call_testee(make(make(0, 0), make(0, 0), make(0, 0))); + call_testee(array{pair(0, 0), pair(0, 0), pair(0, 0)}); } TEST_F(hypercube_iteration, from_one_to_one) { expect_ranges({}, {}, {}); - call_testee(make(0, 0, 0)); + call_testee(array{0, 0, 0}); } TEST(hypercube_view_empty_iteration_space, zero_dimensional_range) { diff --git a/tests/unit_tests/common/test_stride_util.cpp b/tests/unit_tests/common/test_stride_util.cpp index 3020410eea..9f9d2065ff 100644 --- a/tests/unit_tests/common/test_stride_util.cpp +++ b/tests/unit_tests/common/test_stride_util.cpp @@ -26,7 +26,7 @@ namespace gridtools { namespace tu = tuple_util; TEST(make_strides_from_sizes, smoke) { - auto testee = make_strides_from_sizes(tu::make(20, 30, 40)); + auto testee = make_strides_from_sizes(tuple(20, 30, 40)); static_assert(std::is_same, int, int>>{}, ""); EXPECT_EQ(1, tu::get<0>(testee)); @@ -35,7 +35,7 @@ namespace gridtools { } TEST(make_strides_from_sizes, integral_constants) { - auto testee = make_strides_from_sizes(tu::make(20_c, 30_c, 40)); + auto testee = make_strides_from_sizes(tuple(20_c, 30_c, 40)); static_assert( std::is_same, integral_constant, integral_constant>>{}, @@ -51,7 +51,7 @@ namespace gridtools { struct c; TEST(make_strides_from_sizes, hymap) { - auto testee = make_strides_from_sizes(tu::make::values>(20, 30, 40)); + auto testee = make_strides_from_sizes(hymap::keys::values(20, 30, 40)); static_assert( std::is_same::values, int, int>>{}, ""); @@ -62,12 +62,12 @@ namespace gridtools { } TEST(total_size, smoke) { - auto testee = total_size(tu::make(20, 30, 40)); + auto testee = total_size(tuple(20, 30, 40)); EXPECT_EQ(24000, testee); } TEST(total_size, integral_constants) { - auto testee = total_size(tu::make(20_c, 30_c, 40_c)); + auto testee = total_size(tuple(20_c, 30_c, 40_c)); static_assert(std::is_same>{}, ""); EXPECT_EQ(24000, testee); diff --git a/tests/unit_tests/layout_transformation/test_layout_transformation.cpp b/tests/unit_tests/layout_transformation/test_layout_transformation.cpp index d525454016..4606b8ecff 100644 --- a/tests/unit_tests/layout_transformation/test_layout_transformation.cpp +++ b/tests/unit_tests/layout_transformation/test_layout_transformation.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #ifdef GT_CUDACC @@ -23,7 +22,6 @@ namespace { using namespace gridtools; - using tuple_util::make; struct host {}; @@ -65,12 +63,12 @@ namespace { constexpr size_t Nx = 4, Ny = 5, Nz = 6; double src[Nx][Ny][Nz]; double dst[Nz][Ny][Nx]; - auto dims = make(Nx, Ny, Nz); + auto dims = array{Nx, Ny, Nz}; for (auto i : make_hypercube_view(dims)) { src[i[0]][i[1]][i[2]] = 100 * i[0] + 10 * i[1] + i[2]; dst[i[2]][i[1]][i[0]] = -1; } - testee(env, dst, src, dims, make(1, Nx, Nx * Ny), make(Ny * Nz, Nz, 1)); + testee(env, dst, src, dims, array{1, Nx, Nx * Ny}, array{Ny * Nz, Nz, 1}); for (auto i : make_hypercube_view(dims)) EXPECT_DOUBLE_EQ(dst[i[2]][i[1]][i[0]], src[i[0]][i[1]][i[2]]); }); @@ -81,17 +79,12 @@ namespace { constexpr size_t Nx = 4, Ny = 5, Nz = 6, Nw = 7; double src[Nx][Ny][Nz][Nw]; double dst[Nw][Nz][Ny][Nx]; - auto dims = make(Nx, Ny, Nz, Nw); + auto dims = array{Nx, Ny, Nz, Nw}; for (auto i : make_hypercube_view(dims)) { src[i[0]][i[1]][i[2]][i[3]] = 1000 * i[0] + 100 * i[1] + 10 * i[2] + i[3]; dst[i[3]][i[2]][i[1]][i[0]] = -1; } - testee(env, - dst, - src, - dims, - make(1, Nx, Nx * Ny, Nx * Ny * Nz), - make(Ny * Nz * Nw, Nz * Nw, Nw, 1)); + testee(env, dst, src, dims, array{1, Nx, Nx * Ny, Nx * Ny * Nz}, array{Ny * Nz * Nw, Nz * Nw, Nw, 1}); for (auto i : make_hypercube_view(dims)) EXPECT_DOUBLE_EQ(dst[i[3]][i[2]][i[1]][i[0]], src[i[0]][i[1]][i[2]][i[3]]); }); @@ -102,12 +95,12 @@ namespace { constexpr size_t Nx = 4, Ny = 5; double src[Nx][Ny]; double dst[Ny][Nx]; - auto dims = make(Nx, Ny); + auto dims = array{Nx, Ny}; for (auto i : make_hypercube_view(dims)) { src[i[0]][i[1]] = 100 * i[0] + 10 * i[1]; dst[i[1]][i[0]] = -1; } - testee(env, dst, src, dims, make(1, Nx), make(Ny, 1)); + testee(env, dst, src, dims, array{1, Nx}, array{Ny, 1}); for (auto i : make_hypercube_view(dims)) EXPECT_DOUBLE_EQ(dst[i[1]][i[0]], src[i[0]][i[1]]); }); @@ -122,7 +115,7 @@ namespace { src[i] = i; dst[i][0] = dst[i][1] = -1; } - testee(env, dst, src, make(Nx), make(2), make(1)); + testee(env, dst, src, array{Nx}, array{2}, array{1}); for (size_t i = 0; i != Nx; ++i) { EXPECT_DOUBLE_EQ(dst[i][0], src[i]); // the indexable elements match EXPECT_DOUBLE_EQ(dst[i][1], -1); // the non-indexable are not touched diff --git a/tests/unit_tests/sid/test_sid_block.cpp b/tests/unit_tests/sid/test_sid_block.cpp index aa9592f53d..be2b1b3b9f 100644 --- a/tests/unit_tests/sid/test_sid_block.cpp +++ b/tests/unit_tests/sid/test_sid_block.cpp @@ -35,7 +35,7 @@ namespace gridtools { constexpr int block_size_i = 3; const int block_size_j = 7; - auto blocks = tuple_util::make::values>( + auto blocks = hymap::keys::values( integral_constant{}, block_size_j, 5); positional_t s; @@ -73,10 +73,9 @@ namespace gridtools { const int domain_size = 20; const int block_size_1 = 5; const int block_size_2 = 2; - auto blocked_s = sid::block(s, tuple_util::make::values>(block_size_1)); + auto blocked_s = sid::block(s, hymap::keys::values(block_size_1)); static_assert(is_sid(), ""); - auto blocked_blocked_s = - sid::block(blocked_s, tuple_util::make>::values>(block_size_2)); + auto blocked_blocked_s = sid::block(blocked_s, hymap::keys>::values(block_size_2)); static_assert(is_sid(), ""); auto ptr = sid::get_origin(blocked_blocked_s)(); @@ -100,7 +99,7 @@ namespace gridtools { TEST(sid_block, do_nothing) { positional_t s; - auto same_s = sid::block(s, tuple_util::make::values>(42)); + auto same_s = sid::block(s, hymap::keys::values(42)); static_assert(std::is_same(), ""); } @@ -109,7 +108,7 @@ namespace gridtools { const int domain_size = 20; const int block_size = 5; - auto blocked_s = sid::block(std::ref(s), tuple_util::make::values>(block_size)); + auto blocked_s = sid::block(std::ref(s), hymap::keys::values(block_size)); static_assert(is_sid(), ""); auto ptr = sid::get_origin(blocked_s)(); @@ -131,8 +130,8 @@ namespace gridtools { using dims_t = hymap::keys; - auto strides = tuple_util::make(1, 2, 4_c, 8_c); - auto blocks = tuple_util::make(2, 2_c, 2, 2_c); + auto strides = dims_t::values(1, 2, 4_c, 8_c); + auto blocks = dims_t::values(2, 2_c, 2, 2_c); auto s = sid::synthetic() .set(sid::simple_ptr_holder{nullptr}) diff --git a/tests/unit_tests/sid/test_sid_composite.cpp b/tests/unit_tests/sid/test_sid_composite.cpp index 0012a3f8c5..c890b7f02c 100644 --- a/tests/unit_tests/sid/test_sid_composite.cpp +++ b/tests/unit_tests/sid/test_sid_composite.cpp @@ -73,12 +73,12 @@ namespace gridtools { double three[4][3][5] = {}; char four[4][3][5] = {}; - auto my_strides = tu::make(1, 5, 15); + auto my_strides = array{1, 5, 15}; auto testee = sid::composite::make( // sid::synthetic() // .set(sid::host_device::make_simple_ptr_holder(&one[0])) // - .set(tuple_util::make(1_c)) // + .set(tuple(1_c)) // , // sid::synthetic() // .set(sid::host_device::make_simple_ptr_holder(&two)) // @@ -155,15 +155,15 @@ namespace gridtools { TEST(composite, custom_dims) { double const one[5] = {0, 10, 20, 30, 40}; - auto strides_one = tu::make::values>(1_c); + auto strides_one = hymap::keys::values(1_c); double two = -1; double three[4][3][5] = {}; - auto strides_three = tu::make::values>(1_c, 5_c, 15_c); + auto strides_three = hymap::keys::values(1_c, 5_c, 15_c); char four[6][4][5] = {}; - auto strides_four = tu::make::values>(1_c, 5_c, 20_c); + auto strides_four = hymap::keys::values(1_c, 5_c, 20_c); auto testee = sid::composite::make( // sid::synthetic() // @@ -206,11 +206,11 @@ namespace gridtools { auto testee = sid::composite::make( // sid::synthetic() // .set(sid::host_device::make_simple_ptr_holder(&one[0])) // - .set(tuple_util::make(1)) // + .set(tuple(1)) // .set(), // sid::synthetic() // .set(sid::host_device::make_simple_ptr_holder(&two[0][0])) // - .set(tuple_util::make(1, 1)) // + .set(tuple(1, 1)) // .set()); auto &&strides = sid::get_strides(testee); diff --git a/tests/unit_tests/sid/test_sid_delegate.cpp b/tests/unit_tests/sid/test_sid_delegate.cpp index ce800c492c..4a20ae115f 100644 --- a/tests/unit_tests/sid/test_sid_delegate.cpp +++ b/tests/unit_tests/sid/test_sid_delegate.cpp @@ -47,7 +47,7 @@ namespace gridtools { double data[3][5]; auto src = sid::synthetic() .set(sid::host_device::make_simple_ptr_holder(&data[0][0])) - .set(tu::make(5_c, 1_c)); + .set(tuple(5_c, 1_c)); EXPECT_EQ(&data[0][0], sid::get_origin(src)()); auto testee = i_shift(std::move(src)); @@ -78,7 +78,7 @@ namespace gridtools { double data[3][5]; auto src = sid::synthetic() .set(sid::host_device::make_simple_ptr_holder(&data[0][0])) - .set(tu::make(5_c, 1_c)); + .set(tuple(5_c, 1_c)); auto testee = just_delegate(src); static_assert(is_sid(), ""); } diff --git a/tests/unit_tests/sid/test_sid_loop.cpp b/tests/unit_tests/sid/test_sid_loop.cpp index c80073863d..d9b4336580 100644 --- a/tests/unit_tests/sid/test_sid_loop.cpp +++ b/tests/unit_tests/sid/test_sid_loop.cpp @@ -15,12 +15,10 @@ #include #include #include -#include namespace gridtools { namespace { using namespace literals; - namespace tu = tuple_util::host_device; struct assignment_f { double m_val; @@ -35,7 +33,7 @@ namespace gridtools { TEST(make_loop, smoke) { double data[10][10] = {}; - auto strides = tu::make(10_c, 1_c); + auto strides = tuple(10_c, 1_c); double *ptr = &data[0][0]; sid::make_loop(5, 1)(assignment_f{42})(ptr, strides); @@ -63,7 +61,7 @@ namespace gridtools { TEST(nest_loops, smoke) { double data[10][10] = {}; double *ptr = &data[0][0]; - auto strides = tu::make(10_c, 1_c); + auto strides = tuple(10_c, 1_c); auto testee = host_device::compose(sid::make_loop(10_c), sid::make_loop(10_c)); @@ -77,7 +75,7 @@ namespace gridtools { TEST(range, smoke) { double data[10][10] = {}; double *ptr = &data[0][0]; - auto strides = tu::make(10_c, 1_c); + auto strides = tuple(10_c, 1_c); auto testee = sid::make_range(ptr, strides, sid::make_loop(10_c), sid::make_loop(10_c)); diff --git a/tests/unit_tests/sid/test_sid_multi_shift.cpp b/tests/unit_tests/sid/test_sid_multi_shift.cpp index acb34b16be..0e3a886855 100644 --- a/tests/unit_tests/sid/test_sid_multi_shift.cpp +++ b/tests/unit_tests/sid/test_sid_multi_shift.cpp @@ -14,13 +14,11 @@ #include #include -#include #include namespace gridtools { namespace { using namespace literals; - namespace tu = tuple_util; TEST(multi_shift, smoke) { double data[15][42]; @@ -28,13 +26,13 @@ namespace gridtools { auto ptr = sid::get_origin(data)(); auto strides = sid::get_strides(data); - sid::multi_shift(ptr, strides, tu::make(3_c, 5_c, 2_c)); + sid::multi_shift(ptr, strides, tuple(3_c, 5_c, 2_c)); EXPECT_EQ(&data[3][5], ptr); - sid::multi_shift(ptr, strides, tu::make(0_c, -2_c)); + sid::multi_shift(ptr, strides, tuple(0_c, -2_c)); EXPECT_EQ(&data[3][3], ptr); - sid::multi_shift(ptr, strides, tu::make(-2)); + sid::multi_shift(ptr, strides, tuple(-2)); EXPECT_EQ(&data[1][3], ptr); } } // namespace diff --git a/tests/unit_tests/sid/test_sid_rename_dimensions.cpp b/tests/unit_tests/sid/test_sid_rename_dimensions.cpp index a072cccbfb..83d872cb8f 100644 --- a/tests/unit_tests/sid/test_sid_rename_dimensions.cpp +++ b/tests/unit_tests/sid/test_sid_rename_dimensions.cpp @@ -35,8 +35,8 @@ namespace gridtools { auto src = sid::synthetic() .set(sid::make_simple_ptr_holder(&data[0][0][0])) - .set(tu::make::values>(5_c * 7_c, 7_c, 1_c)) - .set(tu::make::values>(3, 5)); + .set(hymap::keys::values(5_c * 7_c, 7_c, 1_c)) + .set(hymap::keys::values(3, 5)); auto testee = sid::rename_dimensions(src); using testee_t = decltype(testee); @@ -78,8 +78,8 @@ namespace gridtools { double data[3][5][7]; auto src = sid::synthetic() .set(sid::host_device::make_simple_ptr_holder(&data[0][0][0])) - .set(tu::make::values>(5_c * 7_c, 7_c, 1_c)) - .set(tu::make::values>(3, 5)); + .set(hymap::keys::values(5_c * 7_c, 7_c, 1_c)) + .set(hymap::keys::values(3, 5)); auto testee = sid::rename_dimensions(src); static_assert(sid::is_sid::value, ""); auto composite = tu::make::values>(testee); diff --git a/tests/unit_tests/sid/test_sid_shift_sid_origin.cpp b/tests/unit_tests/sid/test_sid_shift_sid_origin.cpp index fdf09533e4..248a0fef8e 100644 --- a/tests/unit_tests/sid/test_sid_shift_sid_origin.cpp +++ b/tests/unit_tests/sid/test_sid_shift_sid_origin.cpp @@ -29,10 +29,10 @@ namespace gridtools { auto src = sid::synthetic() .set(sid::make_simple_ptr_holder(&data[0][0][0])) - .set(tu::make(5_c * 7_c, 7_c, 1_c)) - .set(tu::make(3)); + .set(tuple(5_c * 7_c, 7_c, 1_c)) + .set(tuple(3)); - auto offset = tuple_util::make(1_c, 2); + auto offset = tuple(1_c, 2); auto testee = sid::shift_sid_origin(src, offset); static_assert(is_sid(), ""); @@ -46,7 +46,7 @@ namespace gridtools { TEST(shift_sid_origin, c_array) { double data[3][5][7]; - auto offset = tuple_util::make(1_c, 2); + auto offset = tuple(1_c, 2); auto testee = sid::shift_sid_origin(data, offset); static_assert(is_sid(), ""); diff --git a/tests/unit_tests/storage/test_storage_info.cpp b/tests/unit_tests/storage/test_storage_info.cpp index 9178e07b0d..40071fdbf9 100644 --- a/tests/unit_tests/storage/test_storage_info.cpp +++ b/tests/unit_tests/storage/test_storage_info.cpp @@ -14,47 +14,45 @@ #include #include -#include namespace gridtools { namespace storage { namespace { using testing::ElementsAre; - namespace tu = tuple_util; using namespace literals; TEST(StorageInfo, Strides) { { - auto si = make_info>(1_c, tu::make(3, 4, 5)); + auto si = make_info>(1_c, tuple(3, 4, 5)); EXPECT_THAT(si.strides(), ElementsAre(20, 5, 1)); EXPECT_EQ(si.length(), 3 * 4 * 5); } { - auto si = make_info>(1_c, tu::make(3, 4, 5)); + auto si = make_info>(1_c, tuple(3, 4, 5)); EXPECT_THAT(si.strides(), ElementsAre(1, 15, 3)); EXPECT_EQ(si.length(), 3 * 4 * 5); } { - auto si = make_info>(1_c, tu::make(3, 4, 5)); + auto si = make_info>(1_c, tuple(3, 4, 5)); EXPECT_THAT(si.strides(), ElementsAre(0, 5, 1)); EXPECT_EQ(si.length(), 4 * 5); } } TEST(StorageInfo, StridesAlignment) { { - auto si = make_info>(32_c, tu::make(3, 4, 5)); + auto si = make_info>(32_c, tuple(3, 4, 5)); EXPECT_THAT(si.strides(), ElementsAre(128, 32, 1)); EXPECT_GE(si.length(), 3 * 4 * 5); EXPECT_LE(si.length(), 3 * 4 * 32); } { - auto si = make_info>(32_c, tu::make(3, 4, 5)); + auto si = make_info>(32_c, tuple(3, 4, 5)); EXPECT_THAT(si.strides(), ElementsAre(1, 32 * 5, 32)); EXPECT_GE(si.length(), 3 * 4 * 5); EXPECT_LE(si.length(), 32 * 4 * 5); } { - auto si = make_info>(32_c, tu::make(3, 4, 5)); + auto si = make_info>(32_c, tuple(3, 4, 5)); EXPECT_THAT(si.strides(), ElementsAre(0, 32, 1)); EXPECT_GE(si.length(), 4 * 5); EXPECT_LE(si.length(), 4 * 32); @@ -62,21 +60,21 @@ namespace gridtools { } TEST(StorageInfo, IndexVariadic) { { - auto si = make_info>(1_c, tu::make(3, 4, 5)); + auto si = make_info>(1_c, tuple(3, 4, 5)); EXPECT_EQ(si.index(0, 0, 0), 0); EXPECT_EQ(si.index(0, 0, 1), 1); EXPECT_EQ(si.index(0, 1, 0), 5); EXPECT_EQ(si.index(1, 0, 0), 20); } { - auto si = make_info>(1_c, tu::make(3, 4, 5)); + auto si = make_info>(1_c, tuple(3, 4, 5)); EXPECT_EQ(si.index(0, 0, 0), 0); EXPECT_EQ(si.index(0, 0, 1), 3); EXPECT_EQ(si.index(0, 1, 0), 15); EXPECT_EQ(si.index(1, 0, 0), 1); } { - auto si = make_info>(1_c, tu::make(3, 4, 5)); + auto si = make_info>(1_c, tuple(3, 4, 5)); EXPECT_EQ(si.index(0, 0, 0), 0); EXPECT_EQ(si.index(0, 0, 1), 1); EXPECT_EQ(si.index(0, 1, 0), 5); @@ -87,7 +85,7 @@ namespace gridtools { TEST(StorageInfo, Simple) { { - auto si = make_info>(1_c, tu::make(3, 3, 3)); + auto si = make_info>(1_c, tuple(3, 3, 3)); EXPECT_EQ(si.index(0, 0, 0), 0); EXPECT_EQ(si.index(0, 0, 1), 9); EXPECT_EQ(si.index(0, 0, 2), 18); @@ -105,7 +103,7 @@ namespace gridtools { EXPECT_EQ(si.index(1, 0, 2), 19); } { - auto si = make_info>(1_c, tu::make(3, 3, 3)); + auto si = make_info>(1_c, tuple(3, 3, 3)); EXPECT_EQ(si.index(0, 0, 0), 0); EXPECT_EQ(si.index(0, 0, 1), 1); EXPECT_EQ(si.index(0, 0, 2), 2); @@ -123,7 +121,7 @@ namespace gridtools { EXPECT_EQ(si.index(1, 0, 2), 11); } { - auto si = make_info>(1_c, tu::make(3, 3, 3)); + auto si = make_info>(1_c, tuple(3, 3, 3)); EXPECT_EQ(si.index(0, 0, 0), 0); EXPECT_EQ(si.index(0, 0, 1), 1); EXPECT_EQ(si.index(0, 0, 2), 2); @@ -142,19 +140,19 @@ namespace gridtools { } // test with different dims - auto x = make_info>(1_c, tu::make(5, 7, 8, 2)); + auto x = make_info>(1_c, tuple(5, 7, 8, 2)); EXPECT_THAT(x.lengths(), ElementsAre(5, 7, 8, 2)); EXPECT_THAT(x.strides(), ElementsAre(56, 8, 1, 280)); } TEST(StorageInfo, Alignment) { { - auto x = make_info>(32_c, tu::make(5, 7, 32, 2)); + auto x = make_info>(32_c, tuple(5, 7, 32, 2)); EXPECT_THAT(x.lengths(), ElementsAre(5, 7, 32, 2)); EXPECT_THAT(x.strides(), ElementsAre(32 * 7, 32, 1, 5 * 32 * 7)); } { - auto x = make_info>(32_c, tu::make(7, 11, 3, 10)); + auto x = make_info>(32_c, tuple(7, 11, 3, 10)); EXPECT_THAT(x.lengths(), ElementsAre(7, 11, 3, 10)); EXPECT_THAT(x.strides(), ElementsAre(32 * 11, 32, 1, 32 * 11 * 7)); EXPECT_EQ(x.index(0, 0, 0, 0), 0); @@ -162,7 +160,7 @@ namespace gridtools { EXPECT_EQ(x.index(0, 0, 2, 0), 2); } { - auto x = make_info>(32_c, tu::make(3, 11, 14, 10)); + auto x = make_info>(32_c, tuple(3, 11, 14, 10)); EXPECT_THAT(x.lengths(), ElementsAre(3, 11, 14, 10)); EXPECT_THAT(x.strides(), ElementsAre(1, 32, 32 * 11, 32 * 11 * 14)); EXPECT_EQ(x.index(0, 0, 0, 0), 0); @@ -171,7 +169,7 @@ namespace gridtools { EXPECT_EQ(x.index(0, 0, 0, 1), 32 * 11 * 14); } { - auto x = make_info>(32_c, tu::make(7, 7, 8, 10)); + auto x = make_info>(32_c, tuple(7, 7, 8, 10)); EXPECT_THAT(x.lengths(), ElementsAre(7, 7, 8, 10)); EXPECT_THAT(x.strides(), ElementsAre(1, 0, 0, 32)); EXPECT_EQ(x.index(0, 0, 0, 0), 0); From 026789f84df9a385a63d8c36b3a5f8be9680784f Mon Sep 17 00:00:00 2001 From: Anton Afanasyev Date: Mon, 20 Dec 2021 12:42:54 +0100 Subject: [PATCH 02/19] add make_values --- include/gridtools/boundaries/bound_bc.hpp | 11 +- .../boundaries/distributed_boundaries.hpp | 2 +- include/gridtools/common/enable_maker.hpp | 29 ++ include/gridtools/common/hymap.hpp | 13 +- include/gridtools/common/tuple_util.hpp | 147 +++--- .../gcl/high_level/descriptors_manual_gpu.hpp | 24 +- .../gcl/high_level/empty_field_base.hpp | 8 +- include/gridtools/sid/composite.hpp | 457 ++++++++++-------- include/gridtools/stencil/core/grid.hpp | 6 +- include/gridtools/stencil/gpu/entry_point.hpp | 2 +- include/gridtools/stencil/gpu/ij_cache.hpp | 4 +- .../gridtools/stencil/gpu/tmp_storage_sid.hpp | 2 +- .../stencil/gpu_horizontal/entry_point.hpp | 2 +- include/gridtools/stencil/naive.hpp | 4 +- include/gridtools/storage/info.hpp | 2 +- tests/unit_tests/CMakeLists.txt | 1 + .../boundaries/test_bindbc_utilities.cpp | 20 +- tests/unit_tests/common/test_hymap.cpp | 12 +- tests/unit_tests/common/test_int_vector.cpp | 62 +-- tests/unit_tests/common/test_int_vector.cu | 13 +- tests/unit_tests/common/test_stride_util.cpp | 2 +- tests/unit_tests/common/test_tuple_util.cpp | 139 +++--- tests/unit_tests/sid/test_sid_block.cpp | 15 +- tests/unit_tests/sid/test_sid_composite.cpp | 25 +- tests/unit_tests/sid/test_sid_concept.cpp | 5 +- .../sid/test_sid_rename_dimensions.cpp | 10 +- 26 files changed, 530 insertions(+), 487 deletions(-) create mode 100644 include/gridtools/common/enable_maker.hpp diff --git a/include/gridtools/boundaries/bound_bc.hpp b/include/gridtools/boundaries/bound_bc.hpp index 6e1facf565..27b67328bc 100644 --- a/include/gridtools/boundaries/bound_bc.hpp +++ b/include/gridtools/boundaries/bound_bc.hpp @@ -82,19 +82,20 @@ namespace gridtools { */ template auto substitute_placeholders(ROTuple const &ro_tuple, AllTuple const &all, std::index_sequence) { - return std::make_tuple(select_element(ro_tuple, + return std::tuple(select_element(ro_tuple, all, typename PlcOrNot>::value>::type{})...); } - inline std::tuple<> rest_tuple(std::tuple<>, std::index_sequence<>) { return {}; } + template + std::tuple<> rest_tuple(std::tuple const&, std::index_sequence<>) { return {}; } /** \internal - Small facility to obtain a tuple with the elements of am input tuple execpt the first. + Small facility to obtain a tuple with the elements of an input tuple execpt the first. */ template auto rest_tuple(std::tuple const &x, std::index_sequence) { - return std::make_tuple(std::get(x)...); + return std::tuple(std::get(x)...); } /** @@ -229,7 +230,7 @@ namespace gridtools { */ template auto associate(ReadOnly &&... ro_stores) const -> bound_bc::value>{})), typename _impl::comm_indices::type> { diff --git a/include/gridtools/boundaries/distributed_boundaries.hpp b/include/gridtools/boundaries/distributed_boundaries.hpp index 20a48966e0..9e55ca89e5 100644 --- a/include/gridtools/boundaries/distributed_boundaries.hpp +++ b/include/gridtools/boundaries/distributed_boundaries.hpp @@ -228,7 +228,7 @@ namespace gridtools { template static auto collect_stores( FirstJob const &first_job, std::enable_if_t::value, void *> = nullptr) { - return std::make_tuple(first_job); + return std::tuple(first_job); } template diff --git a/include/gridtools/common/enable_maker.hpp b/include/gridtools/common/enable_maker.hpp new file mode 100644 index 0000000000..f3d030b56e --- /dev/null +++ b/include/gridtools/common/enable_maker.hpp @@ -0,0 +1,29 @@ +/* + * GridTools + * + * Copyright (c) 2014-2021, ETH Zurich + * All rights reserved. + * + * Please, refer to the LICENSE file in the root directory. + * SPDX-License-Identifier: BSD-3-Clause + */ + +#pragma once + +#include "host_device.hpp" + +namespace gridtools { + // NVCC 11 fails to do class template deduction in the case of nested templates + // The only puropse of this helper is to factor out the workaround against it. + // See hymap.hpp for the usage exapmle. + class enable_maker { + protected: + template