File: TestAllocationAndSpanSize.hpp

package info (click to toggle)
kokkos 5.0.2-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 15,148 kB
  • sloc: cpp: 225,388; sh: 1,250; python: 78; makefile: 16; fortran: 4; ansic: 2
file content (71 lines) | stat: -rw-r--r-- 3,051 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// SPDX-FileCopyrightText: Copyright Contributors to the Kokkos project

#include <Kokkos_Macros.hpp>
#ifdef KOKKOS_ENABLE_EXPERIMENTAL_CXX20_MODULES
import kokkos.core;
import kokkos.core_impl;
#else
#include <Kokkos_Core.hpp>
#endif

#include <gtest/gtest.h>

template <class ViewT, std::integral... Sizes>
void test_required_span_size_single_rank(size_t expected_size,
                                         std::string label, Sizes... sizes) {
  ViewT view(label, sizes...);
#ifndef KOKKOS_ENABLE_IMPL_VIEW_LEGACY
  // Lets get the required size two ways: based on mapping + accessor and using
  // the required_allocation_size
  size_t span_size = view.mapping().required_span_size();
  size_t span_size_based_bytes =
      span_size * sizeof(typename ViewT::element_type);
  ASSERT_EQ(span_size_based_bytes, expected_size);
#endif
  size_t req_allocation_size = ViewT::required_allocation_size(sizes...);
  ASSERT_EQ(req_allocation_size, expected_size);
#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_5
  if constexpr (sizeof...(Sizes) == ViewT::rank()) {
    size_t req_allocation_size_extra =
        ViewT::required_allocation_size(sizes..., 3);
    ASSERT_EQ(req_allocation_size_extra, expected_size);
  }
#endif
}

template <class Layout>
void test_required_span_size_layout() {
  // 8 is the size of the element types we store.
  // While Foo::Bar uses float, the accessor and reference type associated
  // with Foo::Bar actually make the allocation store double!
  test_required_span_size_single_rank<
      Kokkos::View<double, Layout, TEST_EXECSPACE>>(8, "A");
  test_required_span_size_single_rank<
      Kokkos::View<double*, Layout, TEST_EXECSPACE>>(7 * 8, "A", 7);
  test_required_span_size_single_rank<
      Kokkos::View<double[7], Layout, TEST_EXECSPACE>>(7 * 8, "A", 7);
  test_required_span_size_single_rank<
      Kokkos::View<double[7], Layout, TEST_EXECSPACE>>(7 * 8, "A");
  test_required_span_size_single_rank<
      Kokkos::View<double**, Layout, TEST_EXECSPACE>>(7 * 11 * 8, "A", 7, 11);
  test_required_span_size_single_rank<
      Kokkos::View<double* [11], Layout, TEST_EXECSPACE>>(7 * 11 * 8, "A", 7,
                                                          11);
  test_required_span_size_single_rank<
      Kokkos::View<double* [11], Layout, TEST_EXECSPACE>>(7 * 11 * 8, "A", 7);
  test_required_span_size_single_rank<
      Kokkos::View<double*******, Layout, TEST_EXECSPACE>>(
      7 * 11 * 13 * 17 * 19 * 2 * 3 * 8, "A", 7, 11, 13, 17, 19, 2, 3);
  test_required_span_size_single_rank<
      Kokkos::View<double***** [2][3], Layout, TEST_EXECSPACE>>(
      7 * 11 * 13 * 17 * 19 * 2 * 3 * 8, "A", 7, 11, 13, 17, 19, 2, 3);
  test_required_span_size_single_rank<
      Kokkos::View<double***** [2][3], Layout, TEST_EXECSPACE>>(
      7 * 11 * 13 * 17 * 19 * 2 * 3 * 8, "A", 7, 11, 13, 17, 19);
}

TEST(TEST_CATEGORY, view_required_span_size) {
  test_required_span_size_layout<Kokkos::LayoutLeft>();
  test_required_span_size_layout<Kokkos::LayoutRight>();
}