alpaka
Abstraction Library for Parallel Kernel Acceleration
AccGenericSycl.hpp
Go to the documentation of this file.
1 /* Copyright 2023 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 accelerator device properties get trait specialization.
106  template<template<typename, typename> typename TAcc, typename TDim, typename TIdx>
107  struct GetAccDevProps<
108  TAcc<TDim, TIdx>,
109  std::enable_if_t<std::is_base_of_v<AccGenericSycl<TDim, TIdx>, TAcc<TDim, TIdx>>>>
110  {
111  static auto getAccDevProps(typename DevType<TAcc<TDim, TIdx>>::type const& dev) -> AccDevProps<TDim, TIdx>
112  {
113  auto const device = dev.getNativeHandle().first;
114  auto const max_threads_dim
115  = device.template get_info<sycl::info::device::max_work_item_sizes<TDim::value>>();
116  Vec<TDim, TIdx> max_threads_dim_vec{};
117  for(int i = 0; i < static_cast<int>(TDim::value); i++)
118  max_threads_dim_vec[i] = alpaka::core::clipCast<TIdx>(max_threads_dim[i]);
119  return {// m_multiProcessorCount
120  alpaka::core::clipCast<TIdx>(device.template get_info<sycl::info::device::max_compute_units>()),
121  // m_gridBlockExtentMax
122  getExtentVecEnd<TDim>(Vec<DimInt<3u>, TIdx>(
123  // WARNING: There is no SYCL way to determine these values
127  // m_gridBlockCountMax
129  // m_blockThreadExtentMax
130  max_threads_dim_vec,
131  // m_blockThreadCountMax
132  alpaka::core::clipCast<TIdx>(device.template get_info<sycl::info::device::max_work_group_size>()),
133  // m_threadElemExtentMax
135  // m_threadElemCountMax
137  // m_sharedMemSizeBytes
138  device.template get_info<sycl::info::device::local_mem_size>(),
139  // m_globalMemSizeBytes
140  getMemBytes(dev)};
141  }
142  };
143 
144  //! The SYCL accelerator dimension getter trait specialization.
145  template<template<typename, typename> typename TAcc, typename TDim, typename TIdx>
146  struct DimType<TAcc<TDim, TIdx>, std::enable_if_t<std::is_base_of_v<AccGenericSycl<TDim, TIdx>, TAcc<TDim, TIdx>>>>
147  {
148  using type = TDim;
149  };
150 
151  //! The SYCL accelerator idx type trait specialization.
152  template<template<typename, typename> typename TAcc, typename TDim, typename TIdx>
153  struct IdxType<TAcc<TDim, TIdx>, std::enable_if_t<std::is_base_of_v<AccGenericSycl<TDim, TIdx>, TAcc<TDim, TIdx>>>>
154  {
155  using type = TIdx;
156  };
157 } // namespace alpaka::trait
158 
159 #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:62
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