39#ifdef __cpp_lib_format
45#ifdef ALPAKA_ACC_CPU_B_TBB_T_SEQ_ENABLED
51 template<
typename TDim,
typename TIdx,
typename TKernelFnObj,
typename... TArgs>
52 class TaskKernelCpuTbbBlocks;
55 template<
typename TDim,
typename TIdx>
56 class AccCpuTbbBlocks final
58 ,
public gb::IdxGbRef<TDim, TIdx>
59 ,
public bt::IdxBtZero<TDim, TIdx>
64 ,
public math::MathStdLib
65 ,
public BlockSharedMemDynMember<>
66 ,
public BlockSharedMemStMember<>
67 ,
public BlockSyncNoOp
70# ifdef ALPAKA_DISABLE_VENDOR_RNG
71 ,
public rand::RandDefault
75 ,
public warp::WarpSingleThread
76 ,
public interface::Implements<ConceptAcc, AccCpuTbbBlocks<TDim, TIdx>>
79 sizeof(TIdx) >=
sizeof(
int),
80 "Index type is not supported, consider using int or a larger type.");
84 template<
typename TDim2,
typename TIdx2,
typename TKernelFnObj,
typename... TArgs>
85 friend class ::alpaka::TaskKernelCpuTbbBlocks;
87 AccCpuTbbBlocks(AccCpuTbbBlocks
const&) =
delete;
88 AccCpuTbbBlocks(AccCpuTbbBlocks&&) =
delete;
89 auto operator=(AccCpuTbbBlocks
const&) -> AccCpuTbbBlocks& =
delete;
90 auto operator=(AccCpuTbbBlocks&&) -> AccCpuTbbBlocks& =
delete;
93 template<
typename TWorkDiv>
94 ALPAKA_FN_HOST AccCpuTbbBlocks(TWorkDiv
const& workDiv, std::size_t
const& blockSharedMemDynSizeBytes)
96 , gb::IdxGbRef<TDim, TIdx>(m_gridBlockIdx)
97 , BlockSharedMemDynMember<>(blockSharedMemDynSizeBytes)
98 , BlockSharedMemStMember<>(staticMemBegin(), staticMemCapacity())
99 , m_gridBlockIdx(
Vec<TDim, TIdx>::zeros())
105 Vec<TDim, TIdx>
mutable m_gridBlockIdx;
111 template<
typename TDim,
typename TIdx>
112 struct AccType<AccCpuTbbBlocks<TDim, TIdx>>
114 using type = AccCpuTbbBlocks<TDim, TIdx>;
118 template<
typename TDim,
typename TIdx>
119 struct IsSingleThreadAcc<AccCpuTbbBlocks<TDim, TIdx>> : std::true_type
124 template<
typename TDim,
typename TIdx>
125 struct IsMultiThreadAcc<AccCpuTbbBlocks<TDim, TIdx>> : std::false_type
130 template<
typename TDim,
typename TIdx>
131 struct GetAccDevProps<AccCpuTbbBlocks<TDim, TIdx>>
140 std::numeric_limits<TIdx>::max(),
144 static_cast<TIdx
>(1),
146 Vec<TDim, TIdx>::all(std::numeric_limits<TIdx>::max()),
148 std::numeric_limits<TIdx>::max(),
150 static_cast<size_t>(AccCpuTbbBlocks<TDim, TIdx>::staticAllocBytes()),
157 template<
typename TDim,
typename TIdx>
158 struct GetAccName<AccCpuTbbBlocks<TDim, TIdx>>
162# if ALPAKA_COMP_CLANG
163# pragma clang diagnostic push
164# pragma clang diagnostic ignored "-Wexit-time-destructors"
166 using namespace std::literals;
167 static std::string
const accName =
168# ifdef __cpp_lib_format
175# if ALPAKA_COMP_CLANG
176# pragma clang diagnostic pop
182 template<
typename TDim,
typename TIdx>
183 struct DevType<AccCpuTbbBlocks<TDim, TIdx>>
189 template<
typename TDim,
typename TIdx>
190 struct DimType<AccCpuTbbBlocks<TDim, TIdx>>
196 template<
typename TDim,
typename TIdx,
typename TWorkDiv,
typename TKernelFnObj,
typename... TArgs>
197 struct CreateTaskKernel<AccCpuTbbBlocks<TDim, TIdx>, TWorkDiv, TKernelFnObj, TArgs...>
200 TWorkDiv
const& workDiv,
201 TKernelFnObj
const& kernelFnObj,
204 if(workDiv.m_blockThreadExtent.prod() !=
static_cast<TIdx
>(1u))
206 throw std::runtime_error(
207 "The given work division is not valid for a single thread Acc: "
208 +
getAccName<AccCpuTbbBlocks<TDim, TIdx>>() +
". Threads per block should be 1!");
211 return TaskKernelCpuTbbBlocks<TDim, TIdx, TKernelFnObj, TArgs...>(
214 std::forward<TArgs>(args)...);
219 template<
typename TDim,
typename TIdx>
220 struct PlatformType<AccCpuTbbBlocks<TDim, TIdx>>
222 using type = PlatformCpu;
226 template<
typename TDim,
typename TIdx>
227 struct IdxType<AccCpuTbbBlocks<TDim, TIdx>>
232 template<
typename TDim,
typename TIdx>
238 template<
typename TDim,
typename TIdx>
241 using type = alpaka::AccCpuTbbBlocks<TDim, TIdx>;
ALPAKA_NO_HOST_ACC_WARNING static ALPAKA_FN_HOST_ACC constexpr auto ones() -> Vec< TDim, TVal >
One value constructor.
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
TinyMersenneTwister RandStdLib
The alpaka accelerator library.
ALPAKA_FN_HOST auto getAccDevProps(TDev const &dev) -> AccDevProps< Dim< TAcc >, Idx< TAcc > >
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC WorkDivMembers(alpaka::Vec< TDim, TIdx > const &gridBlockExtent, alpaka::Vec< TDim, TIdx > const &blockThreadExtent, alpaka::Vec< TDim, TIdx > const &elemExtent) -> WorkDivMembers< TDim, TIdx >
Deduction guide for the constructor which can be called without explicit template type parameters.
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_FN_HOST auto getAccName() -> std::string
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
ALPAKA_FN_HOST_ACC Vec(TFirstIndex &&, TRestIndices &&...) -> Vec< DimInt< 1+sizeof...(TRestIndices)>, std::decay_t< TFirstIndex > >
typename trait::AccToTag< TAcc >::type AccToTag
maps an acc type to a tag type
typename trait::TagToAcc< TTag, TDim, TIdx >::type TagToAcc
maps a tag type to an acc type
static ALPAKA_FN_HOST auto getAccName() -> std::string