File: TestAbort.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 (108 lines) | stat: -rw-r--r-- 3,680 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// SPDX-FileCopyrightText: Copyright Contributors to the Kokkos project

#include <gtest/gtest.h>

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

TEST(TEST_CATEGORY_DEATH, abort_from_host) {
  ::testing::FLAGS_gtest_death_test_style = "threadsafe";

  char msg[] = "Goodbye cruel world";
  EXPECT_DEATH({ Kokkos::abort(msg); }, msg);
}

template <class ExecutionSpace>
struct TestAbortPrintingToStdout {
  TestAbortPrintingToStdout() {
    ::testing::internal::CaptureStdout();
    Kokkos::parallel_for(Kokkos::RangePolicy<ExecutionSpace>(0, 1), *this);
    Kokkos::fence();
    auto const captured = ::testing::internal::GetCapturedStdout();
    EXPECT_TRUE(std::regex_search(captured,
                                  std::regex("move along nothing to see here")))
        << "here is what was printed to stdout \"" << captured << "\"";
  }
  KOKKOS_FUNCTION void operator()(int) const {
    Kokkos::abort("move along nothing to see here");
  }
};

template <class ExecutionSpace>
struct TestAbortCausingAbnormalProgramTerminationButIgnoringErrorMessage {
  TestAbortCausingAbnormalProgramTerminationButIgnoringErrorMessage() {
    EXPECT_DEATH(
        {
          Kokkos::parallel_for(Kokkos::RangePolicy<ExecutionSpace>(0, 1),
                               *this);
          Kokkos::fence();
        },
        ".*");
  }
  KOKKOS_FUNCTION void operator()(int) const { Kokkos::abort("ignored"); }
};

template <class ExecutionSpace>
struct TestAbortCausingAbnormalProgramTerminationAndPrinting {
  TestAbortCausingAbnormalProgramTerminationAndPrinting() {
    EXPECT_DEATH(
        {
          Kokkos::parallel_for(Kokkos::RangePolicy<ExecutionSpace>(0, 1),
                               *this);
          Kokkos::fence();
        },
        "Meurs, pourriture communiste !");
  }
  KOKKOS_FUNCTION void operator()(int) const {
    Kokkos::abort("Meurs, pourriture communiste !");
  }
};

template <class ExecutionSpace>
void test_abort_from_device() {
#if defined(KOKKOS_ENABLE_OPENMPTARGET)  // FIXME_OPENMPTARGET
  if (std::is_same<ExecutionSpace, Kokkos::Experimental::OpenMPTarget>::value) {
    TestAbortPrintingToStdout<ExecutionSpace>();
  } else {
    TestAbortCausingAbnormalProgramTerminationAndPrinting<ExecutionSpace>();
  }
#elif defined(KOKKOS_ENABLE_OPENACC)  // FIXME_OPENACC
  if (std::is_same<ExecutionSpace, Kokkos::Experimental::OpenACC>::value) {
    TestAbortPrintingToStdout<ExecutionSpace>();
  } else {
    TestAbortCausingAbnormalProgramTerminationAndPrinting<ExecutionSpace>();
  }
#elif defined(KOKKOS_ENABLE_SYCL)     // FIXME_SYCL
  if (std::is_same_v<ExecutionSpace, Kokkos::SYCL>) {
#ifdef NDEBUG
    TestAbortPrintingToStdout<ExecutionSpace>();
#else
    TestAbortCausingAbnormalProgramTerminationAndPrinting<ExecutionSpace>();
#endif
  } else {
    TestAbortCausingAbnormalProgramTerminationAndPrinting<ExecutionSpace>();
  }
#else
  TestAbortCausingAbnormalProgramTerminationAndPrinting<ExecutionSpace>();
#endif
}

TEST(TEST_CATEGORY_DEATH, abort_from_device) {
  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
// FIXME_OPENACC FIXME_NVHPC: NVHPC fails when targetting CPUs.
#if defined(KOKKOS_ENABLE_OPENACC) && defined(KOKKOS_COMPILER_NVHPC) && \
    defined(KOKKOS_ENABLE_OPENACC_FORCE_HOST_AS_DEVICE)
  if (std::is_same_v<TEST_EXECSPACE, Kokkos::Experimental::OpenACC>) {
    GTEST_SKIP()
        << "skipping since the OpenACC backend compiled by NVHPC for CPU "
           "crashes at runtime.";
  }
#endif
  test_abort_from_device<TEST_EXECSPACE>();
}