alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
Assert.hpp
Go to the documentation of this file.
1/* Copyright 2022 Axel Huebl, Benjamin Worpitz, Matthias Werner, Jan Stephan, Bernhard Manfred Gruber
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5#pragma once
6
9
10#include <cassert>
11#include <type_traits>
12
13//! The assert can be explicit disabled by defining NDEBUG
14#define ALPAKA_ASSERT(...) assert(__VA_ARGS__)
15
16//! Macro which expands to a noop.
17//! Macro enforces an semicolon after the call.
18#define ALPAKA_NOOP(...) \
19 do \
20 { \
21 } while(false)
22
23//! ALPAKA_ASSERT_ACC_IMPL is an assert-like macro.
24//! It can be disabled setting the ALPAKA_DISABLE_ASSERT_ACC preprocessor symbol or the NDEBUG preprocessor symbol.
25#if !defined(ALPAKA_DISABLE_ASSERT_ACC)
26# define ALPAKA_ASSERT_ACC_IMPL(...) ALPAKA_ASSERT(__VA_ARGS__)
27#else
28# define ALPAKA_ASSERT_ACC_IMPL(...) ALPAKA_NOOP(__VA_ARGS__)
29#endif
30
31//! ALPAKA_ASSERT_ACC is an assert-like macro.
32//!
33//! In device code for a GPU or SYCL backend it can be disabled setting the ALPAKA_DISABLE_ASSERT_ACC preprocessor
34//! symbol or the NDEBUG preprocessor symbol. In device code for a native C++ CPU backend and in host code, it is
35//! equivalent to ALPAKA_ASSERT, and can be disabled setting the NDEBUG preprocessor symbol.
36#if defined(ALPAKA_LANG_CUDA) && defined(__CUDA_ARCH__)
37// CUDA device code
38# define ALPAKA_ASSERT_ACC(...) ALPAKA_ASSERT_ACC_IMPL(__VA_ARGS__)
39#elif defined(ALPAKA_LANG_HIP) && defined(__HIP_DEVICE_COMPILE__)
40// HIP/ROCm device code
41# define ALPAKA_ASSERT_ACC(...) ALPAKA_ASSERT_ACC_IMPL(__VA_ARGS__)
42#elif defined(ALPAKA_LANG_SYCL) && defined(__SYCL_DEVICE_ONLY__)
43// SYCL/oneAPI device code
44# if defined(SYCL_EXT_ONEAPI_ASSERT)
45# define ALPAKA_ASSERT_ACC(...) ALPAKA_ASSERT_ACC_IMPL(__VA_ARGS__)
46# else
47# define ALPAKA_ASSERT_ACC(...) ALPAKA_NOOP(__VA_ARGS__)
48# endif
49// add here any other #elif conditions for non-CPU backends
50// ...
51#else
52// CPU backend, or host code
53# define ALPAKA_ASSERT_ACC(...) ALPAKA_ASSERT(__VA_ARGS__)
54#endif
55
56namespace alpaka::core
57{
58 namespace detail
59 {
60 template<typename TArg>
61 struct AssertValueUnsigned
62 {
63 ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC static constexpr auto assertValueUnsigned(
64 [[maybe_unused]] TArg const& arg)
65 {
66 if constexpr(std::is_signed_v<TArg>)
67 ALPAKA_ASSERT_ACC(arg >= 0);
68
69 // Nothing to do for unsigned types.
70 }
71 };
72 } // namespace detail
73
74 //! This method checks integral values if they are greater or equal zero.
75 //! The implementation prevents warnings for checking this for unsigned types.
77 template<typename TArg>
78 ALPAKA_FN_HOST_ACC constexpr auto assertValueUnsigned(TArg const& arg) -> void
79 {
80 detail::AssertValueUnsigned<TArg>::assertValueUnsigned(arg);
81 }
82
83 namespace detail
84 {
85 template<typename TLhs, typename TRhs>
86 struct AssertGreaterThan
87 {
88 ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC static constexpr auto assertGreaterThan(
89 [[maybe_unused]] TRhs const& rhs)
90 {
91 if constexpr(std::is_signed_v<TRhs> || (TLhs::value != 0u))
92 ALPAKA_ASSERT_ACC(TLhs::value > rhs);
93
94 // Nothing to do for unsigned types comparing to zero.
95 }
96 };
97 } // namespace detail
98
99 //! This function asserts that the integral value TLhs is greater than TRhs.
101 template<typename TLhs, typename TRhs>
102 ALPAKA_FN_HOST_ACC constexpr auto assertGreaterThan(TRhs const& rhs) -> void
103 {
104 detail::AssertGreaterThan<TLhs, TRhs>::assertGreaterThan(rhs);
105 }
106} // namespace alpaka::core
#define ALPAKA_ASSERT_ACC(...)
ALPAKA_ASSERT_ACC is an assert-like macro.
Definition Assert.hpp:53
#define ALPAKA_FN_HOST_ACC
All functions that can be used on an accelerator have to be attributed with ALPAKA_FN_ACC or ALPAKA_F...
Definition common.hpp:32
#define ALPAKA_NO_HOST_ACC_WARNING
Disable nvcc warning: 'calling a host function from host device function.' Usage: ALPAKA_NO_HOST_ACC_...
Definition common.hpp:75
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC constexpr auto assertValueUnsigned(TArg const &arg) -> void
This method checks integral values if they are greater or equal zero. The implementation prevents war...
Definition Assert.hpp:78
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC constexpr auto assertGreaterThan(TRhs const &rhs) -> void
This function asserts that the integral value TLhs is greater than TRhs.
Definition Assert.hpp:102