34 typename TKernelFnObj,
43 typename TKernelFnObj,
49 template<
typename TAcc,
typename TDev,
typename TKernelFnObj,
typename TDim,
typename TIdx,
typename... TArgs>
58 template<
typename TKernelFnObj,
typename TAcc,
typename TSfinae =
void>
62# pragma clang diagnostic push
63# pragma clang diagnostic ignored \
74# pragma clang diagnostic pop
77 template<
typename TDim,
typename... TArgs>
79 [[maybe_unused]] TKernelFnObj
const& kernelFnObj,
80 [[maybe_unused]]
Vec<TDim,
Idx<TAcc>>
const& blockThreadExtent,
81 [[maybe_unused]]
Vec<TDim,
Idx<TAcc>>
const& threadElemExtent,
82 [[maybe_unused]] TArgs
const&... args) -> std::size_t
92 template<
typename TAcc,
typename TDev,
typename TKernelFnObj,
typename... TArgs>
101 [[maybe_unused]] TDev
const& dev,
102 [[maybe_unused]] TKernelFnObj
const& kernelFn,
105 std::string
const str
106 = std::string(__func__) +
" function is not specialised for the given arguments.\n";
107 throw std::invalid_argument{str};
117 template<
typename TKernelFnObj,
typename TAcc,
typename TSfinae =
void>
118 struct WarpSize : std::integral_constant<std::uint32_t, 0>
123 template<
typename TKernelFnObj,
typename TAcc>
141 template<
typename TKernelFnObj,
typename TAcc,
typename TSfinae =
void>
146 struct TraitNotSpecialized
152# pragma clang diagnostic push
153# pragma clang diagnostic ignored \
164# pragma clang diagnostic pop
167 template<
typename TDim,
typename... TArgs>
169 [[maybe_unused]] TKernelFnObj
const& kernelFnObj,
170 [[maybe_unused]]
Vec<TDim,
Idx<TAcc>>
const& blockThreadExtent,
171 [[maybe_unused]]
Vec<TDim,
Idx<TAcc>>
const& threadElemExtent,
172 [[maybe_unused]] TArgs
const&... args) -> TraitNotSpecialized
174 return TraitNotSpecialized{};
180# pragma clang diagnostic push
181# pragma clang diagnostic ignored \
192# pragma clang diagnostic pop
195 template<
typename TAcc,
typename TKernelFnObj,
typename TDim,
typename... TArgs>
198 TKernelFnObj
const& kernelFnObj,
201 TArgs
const&... args) -> std::size_t
219 template<
typename TAcc,
typename TDev,
typename TKernelFnObj,
typename... TArgs>
226 std::forward<TArgs>(args)...);
230# pragma clang diagnostic push
231# pragma clang diagnostic ignored \
244# pragma clang diagnostic pop
247 template<
typename TAcc,
typename TDev,
typename TKernelFnObj,
typename TDim,
typename TIdx,
typename... TArgs>
250 TKernelFnObj
const& kernelFnObj,
253 TArgs
const&... args) ->
int
267# pragma clang diagnostic push
268# pragma clang diagnostic ignored \
281# pragma clang diagnostic pop
284 template<
typename TAcc,
typename TDev,
typename TKernelFnObj,
typename TIdx,
typename... TArgs>
288 TKernelFnObj
const& kernelFnObj,
289 TIdx
const& blockThreadExtent,
290 TIdx
const& threadElemExtent,
291 TArgs
const&... args) ->
int
293 auto const v_blockThreadExtent =
Vec<DimInt<1>, TIdx>(blockThreadExtent);
294 auto const v_threadElemExtent =
Vec<DimInt<1>, TIdx>(threadElemExtent);
304# pragma clang diagnostic push
305# pragma clang diagnostic ignored \
316# pragma clang diagnostic pop
318 template<
typename TAcc,
typename TKernelFnObj,
typename TDim,
typename... TArgs>
320 TKernelFnObj
const& kernelFnObj,
323 TArgs
const&... args)
333# pragma clang diagnostic push
334# pragma clang diagnostic ignored \
350 template<
typename T,
typename =
void>
352 : std::bool_constant<std::is_empty_v<T> || std::is_trivially_copyable_v<T>>
371 template<
typename TKernelFnObj,
typename TAcc,
typename... TArgs>
375 std::is_invocable_r_v<void, TKernelFnObj
const&, TAcc
const&, TArgs&&...>,
376 "The kernel is not invocable with the given arguments!");
390 template<
typename T,
typename =
void>
393 : std::bool_constant<
394 std::is_trivially_copyable_v<T> || __nv_is_extended_device_lambda_closure_type(T)
395 || __nv_is_extended_host_device_lambda_closure_type(T)>
397 : std::is_trivially_copyable<T>
408# pragma clang diagnostic push
409# pragma clang diagnostic ignored \
420# pragma clang diagnostic pop
422 template<
typename TAcc,
typename TWorkDiv,
typename TKernelFnObj,
typename... TArgs>
428 "Kernels must be trivially copyable or an extended CUDA lambda expression!");
435 "The dimensions of TAcc and TWorkDiv have to be identical!");
437 std::is_same_v<Idx<std::decay_t<TWorkDiv>>,
Idx<TAcc>>,
438 "The idx type of TAcc and the idx type of TWorkDiv have to be identical!");
440#if ALPAKA_DEBUG >= ALPAKA_DEBUG_FULL
441 std::cout << __func__ <<
" workDiv: " << workDiv <<
", kernelFnObj: " <<
core::demangled<
decltype(kernelFnObj)>
447 std::forward<TArgs>(args)...);
451# pragma clang diagnostic push
452# pragma clang diagnostic ignored \
464# pragma clang diagnostic pop
466 template<
typename TAcc,
typename TWorkDiv,
typename TKernelFnObj,
typename... TArgs>
468 TWorkDiv
const& workDiv,
469 TKernelFnObj
const& kernelFnObj,
475 "Kernels must be trivially copyable or an extended CUDA lambda expression!");
482 "The dimensions of TAcc and TWorkDiv have to be identical!");
484 std::is_same_v<Idx<std::decay_t<TWorkDiv>>,
Idx<TAcc>>,
485 "The idx type of TAcc and the idx type of TWorkDiv have to be identical!");
487#if ALPAKA_DEBUG >= ALPAKA_DEBUG_FULL
488 std::cout << __func__ <<
" workDiv: " << workDiv <<
", kernelFnObj: " <<
core::demangled<
decltype(kernelFnObj)>
494 std::forward<TArgs>(args)...);
498# pragma clang diagnostic push
499# pragma clang diagnostic ignored \
510# pragma clang diagnostic pop
512 template<concepts::Acc TAcc,
typename TQueue,
typename TWorkDiv,
typename TKernelFnObj,
typename... TArgs>
513 ALPAKA_FN_HOST auto exec(TQueue& queue, TWorkDiv
const& workDiv, TKernelFnObj
const& kernelFnObj, TArgs&&... args)
520# pragma clang diagnostic push
521# pragma clang diagnostic ignored \
532# pragma clang diagnostic pop
534 template<concepts::Tag TTag,
typename TQueue,
typename TWorkDiv,
typename TKernelFnObj,
typename... TArgs>
535 ALPAKA_FN_HOST auto exec(TQueue& queue, TWorkDiv
const& workDiv, TKernelFnObj
const& kernelFnObj, TArgs&&... args)
543# pragma clang diagnostic push
544# pragma clang diagnostic ignored \
555# pragma clang diagnostic pop
557 template<concepts::Tag TTag,
typename TQueue,
typename TWorkDiv,
typename TKernelFnObj,
typename... TArgs>
560 TWorkDiv
const& workDiv,
561 TKernelFnObj
const& kernelFnObj,
562 TArgs&&... args) ->
void
569 std::forward<TArgs>(args)...));
#define ALPAKA_FN_HOST_ACC
#define ALPAKA_NO_HOST_ACC_WARNING
Disable nvcc warning: 'calling a host function from host device function.' Usage: ALPAKA_NO_HOST_ACC_...
constexpr std::string_view demangled
ALPAKA_FN_HOST_ACC auto checkKernelReturnType(TKernelFnObj const &, TAcc const &, TArgs &&...) -> void
void assertKernelArgIsTriviallyCopyable()
constexpr std::uint32_t warpSize
This is a shortcut for the trait defined above.
The alpaka accelerator library.
constexpr bool isKernelTriviallyCopyable
typename trait::AccType< T >::type Acc
The accelerator type trait alias template to remove the ::type.
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST auto getFunctionAttributes(TDev const &dev, TKernelFnObj const &kernelFnObj, TArgs &&... args) -> alpaka::KernelFunctionAttributes
typename trait::IdxType< T >::type Idx
ALPAKA_FN_HOST auto createTaskKernel(TWorkDiv const &workDiv, TKernelFnObj const &kernelFnObj, TArgs &&... args)
Creates a kernel execution task.
ALPAKA_FN_HOST auto execCooperative(TQueue &queue, TWorkDiv const &workDiv, TKernelFnObj const &kernelFnObj, TArgs &&... args) -> void
Executes the given kernel in cooperative mode in the given queue.
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto getMaxActiveBlocks(TDev const &device, TKernelFnObj const &kernelFnObj, alpaka::Vec< TDim, TIdx > const &blockThreadExtent, alpaka::Vec< TDim, TIdx > const &threadElemExtent, TArgs const &... args) -> int
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 enqueue(TQueue &queue, TTask &&task) -> void
Queues the given task in the given queue.
ALPAKA_FN_HOST auto exec(TQueue &queue, TWorkDiv const &workDiv, TKernelFnObj const &kernelFnObj, TArgs &&... args) -> void
Executes the given kernel in the given queue.
ALPAKA_FN_HOST auto getOmpSchedule(TKernelFnObj const &kernelFnObj, Vec< TDim, Idx< TAcc > > const &blockThreadExtent, Vec< TDim, Idx< TAcc > > const &threadElemExtent, TArgs const &... args)
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto getBlockSharedMemDynSizeBytes(TKernelFnObj const &kernelFnObj, Vec< TDim, Idx< TAcc > > const &blockThreadExtent, Vec< TDim, Idx< TAcc > > const &threadElemExtent, TArgs const &... args) -> std::size_t
constexpr bool isKernelArgumentTriviallyCopyable
typename trait::DimType< T >::type Dim
The dimension type trait alias template to remove the ::type.
Check if a type used as kernel argument is trivially copyable.
Check if the kernel type is trivially copyable.
Kernel function attributes struct. Attributes are filled by calling the API of the accelerator using ...
The trait for getting the size of the block shared dynamic memory of a kernel.
ALPAKA_NO_HOST_ACC_WARNING static ALPAKA_FN_HOST_ACC auto getBlockSharedMemDynSizeBytes(TKernelFnObj const &kernelFnObj, Vec< TDim, Idx< TAcc > > const &blockThreadExtent, Vec< TDim, Idx< TAcc > > const &threadElemExtent, TArgs const &... args) -> std::size_t
The cooperative kernel execution task creation trait.
The kernel execution task creation trait.
The structure template to access to the functions attributes of a kernel function object.
static ALPAKA_FN_HOST auto getFunctionAttributes(TDev const &dev, TKernelFnObj const &kernelFn, TArgs &&... args) -> alpaka::KernelFunctionAttributes
Get maximum requested blocks for cooperative kernel trait.
The trait for getting the schedule to use when a kernel is run using the CpuOmp2Blocks accelerator.
ALPAKA_NO_HOST_ACC_WARNING static ALPAKA_FN_HOST auto getOmpSchedule(TKernelFnObj const &kernelFnObj, Vec< TDim, Idx< TAcc > > const &blockThreadExtent, Vec< TDim, Idx< TAcc > > const &threadElemExtent, TArgs const &... args) -> TraitNotSpecialized
The trait for getting the warp size required by a kernel.