42#ifdef __cpp_lib_format
48#ifdef ALPAKA_ACC_SYCL_ENABLED
50# include <sycl/sycl.hpp>
59 typename TKernelFnObj,
62 class TaskKernelGenericSycl;
67 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
69 :
public WorkDivGenericSycl<TDim, TIdx>
70 ,
public gb::IdxGbGenericSycl<TDim, TIdx>
71 ,
public bt::IdxBtGenericSycl<TDim, TIdx>
72 ,
public AtomicHierarchy<AtomicGenericSycl, AtomicGenericSycl, AtomicGenericSycl>
73 ,
public math::MathGenericSycl
74 ,
public BlockSharedMemDynGenericSycl
75 ,
public BlockSharedMemStGenericSycl
76 ,
public BlockSyncGenericSycl<TDim>
77 ,
public GridSyncGenericSycl<TDim>
78 ,
public IntrinsicGenericSycl
79 ,
public MemFenceGenericSycl
80# ifdef ALPAKA_DISABLE_VENDOR_RNG
81 ,
public rand::RandDefault
83 ,
public rand::RandGenericSycl<TDim>
85 ,
public warp::WarpGenericSycl<TDim>
86 ,
public interface::Implements<InterfaceAcc, AccGenericSycl<TTag, TDim, TIdx>>
88 static_assert(TDim::value > 0,
"The SYCL accelerator must have a dimension greater than zero.");
91 AccGenericSycl(AccGenericSycl
const&) =
delete;
92 AccGenericSycl(AccGenericSycl&&) =
delete;
93 auto operator=(AccGenericSycl
const&) -> AccGenericSycl& =
delete;
94 auto operator=(AccGenericSycl&&) -> AccGenericSycl& =
delete;
97 Vec<TDim, TIdx>
const& threadElemExtent,
98 sycl::nd_item<TDim::value> work_item,
99 sycl::local_accessor<std::byte> dyn_shared_acc,
100 sycl::local_accessor<std::byte> st_shared_acc)
101 : WorkDivGenericSycl<TDim, TIdx>{threadElemExtent, work_item}
102 , gb::IdxGbGenericSycl<TDim, TIdx>{work_item}
103 , bt::IdxBtGenericSycl<TDim, TIdx>{work_item}
104 , BlockSharedMemDynGenericSycl{dyn_shared_acc}
105 , BlockSharedMemStGenericSycl{st_shared_acc}
106 , BlockSyncGenericSycl<TDim>{work_item}
107 , GridSyncGenericSycl<TDim>{work_item}
108# ifndef ALPAKA_DISABLE_VENDOR_RNG
109 , rand::RandGenericSycl<TDim>{work_item}
111 , warp::WarpGenericSycl<TDim>{work_item}
121 template<concepts::Tag TTag>
122 auto syclCooperativeLaunch([[maybe_unused]] sycl::device
const& device) ->
bool
124 if constexpr(std::is_same_v<TTag, TagFpgaSyclIntel>)
131# ifdef SYCL_EXT_ONEAPI_FORWARD_PROGRESS
132 namespace syclex = sycl::ext::oneapi::experimental;
133 auto const caps = device.template get_info<
134 syclex::info::device::work_group_progress_capabilities<syclex::execution_scope::root_group>>();
135 return std::find(caps.begin(), caps.end(), syclex::forward_progress_guarantee::concurrent) != caps.end();
147 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
148 struct AccType<AccGenericSycl<TTag, TDim, TIdx>>
150 using type = AccGenericSycl<TTag, TDim, TIdx>;
154 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
155 struct IsSingleThreadAcc<AccGenericSycl<TTag, TDim, TIdx>> : std::false_type
160 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
161 struct IsMultiThreadAcc<AccGenericSycl<TTag, TDim, TIdx>> : std::true_type
166 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
167 struct GetAccDevProps<AccGenericSycl<TTag, TDim, TIdx>>
169 static auto getAccDevProps(DevGenericSycl<TTag>
const& dev) -> AccDevProps<TDim, TIdx>
171 auto const device = dev.getNativeHandle().first;
172 auto const max_threads_dim
173 = device.template get_info<sycl::info::device::max_work_item_sizes<TDim::value>>();
174 Vec<TDim, TIdx> max_threads_dim_vec{};
175 for(
int i = 0; i < static_cast<int>(TDim::value); i++)
182 std::numeric_limits<TIdx>::max(),
183 std::numeric_limits<TIdx>::max(),
184 std::numeric_limits<TIdx>::max())),
186 std::numeric_limits<TIdx>::max(),
194 std::numeric_limits<TIdx>::max(),
196 device.template get_info<sycl::info::device::local_mem_size>(),
200 alpaka::detail::syclCooperativeLaunch<TTag>(device)};
205 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
206 struct GetAccName<AccGenericSycl<TTag, TDim, TIdx>>
210# if ALPAKA_COMP_CLANG
211# pragma clang diagnostic push
212# pragma clang diagnostic ignored "-Wexit-time-destructors"
214 using namespace std::literals;
215 static std::string
const accName =
216# ifdef __cpp_lib_format
227# if ALPAKA_COMP_CLANG
228# pragma clang diagnostic pop
234 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
235 struct DevType<AccGenericSycl<TTag, TDim, TIdx>>
237 using type = DevGenericSycl<TTag>;
241 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
242 struct DimType<AccGenericSycl<TTag, TDim, TIdx>>
253 typename TKernelFnObj,
255 struct CreateTaskKernel<AccGenericSycl<TTag, TDim, TIdx>, TWorkDiv, TKernelFnObj, TArgs...>
257 static auto createTaskKernel(TWorkDiv
const& workDiv, TKernelFnObj
const& kernelFnObj, TArgs&&... args)
259 return TaskKernelGenericSycl<
261 AccGenericSycl<TTag, TDim, TIdx>,
266 TArgs...>{workDiv, kernelFnObj, std::forward<TArgs>(args)...};
271 template<
typename TTag,
typename TDim,
typename TIdx,
typename TWorkDiv,
typename TKernelFnObj,
typename... TArgs>
272 struct CreateTaskCooperativeKernel<AccGenericSycl<TTag, TDim, TIdx>, TWorkDiv, TKernelFnObj, TArgs...>
275 TWorkDiv
const& workDiv,
276 TKernelFnObj
const& kernelFnObj,
279 return TaskKernelGenericSycl<
281 AccGenericSycl<TTag, TDim, TIdx>,
286 TArgs...>{workDiv, kernelFnObj, std::forward<TArgs>(args)...};
291 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
292 struct PlatformType<AccGenericSycl<TTag, TDim, TIdx>>
294 using type = PlatformGenericSycl<TTag>;
298 template<concepts::Tag TTag,
typename TDim,
typename TIdx>
299 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.
constexpr std::string_view demangled
auto clipCast(V const &val) -> T
The alpaka accelerator library.
ALPAKA_FN_HOST auto getAccDevProps(TDev const &dev) -> AccDevProps< Dim< TAcc >, Idx< TAcc > >
Vec(TFirstIndex &&, TRestIndices &&...) -> Vec< DimInt< 1+sizeof...(TRestIndices)>, std::decay_t< TFirstIndex > >
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_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC constexpr auto getExtentVecEnd(T const &object={}) -> Vec< TDim, Idx< T > >
ALPAKA_FN_HOST auto createTaskCooperativeKernel(TWorkDiv const &workDiv, TKernelFnObj const &kernelFnObj, TArgs &&... args)
Creates a cooperative kernel execution task. Allows to use grid sync, but disables dynamic parallelis...
std::integral_constant< std::size_t, N > DimInt
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