alpaka
Abstraction Library for Parallel Kernel Acceleration
TestAccs.hpp
Go to the documentation of this file.
1 /* Copyright 2023 Benjamin Worpitz, Erik Zenker, Matthias Werner, Andrea Bocci, Bernhard Manfred Gruber, Jan Stephan
2  * SPDX-License-Identifier: MPL-2.0
3  */
4 
5 #pragma once
6 
7 #include "alpaka/alpaka.hpp"
10 
11 #include <iosfwd>
12 #include <tuple>
13 #include <type_traits>
14 
15 // When compiling the tests with CUDA enabled (nvcc or native clang) on the CI infrastructure
16 // we have to dramatically reduce the number of tested combinations.
17 // Else the log length would be exceeded.
18 #if defined(ALPAKA_CI)
19 # if defined(ALPAKA_ACC_GPU_CUDA_ENABLED) && BOOST_LANG_CUDA \
20  || defined(ALPAKA_ACC_GPU_HIP_ENABLED) && BOOST_LANG_HIP
21 # define ALPAKA_CUDA_CI
22 # endif
23 #endif
24 
25 namespace alpaka::test
26 {
27  //! The detail namespace is used to separate implementation details from user accessible code.
28  namespace detail
29  {
30 #if defined(ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED)
31  template<typename TDim, typename TIdx>
33 #else
34  template<typename TDim, typename TIdx>
36 #endif
37 #if defined(ALPAKA_ACC_CPU_B_SEQ_T_THREADS_ENABLED) && !defined(ALPAKA_CUDA_CI)
38  template<typename TDim, typename TIdx>
40 #else
41  template<typename TDim, typename TIdx>
43 #endif
44 #if defined(ALPAKA_ACC_CPU_B_TBB_T_SEQ_ENABLED)
45  template<typename TDim, typename TIdx>
46  using AccCpuTbbIfAvailableElseInt = AccCpuTbbBlocks<TDim, TIdx>;
47 #else
48  template<typename TDim, typename TIdx>
50 #endif
51 #if defined(ALPAKA_ACC_CPU_B_OMP2_T_SEQ_ENABLED)
52  template<typename TDim, typename TIdx>
54 #else
55  template<typename TDim, typename TIdx>
57 #endif
58 #if defined(ALPAKA_ACC_CPU_B_SEQ_T_OMP2_ENABLED) && !defined(ALPAKA_CUDA_CI)
59  template<typename TDim, typename TIdx>
61 #else
62  template<typename TDim, typename TIdx>
64 #endif
65 #if defined(ALPAKA_ACC_GPU_CUDA_ENABLED) && (BOOST_LANG_CUDA || defined(ALPAKA_HOST_ONLY))
66  template<typename TDim, typename TIdx>
68 #else
69  template<typename TDim, typename TIdx>
71 #endif
72 #if defined(ALPAKA_ACC_GPU_HIP_ENABLED) && (BOOST_LANG_HIP || defined(ALPAKA_HOST_ONLY))
73  template<typename TDim, typename TIdx>
75  typename std::conditional<std::is_same_v<TDim, DimInt<3u>> == false, AccGpuHipRt<TDim, TIdx>, int>::type;
76 #else
77  template<typename TDim, typename TIdx>
79 #endif
80 #if defined(ALPAKA_ACC_SYCL_ENABLED) && defined(ALPAKA_SYCL_TARGET_CPU)
81  template<typename TDim, typename TIdx>
82  using AccCpuSyclIfAvailableElseInt = alpaka::AccCpuSycl<TDim, TIdx>;
83 #else
84  template<typename TDim, typename TIdx>
86 #endif
87 #if defined(ALPAKA_ACC_SYCL_ENABLED) && defined(ALPAKA_SYCL_TARGET_FPGA)
88  template<typename TDim, typename TIdx>
89  using AccFpgaSyclIntelIfAvailableElseInt = alpaka::AccFpgaSyclIntel<TDim, TIdx>;
90 #else
91  template<typename TDim, typename TIdx>
93 #endif
94 #if defined(ALPAKA_ACC_SYCL_ENABLED) && defined(ALPAKA_SYCL_TARGET_GPU)
95  template<typename TDim, typename TIdx>
96  using AccGpuSyclIntelIfAvailableElseInt = alpaka::AccGpuSyclIntel<TDim, TIdx>;
97 #else
98  template<typename TDim, typename TIdx>
100 #endif
101 
102  //! A vector containing all available accelerators and int's.
103  template<typename TDim, typename TIdx>
104  using EnabledAccsElseInt = std::tuple<
115  } // namespace detail
116 
117  //! A vector containing all available accelerators.
118  template<typename TDim, typename TIdx>
120 
121  namespace detail
122  {
123  //! The accelerator name write wrapper.
125  {
126  template<typename TAcc>
127  ALPAKA_FN_HOST auto operator()(std::ostream& os) -> void
128  {
129  os << getAccName<TAcc>();
130  os << " ";
131  }
132  };
133  } // namespace detail
134 
135  //! Writes the enabled accelerators to the given stream.
136  template<typename TDim, typename TIdx>
137  ALPAKA_FN_HOST auto writeEnabledAccs(std::ostream& os) -> void
138  {
139  os << "Accelerators enabled: ";
140 
141  meta::forEachType<EnabledAccs<TDim, TIdx>>(detail::StreamOutAccName(), std::ref(os));
142 
143  os << std::endl;
144  }
145 
146  namespace detail
147  {
148  //! A std::tuple holding multiple std::tuple consisting of a dimension and a idx type.
149  //!
150  //! TestDimIdxTuples =
151  //! tuple<
152  //! tuple<Dim1,Idx1>,
153  //! tuple<Dim2,Idx1>,
154  //! tuple<Dim3,Idx1>,
155  //! ...,
156  //! tuple<DimN,IdxN>>
158 
159  template<typename TList>
161 
162  //! A std::tuple containing std::tuple with fully instantiated accelerators.
163  //!
164  //! TestEnabledAccs =
165  //! tuple<
166  //! tuple<Acc1<Dim1,Idx1>, ..., AccN<Dim1,Idx1>>,
167  //! tuple<Acc1<Dim2,Idx1>, ..., AccN<Dim2,Idx1>>,
168  //! ...,
169  //! tuple<Acc1<DimN,IdxN>, ..., AccN<DimN,IdxN>>>
171  } // namespace detail
172 
173  //! A std::tuple containing fully instantiated accelerators.
174  //!
175  //! TestAccs =
176  //! tuple<
177  //! Acc1<Dim1,Idx1>, ..., AccN<Dim1,Idx1>,
178  //! Acc1<Dim2,Idx1>, ..., AccN<Dim2,Idx1>,
179  //! ...,
180  //! Acc1<DimN,IdxN>, ..., AccN<DimN,IdxN>>
182 } // namespace alpaka::test
The CPU OpenMP 2.0 block accelerator.
The CPU OpenMP 2.0 thread accelerator.
The CPU serial accelerator.
The CPU threads accelerator.
#define ALPAKA_FN_HOST
Definition: Common.hpp:40
typename detail::TransformImpl< Ts, TOp >::type Transform
Definition: Transform.hpp:21
typename detail::FilterImpl< TList, TPred >::type Filter
Definition: Filter.hpp:43
typename detail::CartesianProductImpl< TList, Ts... >::type CartesianProduct
typename detail::ApplyImpl< TList, TApplicant >::type Apply
Definition: Apply.hpp:21
std::tuple< AccCpuSerialIfAvailableElseInt< TDim, TIdx >, AccCpuThreadsIfAvailableElseInt< TDim, TIdx >, AccCpuTbbIfAvailableElseInt< TDim, TIdx >, AccCpuOmp2BlocksIfAvailableElseInt< TDim, TIdx >, AccCpuOmp2ThreadsIfAvailableElseInt< TDim, TIdx >, AccGpuCudaRtIfAvailableElseInt< TDim, TIdx >, AccGpuHipRtIfAvailableElseInt< TDim, TIdx >, AccCpuSyclIfAvailableElseInt< TDim, TIdx >, AccFpgaSyclIntelIfAvailableElseInt< TDim, TIdx >, AccGpuSyclIntelIfAvailableElseInt< TDim, TIdx > > EnabledAccsElseInt
A vector containing all available accelerators and int's.
Definition: TestAccs.hpp:114
int AccFpgaSyclIntelIfAvailableElseInt
Definition: TestAccs.hpp:92
meta::Apply< TList, EnabledAccs > ApplyEnabledAccs
Definition: TestAccs.hpp:160
int AccGpuHipRtIfAvailableElseInt
Definition: TestAccs.hpp:78
int AccGpuCudaRtIfAvailableElseInt
Definition: TestAccs.hpp:70
int AccCpuTbbIfAvailableElseInt
Definition: TestAccs.hpp:49
meta::CartesianProduct< std::tuple, NonZeroTestDims, TestIdxs > TestDimIdxTuples
A std::tuple holding multiple std::tuple consisting of a dimension and a idx type.
Definition: TestAccs.hpp:157
int AccCpuSyclIfAvailableElseInt
Definition: TestAccs.hpp:85
meta::Transform< TestDimIdxTuples, ApplyEnabledAccs > InstantiatedEnabledAccs
A std::tuple containing std::tuple with fully instantiated accelerators.
Definition: TestAccs.hpp:170
int AccGpuSyclIntelIfAvailableElseInt
Definition: TestAccs.hpp:99
The test specifics.
Definition: TestAccs.hpp:26
typename meta::Filter< detail::EnabledAccsElseInt< TDim, TIdx >, std::is_class > EnabledAccs
A vector containing all available accelerators.
Definition: TestAccs.hpp:119
meta::Apply< detail::InstantiatedEnabledAccs, meta::Concatenate > TestAccs
A std::tuple containing fully instantiated accelerators.
Definition: TestAccs.hpp:181
ALPAKA_FN_HOST auto writeEnabledAccs(std::ostream &os) -> void
Writes the enabled accelerators to the given stream.
Definition: TestAccs.hpp:137
The accelerator name write wrapper.
Definition: TestAccs.hpp:125
ALPAKA_FN_HOST auto operator()(std::ostream &os) -> void
Definition: TestAccs.hpp:127