40#ifdef __cpp_lib_format
46#ifdef ALPAKA_ACC_SYCL_ENABLED
48# include <sycl/sycl.hpp>
52 template<concepts::Tag TTag,
typename TAcc,
typename TDim,
typename TIdx,
typename TKernelFnObj,
typename... TArgs>
53 class TaskKernelGenericSycl;
58 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
60 :
public WorkDivGenericSycl<TDim, TIdx>
61 ,
public gb::IdxGbGenericSycl<TDim, TIdx>
62 ,
public bt::IdxBtGenericSycl<TDim, TIdx>
63 ,
public AtomicHierarchy<AtomicGenericSycl, AtomicGenericSycl, AtomicGenericSycl>
64 ,
public math::MathGenericSycl
65 ,
public BlockSharedMemDynGenericSycl
66 ,
public BlockSharedMemStGenericSycl
67 ,
public BlockSyncGenericSycl<TDim>
68 ,
public IntrinsicGenericSycl
69 ,
public MemFenceGenericSycl
70# ifdef ALPAKA_DISABLE_VENDOR_RNG
71 ,
public rand::RandDefault
73 ,
public rand::RandGenericSycl<TDim>
75 ,
public warp::WarpGenericSycl<TDim>
76 ,
public interface::Implements<ConceptAcc, AccGenericSycl<TTag, TDim, TIdx>>
78 static_assert(TDim::value > 0,
"The SYCL accelerator must have a dimension greater than zero.");
81 AccGenericSycl(AccGenericSycl
const&) =
delete;
82 AccGenericSycl(AccGenericSycl&&) =
delete;
83 auto operator=(AccGenericSycl
const&) -> AccGenericSycl& =
delete;
84 auto operator=(AccGenericSycl&&) -> AccGenericSycl& =
delete;
87 Vec<TDim, TIdx>
const& threadElemExtent,
88 sycl::nd_item<TDim::value> work_item,
89 sycl::local_accessor<std::byte> dyn_shared_acc,
90 sycl::local_accessor<std::byte> st_shared_acc)
91 : WorkDivGenericSycl<TDim, TIdx>{threadElemExtent, work_item}
92 , gb::IdxGbGenericSycl<TDim, TIdx>{work_item}
93 , bt::IdxBtGenericSycl<TDim, TIdx>{work_item}
94 , BlockSharedMemDynGenericSycl{dyn_shared_acc}
95 , BlockSharedMemStGenericSycl{st_shared_acc}
96 , BlockSyncGenericSycl<TDim>{work_item}
97# ifndef ALPAKA_DISABLE_VENDOR_RNG
98 , rand::RandGenericSycl<TDim>{work_item}
100 , warp::WarpGenericSycl<TDim>{work_item}
109 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
110 struct AccType<AccGenericSycl<TTag, TDim, TIdx>>
112 using type = AccGenericSycl<TTag, TDim, TIdx>;
116 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
117 struct IsSingleThreadAcc<AccGenericSycl<TTag, TDim, TIdx>> : std::false_type
122 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
123 struct IsMultiThreadAcc<AccGenericSycl<TTag, TDim, TIdx>> : std::true_type
128 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
129 struct GetAccDevProps<AccGenericSycl<TTag, TDim, TIdx>>
131 static auto getAccDevProps(DevGenericSycl<TTag>
const& dev) -> AccDevProps<TDim, TIdx>
133 auto const device = dev.getNativeHandle().first;
134 auto const max_threads_dim
135 = device.template get_info<sycl::info::device::max_work_item_sizes<TDim::value>>();
136 Vec<TDim, TIdx> max_threads_dim_vec{};
137 for(
int i = 0; i < static_cast<int>(TDim::value); i++)
142 getExtentVecEnd<TDim>(Vec<DimInt<3u>, TIdx>(
144 std::numeric_limits<TIdx>::max(),
145 std::numeric_limits<TIdx>::max(),
146 std::numeric_limits<TIdx>::max())),
148 std::numeric_limits<TIdx>::max(),
156 std::numeric_limits<TIdx>::max(),
158 device.template get_info<sycl::info::device::local_mem_size>(),
165 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
166 struct GetAccName<AccGenericSycl<TTag, TDim, TIdx>>
170# if ALPAKA_COMP_CLANG
171# pragma clang diagnostic push
172# pragma clang diagnostic ignored "-Wexit-time-destructors"
174 using namespace std::literals;
175 static std::string
const accName =
176# ifdef __cpp_lib_format
187# if ALPAKA_COMP_CLANG
188# pragma clang diagnostic pop
194 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
195 struct DevType<AccGenericSycl<TTag, TDim, TIdx>>
197 using type = DevGenericSycl<TTag>;
201 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
202 struct DimType<AccGenericSycl<TTag, TDim, TIdx>>
213 typename TKernelFnObj,
215 struct CreateTaskKernel<AccGenericSycl<TTag, TDim, TIdx>, TWorkDiv, TKernelFnObj, TArgs...>
217 static auto createTaskKernel(TWorkDiv
const& workDiv, TKernelFnObj
const& kernelFnObj, TArgs&&... args)
219 return TaskKernelGenericSycl<TTag, AccGenericSycl<TTag, TDim, TIdx>, TDim, TIdx, TKernelFnObj, TArgs...>{
222 std::forward<TArgs>(args)...};
227 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
228 struct PlatformType<AccGenericSycl<TTag, TDim, TIdx>>
230 using type = PlatformGenericSycl<TTag>;
234 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
235 struct IdxType<AccGenericSycl<TTag, TDim, TIdx>>
ALPAKA_NO_HOST_ACC_WARNING static ALPAKA_FN_HOST_ACC constexpr auto all(TVal const &val) -> Vec< TDim, TVal >
Single value constructor.
auto clipCast(V const &val) -> T
The alpaka accelerator library.
ALPAKA_FN_HOST auto getAccDevProps(TDev const &dev) -> AccDevProps< Dim< TAcc >, Idx< TAcc > >
ALPAKA_FN_HOST auto createTaskKernel(TWorkDiv const &workDiv, TKernelFnObj const &kernelFnObj, TArgs &&... args)
Creates a kernel execution task.
ALPAKA_FN_HOST auto getMemBytes(TDev const &dev) -> std::size_t
alpaka::meta::InheritFromList< alpaka::meta::Unique< std::tuple< TGridAtomic, TBlockAtomic, TThreadAtomic, interface::Implements< ConceptAtomicGrids, TGridAtomic >, interface::Implements< ConceptAtomicBlocks, TBlockAtomic >, interface::Implements< ConceptAtomicThreads, TThreadAtomic > > > > AtomicHierarchy
build a single class to inherit from different atomic implementations
static ALPAKA_FN_HOST auto getAccName() -> std::string