alpaka
Abstraction Library for Parallel Kernel Acceleration
AccGenericSycl.hpp
Go to the documentation of this file.
1 /* Copyright 2024 Jan Stephan, Antonio Di Pilato, Andrea Bocci, Luca Ferragina, Aurora Perego
2  * SPDX-License-Identifier: MPL-2.0
3  */
4 
5 #pragma once
6 
7 // Base classes.
22 
23 // Specialized traits.
24 #include "alpaka/acc/Traits.hpp"
25 #include "alpaka/dev/Traits.hpp"
26 #include "alpaka/idx/Traits.hpp"
27 #include "alpaka/kernel/Traits.hpp"
29 #include "alpaka/vec/Vec.hpp"
30 
31 // Implementation details.
33 #include "alpaka/core/ClipCast.hpp"
34 #include "alpaka/core/Sycl.hpp"
35 
36 #include <cstddef>
37 #include <string>
38 #include <type_traits>
39 
40 #ifdef ALPAKA_ACC_SYCL_ENABLED
41 
42 # include <sycl/sycl.hpp>
43 
44 namespace alpaka
45 {
46  //! The SYCL accelerator.
47  //!
48  //! This accelerator allows parallel kernel execution on SYCL devices.
49  template<typename TDim, typename TIdx>
50  class AccGenericSycl
51  : public WorkDivGenericSycl<TDim, TIdx>
52  , public gb::IdxGbGenericSycl<TDim, TIdx>
53  , public bt::IdxBtGenericSycl<TDim, TIdx>
54  , public AtomicHierarchy<AtomicGenericSycl, AtomicGenericSycl, AtomicGenericSycl>
55  , public math::MathGenericSycl
56  , public BlockSharedMemDynGenericSycl
57  , public BlockSharedMemStGenericSycl
58  , public BlockSyncGenericSycl<TDim>
59  , public IntrinsicGenericSycl
60  , public MemFenceGenericSycl
61 # ifdef ALPAKA_DISABLE_VENDOR_RNG
62  , public rand::RandDefault
63 # else
64  , public rand::RandGenericSycl<TDim>
65 # endif
66  , public warp::WarpGenericSycl<TDim>
67  {
68  static_assert(TDim::value > 0, "The SYCL accelerator must have a dimension greater than zero.");
69 
70  public:
71  AccGenericSycl(AccGenericSycl const&) = delete;
72  AccGenericSycl(AccGenericSycl&&) = delete;
73  auto operator=(AccGenericSycl const&) -> AccGenericSycl& = delete;
74  auto operator=(AccGenericSycl&&) -> AccGenericSycl& = delete;
75 
76  AccGenericSycl(
77  Vec<TDim, TIdx> const& threadElemExtent,
78  sycl::nd_item<TDim::value> work_item,
79  sycl::local_accessor<std::byte> dyn_shared_acc,
80  sycl::local_accessor<std::byte> st_shared_acc)
81  : WorkDivGenericSycl<TDim, TIdx>{threadElemExtent, work_item}
82  , gb::IdxGbGenericSycl<TDim, TIdx>{work_item}
83  , bt::IdxBtGenericSycl<TDim, TIdx>{work_item}
84  , BlockSharedMemDynGenericSycl{dyn_shared_acc}
85  , BlockSharedMemStGenericSycl{st_shared_acc}
86  , BlockSyncGenericSycl<TDim>{work_item}
87 # ifndef ALPAKA_DISABLE_VENDOR_RNG
88  , rand::RandGenericSycl<TDim>{work_item}
89 # endif
90  , warp::WarpGenericSycl<TDim>{work_item}
91  {
92  }
93  };
94 } // namespace alpaka
95 
96 namespace alpaka::trait
97 {
98  //! The SYCL accelerator type trait specialization.
99  template<template<typename, typename> typename TAcc, typename TDim, typename TIdx>
100  struct AccType<TAcc<TDim, TIdx>, std::enable_if_t<std::is_base_of_v<AccGenericSycl<TDim, TIdx>, TAcc<TDim, TIdx>>>>
101  {
102  using type = TAcc<TDim, TIdx>;
103  };
104 
105  //! The SYCL single thread accelerator type trait specialization.
106  template<template<typename, typename> typename TAcc, typename TDim, typename TIdx>
107  struct IsSingleThreadAcc<
108  TAcc<TDim, TIdx>,
109  std::enable_if_t<std::is_base_of_v<AccGenericSycl<TDim, TIdx>, TAcc<TDim, TIdx>>>> : std::false_type
110  {
111  };
112 
113  //! The SYCL multi thread accelerator type trait specialization.
114  template<template<typename, typename> typename TAcc, typename TDim, typename TIdx>
115  struct IsMultiThreadAcc<
116  TAcc<TDim, TIdx>,
117  std::enable_if_t<std::is_base_of_v<AccGenericSycl<TDim, TIdx>, TAcc<TDim, TIdx>>>> : std::true_type
118  {
119  };
120 
121  //! The SYCL accelerator device properties get trait specialization.
122  template<template<typename, typename> typename TAcc, typename TDim, typename TIdx>
123  struct GetAccDevProps<
124  TAcc<TDim, TIdx>,
125  std::enable_if_t<std::is_base_of_v<AccGenericSycl<TDim, TIdx>, TAcc<TDim, TIdx>>>>
126  {
127  static auto getAccDevProps(typename DevType<TAcc<TDim, TIdx>>::type const& dev) -> AccDevProps<TDim, TIdx>
128  {
129  auto const device = dev.getNativeHandle().first;
130  auto const max_threads_dim
131  = device.template get_info<sycl::info::device::max_work_item_sizes<TDim::value>>();
132  Vec<TDim, TIdx> max_threads_dim_vec{};
133  for(int i = 0; i < static_cast<int>(TDim::value); i++)
134  max_threads_dim_vec[i] = alpaka::core::clipCast<TIdx>(max_threads_dim[i]);
135  return {// m_multiProcessorCount
136  alpaka::core::clipCast<TIdx>(device.template get_info<sycl::info::device::max_compute_units>()),
137  // m_gridBlockExtentMax
138  getExtentVecEnd<TDim>(Vec<DimInt<3u>, TIdx>(
139  // WARNING: There is no SYCL way to determine these values
143  // m_gridBlockCountMax
145  // m_blockThreadExtentMax
146  max_threads_dim_vec,
147  // m_blockThreadCountMax
148  alpaka::core::clipCast<TIdx>(device.template get_info<sycl::info::device::max_work_group_size>()),
149  // m_threadElemExtentMax
151  // m_threadElemCountMax
153  // m_sharedMemSizeBytes
154  device.template get_info<sycl::info::device::local_mem_size>(),
155  // m_globalMemSizeBytes
156  getMemBytes(dev)};
157  }
158  };
159 
160  //! The SYCL accelerator dimension getter trait specialization.
161  template<template<typename, typename> typename TAcc, typename TDim, typename TIdx>
162  struct DimType<TAcc<TDim, TIdx>, std::enable_if_t<std::is_base_of_v<AccGenericSycl<TDim, TIdx>, TAcc<TDim, TIdx>>>>
163  {
164  using type = TDim;
165  };
166 
167  //! The SYCL accelerator idx type trait specialization.
168  template<template<typename, typename> typename TAcc, typename TDim, typename TIdx>
169  struct IdxType<TAcc<TDim, TIdx>, std::enable_if_t<std::is_base_of_v<AccGenericSycl<TDim, TIdx>, TAcc<TDim, TIdx>>>>
170  {
171  using type = TIdx;
172  };
173 } // namespace alpaka::trait
174 
175 #endif
ALPAKA_NO_HOST_ACC_WARNING static constexpr ALPAKA_FN_HOST_ACC auto all(TVal const &val) -> Vec< TDim, TVal >
Single value constructor.
Definition: Vec.hpp:116
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto max(T const &max_ctx, Tx const &x, Ty const &y)
Returns the larger of two arguments. NaNs are treated as missing data (between a NaN and a numeric va...
Definition: Traits.hpp:1263
The accelerator traits.
The alpaka accelerator library.
ALPAKA_FN_HOST auto getAccDevProps(TDev const &dev) -> AccDevProps< Dim< TAcc >, Idx< TAcc >>
Definition: Traits.hpp:90
ALPAKA_FN_HOST auto getMemBytes(TDev const &dev) -> std::size_t
Definition: Traits.hpp:95
Vec(TFirstIndex &&, TRestIndices &&...) -> Vec< DimInt< 1+sizeof...(TRestIndices)>, std::decay_t< TFirstIndex >>
alpaka::meta::InheritFromList< alpaka::meta::Unique< std::tuple< TGridAtomic, TBlockAtomic, TThreadAtomic, concepts::Implements< ConceptAtomicGrids, TGridAtomic >, concepts::Implements< ConceptAtomicBlocks, TBlockAtomic >, concepts::Implements< ConceptAtomicThreads, TThreadAtomic > >> > AtomicHierarchy
build a single class to inherit from different atomic implementations