41#ifdef __cpp_lib_format
47#ifdef ALPAKA_ACC_CPU_B_TBB_T_SEQ_ENABLED
53 template<
typename TDim,
typename TIdx,
typename TKernelFnObj,
typename... TArgs>
54 class TaskKernelCpuTbbBlocks;
57 template<
typename TDim,
typename TIdx>
58 class AccCpuTbbBlocks final
60 ,
public gb::IdxGbRef<TDim, TIdx>
61 ,
public bt::IdxBtZero<TDim, TIdx>
66 ,
public math::MathStdLib
67 ,
public BlockSharedMemDynMember<>
68 ,
public BlockSharedMemStMember<>
69 ,
public BlockSyncNoOp
70 ,
public GridSyncBarrierTbb<TIdx>
73# ifdef ALPAKA_DISABLE_VENDOR_RNG
74 ,
public rand::RandDefault
78 ,
public warp::WarpSingleThread
79 ,
public interface::Implements<InterfaceAcc, AccCpuTbbBlocks<TDim, TIdx>>
82 sizeof(TIdx) >=
sizeof(int),
83 "Index type is not supported, consider using int or a larger type.");
87 template<
typename TDim2,
typename TIdx2,
typename TKernelFnObj,
typename... TArgs>
88 friend class ::alpaka::TaskKernelCpuTbbBlocks;
90 AccCpuTbbBlocks(AccCpuTbbBlocks
const&) =
delete;
91 AccCpuTbbBlocks(AccCpuTbbBlocks&&) =
delete;
92 auto operator=(AccCpuTbbBlocks
const&) -> AccCpuTbbBlocks& =
delete;
93 auto operator=(AccCpuTbbBlocks&&) -> AccCpuTbbBlocks& =
delete;
96 template<
typename TWorkDiv>
98 TWorkDiv
const& workDiv,
99 std::size_t
const& blockSharedMemDynSizeBytes,
100 core::tbb::BarrierThread<TIdx>& barrier)
102 , gb::IdxGbRef<TDim, TIdx>(m_gridBlockIdx)
103 , BlockSharedMemDynMember<>(blockSharedMemDynSizeBytes)
104 , BlockSharedMemStMember<>(staticMemBegin(), staticMemCapacity())
105 , GridSyncBarrierTbb<TIdx>(barrier)
106 , m_gridBlockIdx(
Vec<TDim, TIdx>::zeros())
112 Vec<TDim, TIdx>
mutable m_gridBlockIdx;
118 template<
typename TDim,
typename TIdx>
119 struct AccType<AccCpuTbbBlocks<TDim, TIdx>>
121 using type = AccCpuTbbBlocks<TDim, TIdx>;
125 template<
typename TDim,
typename TIdx>
126 struct IsSingleThreadAcc<AccCpuTbbBlocks<TDim, TIdx>> : std::true_type
131 template<
typename TDim,
typename TIdx>
132 struct IsMultiThreadAcc<AccCpuTbbBlocks<TDim, TIdx>> : std::false_type
137 template<
typename TDim,
typename TIdx>
138 struct GetAccDevProps<AccCpuTbbBlocks<TDim, TIdx>>
147 std::numeric_limits<TIdx>::max(),
151 static_cast<TIdx
>(1),
155 std::numeric_limits<TIdx>::max(),
157 static_cast<size_t>(AccCpuTbbBlocks<TDim, TIdx>::staticAllocBytes()),
166 template<
typename TDim,
typename TIdx>
167 struct GetAccName<AccCpuTbbBlocks<TDim, TIdx>>
171# if ALPAKA_COMP_CLANG
172# pragma clang diagnostic push
173# pragma clang diagnostic ignored "-Wexit-time-destructors"
175 using namespace std::literals;
176 static std::string
const accName =
177# ifdef __cpp_lib_format
184# if ALPAKA_COMP_CLANG
185# pragma clang diagnostic pop
191 template<
typename TDim,
typename TIdx>
192 struct DevType<AccCpuTbbBlocks<TDim, TIdx>>
198 template<
typename TDim,
typename TIdx>
199 struct DimType<AccCpuTbbBlocks<TDim, TIdx>>
205 template<
typename TDim,
typename TIdx,
typename TWorkDiv,
typename TKernelFnObj,
typename... TArgs>
206 struct CreateTaskKernel<AccCpuTbbBlocks<TDim, TIdx>, TWorkDiv, TKernelFnObj, TArgs...>
209 TWorkDiv
const& workDiv,
210 TKernelFnObj
const& kernelFnObj,
213 if(workDiv.m_blockThreadExtent.prod() !=
static_cast<TIdx
>(1u))
215 throw std::runtime_error(
216 "The given work division is not valid for a single thread Acc: "
217 +
getAccName<AccCpuTbbBlocks<TDim, TIdx>>() +
". Threads per block should be 1!");
220 return TaskKernelCpuTbbBlocks<TDim, TIdx, TKernelFnObj, TArgs...>(
223 std::forward<TArgs>(args)...);
228 template<
typename TDim,
typename TIdx,
typename TWorkDiv,
typename TKernelFnObj,
typename... TArgs>
229 struct CreateTaskCooperativeKernel<AccCpuTbbBlocks<TDim, TIdx>, TWorkDiv, TKernelFnObj, TArgs...>
232 TWorkDiv
const& workDiv,
233 TKernelFnObj
const& kernelFnObj,
236 if(workDiv.m_blockThreadExtent.prod() !=
static_cast<TIdx
>(1u))
238 throw std::runtime_error(
239 "The given work division is not valid for a single thread Acc: "
240 +
getAccName<AccCpuTbbBlocks<TDim, TIdx>>() +
". Threads per block should be 1!");
243 auto const maxBlocks = tbb::this_task_arena::max_concurrency();
244 if(gridBlockExtent.prod() >
static_cast<TIdx
>(maxBlocks))
246 throw std::runtime_error(
247 "The number of requested blocks is larger than maximuma of the device for TBB "
248 "accelerator. Requested: "
249 + std::to_string(gridBlockExtent.prod()) +
", maximum allowed: " + std::to_string(maxBlocks)
250 +
". Use getMaxActiveBlocks().");
253 return TaskKernelCpuTbbBlocks<TDim, TIdx, TKernelFnObj, TArgs...>(
256 std::forward<TArgs>(args)...);
261 template<
typename TDim,
typename TIdx>
262 struct PlatformType<AccCpuTbbBlocks<TDim, TIdx>>
264 using type = PlatformCpu;
268 template<
typename TDim,
typename TIdx>
269 struct IdxType<AccCpuTbbBlocks<TDim, TIdx>>
274 template<
typename TDim,
typename TIdx>
280 template<
typename TDim,
typename TIdx>
283 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.
constexpr std::string_view demangled
auto clipCast(V const &val) -> T
TinyMersenneTwister RandStdLib
The alpaka accelerator library.
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto getWorkDiv(TWorkDiv const &workDiv) -> Vec< Dim< TWorkDiv >, Idx< TWorkDiv > >
Get the extent requested.
typename trait::AccToTag< TAcc >::type AccToTag
maps an acc type to a tag type
ALPAKA_FN_HOST auto getAccDevProps(TDev const &dev) -> AccDevProps< Dim< TAcc >, Idx< TAcc > >
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.
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_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...
typename trait::TagToAcc< TTag, TDim, TIdx >::type TagToAcc
maps a tag type to an acc type
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
static ALPAKA_FN_HOST auto getAccName() -> std::string