30#if ALPAKA_LANG_CUDA || ALPAKA_LANG_HIP
39 namespace unifiedCudaHip
43 template<
typename T_Device>
44 struct Queue : std::enable_shared_from_this<Queue<T_Device>>
46 using ApiInterface =
typename T_Device::ApiInterface;
49 Queue(internal::concepts::DeviceHandle
auto device, uint32_t
const idx,
bool isBlocking)
50 : m_device(std::move(
device))
52 , m_isBlocking(isBlocking)
55 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
57 ApiInterface::setDevice(onHost::getNativeHandle(m_device)));
58 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
60 ApiInterface::streamCreateWithFlags(&m_UniformCudaHipQueue, ApiInterface::streamNonBlocking));
66 onHost::internal::wait(*
this);
67 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK_NOEXCEPT(
72 Queue(Queue
const&) =
delete;
73 Queue& operator=(Queue
const&) =
delete;
75 Queue(Queue&&) =
delete;
76 Queue& operator=(Queue&&) =
delete;
80 return m_idx == other.m_idx && m_device == other.m_device;
85 return !(*
this == other);
91 static_assert(internal::concepts::Queue<Queue>);
94 Handle<T_Device> m_device;
96 typename ApiInterface::Stream_t m_UniformCudaHipQueue;
97 core::CallbackThread m_callBackThread;
98 bool m_isBlocking{
false};
107 void conditionalWait() const noexcept
110 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(ApiInterface, ApiInterface::streamSynchronize(
getNativeHandle()));
113 friend struct alpaka::internal::GetName;
117 return std::string(
"unifiedCudaHip::Queue id=") + std::to_string(m_idx);
120 friend struct onHost::internal::GetNativeHandle;
124 return m_UniformCudaHipQueue;
127 friend struct onHost::internal::Enqueue;
128 friend struct onHost::internal::Wait;
132 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(ApiInterface, ApiInterface::streamSynchronize(
getNativeHandle()));
135 friend struct alpaka::internal::GetDeviceType;
139 return alpaka::internal::getDeviceKind(*m_device.get());
142 auto getDevice()
const
147 std::shared_ptr<Queue> getSharedPtr()
149 return this->shared_from_this();
152 friend struct alpaka::onHost::internal::WaitFor;
154 void waitFor(unifiedCudaHip::Event<T_Device>& event)
156 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
158 ApiInterface::streamWaitEvent(
getNativeHandle(), internal::getNativeHandle(event), 0));
163 friend struct internal::IsQueueEmpty;
165 bool isQueueEmpty()
const
169 typename ApiInterface::Error_t ret = ApiInterface::success;
170 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK_IGNORE(
173 ApiInterface::errorNotReady);
174 return (ret == ApiInterface::success);
177 void enqueueNativeFn(
auto const& fn)
184 friend struct onHost::internal::GetDevice;
186 friend struct alpaka::internal::GetApi;
187 friend struct onHost::internal::Memcpy;
188 friend struct onHost::internal::MemcpyDeviceGlobal;
189 friend struct onHost::internal::Memset;
190 friend struct onHost::internal::AllocDeferred;
191 friend struct CallKernel;
195 alpaka::concepts::Api T_Api,
196 alpaka::concepts::DeviceKind T_DeviceKind,
197 alpaka::concepts::Executor T_Executor,
198 bool launchedWidthFrameSpec,
199 typename TKernelBundle,
200 typename T_OptimizedThreadSpec>
201 __global__
void gpuKernel(TKernelBundle
const kernelBundle, T_OptimizedThreadSpec
const optimizedThreadSpec)
203 constexpr auto warpSizeValue = alpaka::onAcc::unifiedCudaHip::internal::WarpSize::Get<T_DeviceKind>{}();
204 auto acc = onAcc::Acc{
206 DictEntry(
layer::block, onAcc::unifiedCudaHip::BlockLayer{optimizedThreadSpec}),
207 DictEntry(
layer::thread, onAcc::unifiedCudaHip::ThreadLayer{optimizedThreadSpec}),
208 DictEntry(object::launchedWidthFrameSpec, std::bool_constant<launchedWidthFrameSpec>{}),
209 DictEntry(action::threadBlockSync, onAcc::unifiedCudaHip::Sync{}),
212 DictEntry(object::exec, T_Executor{}),
218 ALPAKA_FN_HOST auto convertVecToUniformCudaHipDim(alpaka::concepts::Vector
auto const& vec) -> dim3
222 if constexpr(vecDim >= 1u)
223 dim.x =
static_cast<unsigned>(vec[vecDim - 1u]);
224 if constexpr(vecDim >= 2u)
225 dim.y =
static_cast<unsigned>(vec[vecDim - 2u]);
226 if constexpr(vecDim >= 3u)
227 dim.z =
static_cast<unsigned>(vec[vecDim - 3u]);
234 template<alpaka::concepts::Vector T_NumBlocks, alpaka::concepts::Vector T_NumThreads>
235 struct OptimizedThreadSpec
237 using NumBlocksVecType =
typename T_NumBlocks::UniVec;
238 using NumThreadsVecType = T_NumThreads;
240 static consteval uint32_t dim()
242 return T_NumThreads::dim();
245 constexpr OptimizedThreadSpec(T_NumBlocks
const&, T_NumThreads
const&)
251 bool launchedWidthFrameSpec,
253 alpaka::concepts::Vector T_NumBlocks,
254 alpaka::concepts::Vector T_NumThreads,
255 alpaka::concepts::Executor T_Executor,
256 typename T_KernelBundle>
258 unifiedCudaHip::Queue<T_Device>& queue,
259 ThreadSpec<T_NumBlocks, T_NumThreads, T_Executor>
const& threadSpec,
260 T_KernelBundle
const& kernelBundle)
const
264 "'exec::anyExecutor' can not be used to enqueue an kernel.");
267 using ApiInterface =
typename unifiedCudaHip::Queue<T_Device>::ApiInterface;
268 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
270 ApiInterface::setDevice(onHost::getNativeHandle(
queue.m_device)));
272 constexpr uint32_t dim = T_NumBlocks::dim();
274 constexpr uint32_t layerDim = dim >= 4u ? 1u : dim;
275 using IdxType =
typename T_NumBlocks::type;
277 Vec<IdxType, layerDim> numBlocks;
278 Vec<IdxType, layerDim> numThreadsPerBlock;
280 if constexpr(dim >= 4u)
282 numBlocks = threadSpec.getNumBlocks().product();
283 numThreadsPerBlock = threadSpec.getNumThreads().product();
287 numBlocks = threadSpec.getNumBlocks();
288 numThreadsPerBlock = threadSpec.getNumThreads();
291 using ThreadSpecType = std::conditional_t<
298 auto optimizedThreadSpec = ThreadSpecType(threadSpec.getNumBlocks(), threadSpec.getNumThreads());
300 auto kernelName = gpuKernel<
304 launchedWidthFrameSpec,
308 uint32_t blockDynSharedMemBytes = onHost::getDynSharedMemBytes(threadSpec, kernelBundle);
311 convertVecToUniformCudaHipDim(numBlocks),
312 convertVecToUniformCudaHipDim(numThreadsPerBlock),
313 static_cast<std::size_t
>(blockDynSharedMemBytes),
314 queue.getNativeHandle()>>>(kernelBundle, optimizedThreadSpec);
316 queue.conditionalWait();
322namespace alpaka::internal
324 template<
typename T_Device>
325 struct GetApi::Op<onHost::unifiedCudaHip::Queue<T_Device>>
327 inline constexpr auto operator()(
auto&& queue)
const
338 template<
typename T_Device,
typename T_Task>
339 struct Enqueue::HostTask<unifiedCudaHip::
Queue<T_Device>, T_Task>
349 unifiedCudaHip::Queue<T_Device>& q;
353 static void uniformCudaHipRtHostFunc(
void* arg)
355 auto data = std::unique_ptr<HostFuncData>(
reinterpret_cast<HostFuncData*
>(arg));
357 auto f =
queue.m_callBackThread.submit([d = std::move(
data)] { d->t(); });
361 void operator()(unifiedCudaHip::Queue<T_Device>& queue, T_Task
const& task)
const
364 using ApiInterface =
typename unifiedCudaHip::Queue<T_Device>::ApiInterface;
366 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
368 ApiInterface::launchHostFunc(
369 queue.getNativeHandle(),
370 uniformCudaHipRtHostFunc,
371 new HostFuncData{queue, task}));
373 queue.conditionalWait();
377 template<
typename T_Device,
typename T_Task>
378 struct Enqueue::HostTaskDeferred<unifiedCudaHip::
Queue<T_Device>, T_Task>
383 unifiedCudaHip::Queue<T_Device>& q;
387 static void uniformCudaHipRtHostFuncAsync(
void* arg)
389 auto data = std::unique_ptr<HostFuncData>(
reinterpret_cast<HostFuncData*
>(arg));
391 auto queueDependency =
queue.getSharedPtr();
392 queue.m_callBackThread.submit([d = std::move(
data), queueDependency] { d->t(); });
396 void operator()(unifiedCudaHip::Queue<T_Device>& queue, T_Task
const& task)
const
399 using ApiInterface =
typename unifiedCudaHip::Queue<T_Device>::ApiInterface;
401 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
403 ApiInterface::launchHostFunc(
404 queue.getNativeHandle(),
405 uniformCudaHipRtHostFuncAsync,
406 new HostFuncData{queue, task}));
408 queue.conditionalWait();
412 template<
typename T_Device,
typename T_Event>
413 struct internal::Enqueue::Event<unifiedCudaHip::
Queue<T_Device>, T_Event>
415 void operator()(unifiedCudaHip::Queue<T_Device>& queue, T_Event& event)
const
418 using ApiInterface =
typename unifiedCudaHip::Queue<T_Device>::ApiInterface;
419 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
421 ApiInterface::eventRecord(
event.getNativeHandle(),
queue.getNativeHandle()));
423 queue.conditionalWait();
429 alpaka::concepts::UnifiedCudaHipExecutor T_Executor,
430 alpaka::concepts::Vector T_NumBlocks,
431 alpaka::concepts::Vector T_NumThreads,
432 typename T_KernelBundle>
434 Kernel<unifiedCudaHip::Queue<T_Device>, ThreadSpec<T_NumBlocks, T_NumThreads, T_Executor>, T_KernelBundle>
437 unifiedCudaHip::Queue<T_Device>& queue,
439 T_KernelBundle
const& kernelBundle)
const
442 unifiedCudaHip::CallKernel{}.template operator()<
false>(
queue, threadSpec, kernelBundle);
448 alpaka::concepts::UnifiedCudaHipExecutor T_Executor,
449 typename T_NumFrames,
450 typename T_FrameExtents,
451 typename T_KernelBundle>
453 Kernel<unifiedCudaHip::Queue<T_Device>, FrameSpec<T_NumFrames, T_FrameExtents, T_Executor>, T_KernelBundle>
456 unifiedCudaHip::Queue<T_Device>& queue,
457 FrameSpec<T_NumFrames, T_FrameExtents, T_Executor>
const& frameSpec,
458 T_KernelBundle
const& kernelBundle)
const
462 "'exec::anyExecutor' can not be used to enqueue an kernel.");
464 auto threadBlocking = internal::adjustThreadSpec(*
queue.m_device.get(), frameSpec, kernelBundle);
465 unifiedCudaHip::CallKernel{}.template operator()<
true>(
queue, threadBlocking, kernelBundle);
469 template<
typename T_Device,
typename T_Dest,
typename T_Source,
typename T_Extents>
470 struct Memcpy::Op<unifiedCudaHip::
Queue<T_Device>, T_Dest, T_Source, T_Extents>
478 unifiedCudaHip::Queue<T_Device>& queue,
481 T_Extents
const& extents)
const requires std::same_as<
ALPAKA_TYPEOF(dest), T_Dest>
484 using ApiInterface =
typename unifiedCudaHip::Queue<T_Device>::ApiInterface;
489 if(extentMd.product() ==
size_t{0u})
492 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
501 auto copyKind = unifiedCudaHip::MemcpyKind<
507 if constexpr(dim == 1u)
510 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
512 ApiInterface::memcpyAsync(
517 internal::getNativeHandle(queue)));
519 else if constexpr(dim == 2u)
521 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
523 ApiInterface::memcpy2DAsync(
531 internal::getNativeHandle(queue)));
533 else if constexpr(dim == 3u)
537 memcopy3D<alpaka::trait::GetValueType_t<T_Dest>, ApiInterface>(
541 VecIdxType::fill(1u),
543 VecIdxType::fill(0u),
544 VecIdxType::fill(0u),
551 else if constexpr(dim >= 4u)
554 bool isContiguous =
true;
559 for(uint32_t d = dim - 3u; d >= 1u; --d)
561 isContiguous = isContiguous && (extentMd[d] * destPitch[d] == destPitch[d - 1u])
562 && (extentMd[d] * srcPitch[d] == srcPitch[d - 1u]);
571 alpaka::concepts::Vector<size_t, 3u>
auto mappedExtentMd = extentMd.template rshrink<3u>();
573 mappedExtentMd.z() = extentMd.template rshrink<dim - 2u>(dim - 3u).product();
576 memcopy3D<alpaka::trait::GetValueType_t<T_Dest>, ApiInterface>(
580 VecIdxType::fill(1u),
581 VecIdxType::fill(0u),
582 VecIdxType::fill(0u),
585 destPitch.template rshrink<3u>(),
587 srcPitch.template rshrink<3u>());
592 auto repetitions = extentMd.template rshrink<dim - 3u>(dim - 4u);
593 auto srcPitchJump = srcPitch.template rshrink<dim - 3u>(dim - 4u);
594 auto destPitchJump = destPitch.template rshrink<dim - 3u>(dim - 4u);
596 memcopy3D<alpaka::trait::GetValueType_t<T_Dest>, ApiInterface>(
610 queue.conditionalWait();
631 template<
typename T_ValueType,
typename T_ApiInterface>
635 alpaka::concepts::Vector<size_t>
auto const& repetitions,
636 alpaka::concepts::Vector<size_t>
auto const& destPitchJump,
637 alpaka::concepts::Vector<size_t>
auto const& srcPitchJump,
638 alpaka::concepts::Vector<size_t>
auto const& extentMd,
640 alpaka::concepts::Vector<size_t>
auto const& destPitchesOriginal,
642 alpaka::concepts::Vector<size_t>
auto const& srcPitchesOriginal)
const
656 typename T_ApiInterface::Memcpy3DParms_t memCpy3DParms{};
658 memCpy3DParms.srcPtr = T_ApiInterface::makePitchedPtr(
660 const_cast<uint8_t*
>(
661 reinterpret_cast<uint8_t const*
>(srcPtr) + (idx * srcPitchJump).sum()),
662 srcPitchesOriginal.y(),
665 srcPitchesOriginal.z() / srcPitchesOriginal.y());
666 memCpy3DParms.dstPtr = T_ApiInterface::makePitchedPtr(
667 reinterpret_cast<uint8_t*
>(destPtr) + (idx * destPitchJump).sum(),
668 destPitchesOriginal.y(),
671 destPitchesOriginal.z() / destPitchesOriginal.y());
672 memCpy3DParms.extent = T_ApiInterface::makeExtent(
673 extentMd.x() *
sizeof(T_ValueType),
676 memCpy3DParms.kind = copyKind;
678 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
680 T_ApiInterface::memcpy3DAsync(&memCpy3DParms, internal::getNativeHandle(queue)));
686 template<
typename T_Device,
typename T_Source,
typename T_Storage,
typename T>
687 struct internal::MemcpyDeviceGlobal::
688 Op<unifiedCudaHip::Queue<T_Device>, onAcc::internal::GlobalDeviceMemoryWrapper<T_Storage, T>, T_Source>
691 unifiedCudaHip::Queue<T_Device>& queue,
692 onAcc::internal::GlobalDeviceMemoryWrapper<T_Storage, T> dest,
697 using ApiInterface =
typename unifiedCudaHip::Queue<T_Device>::ApiInterface;
698 auto queueApi = alpaka::internal::getApi(queue);
699 auto copyKind = unifiedCudaHip::
702 void* destPtr{
nullptr};
703 void const* srcPtr{
nullptr};
709 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
711 ApiInterface::getSymbolAddress(
reinterpret_cast<void**
>(&destPtr), dest.getHandle(queueApi)));
713 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
715 ApiInterface::memcpyAsync(destPtr, srcPtr,
sizeof(T), copyKind, internal::getNativeHandle(queue)));
717 queue.conditionalWait();
722 template<
typename T_Device,
typename T_Dest,
typename T_Storage,
typename T>
723 struct internal::MemcpyDeviceGlobal::
724 Op<unifiedCudaHip::Queue<T_Device>, T_Dest, onAcc::internal::GlobalDeviceMemoryWrapper<T_Storage, T>>
727 unifiedCudaHip::Queue<T_Device>& queue,
729 onAcc::internal::GlobalDeviceMemoryWrapper<T_Storage, T> source)
const
733 using ApiInterface =
typename unifiedCudaHip::Queue<T_Device>::ApiInterface;
734 auto queueApi = alpaka::internal::getApi(queue);
735 auto copyKind = unifiedCudaHip::
738 void* destPtr{
nullptr};
744 void* srcPtr{
nullptr};
746 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
748 ApiInterface::getSymbolAddress(
reinterpret_cast<void**
>(&srcPtr), source.getHandle(queueApi)));
750 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
752 ApiInterface::memcpyAsync(destPtr, srcPtr,
sizeof(T), copyKind, internal::getNativeHandle(queue)));
754 queue.conditionalWait();
758 template<
typename T_Device,
typename T_Dest,
typename T_Extents>
759 struct Memset::Op<unifiedCudaHip::
Queue<T_Device>, T_Dest, T_Extents>
765 unifiedCudaHip::Queue<T_Device>& queue,
768 T_Extents
const& extents)
const requires(std::is_same_v<
ALPAKA_TYPEOF(dest), T_Dest>)
771 using ApiInterface =
typename unifiedCudaHip::Queue<T_Device>::ApiInterface;
775 if(extentMd.product() ==
size_t{0u})
778 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
786 if constexpr(dim == 1u)
788 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
790 ApiInterface::memsetAsync(
792 static_cast<int>(byteValue),
794 internal::getNativeHandle(queue)));
796 else if constexpr(dim == 2u)
798 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
800 ApiInterface::memset2DAsync(
803 static_cast<int>(byteValue),
806 internal::getNativeHandle(queue)));
808 else if constexpr(dim == 3u)
812 memset3D<alpaka::trait::GetValueType_t<T_Dest>, ApiInterface>(
816 VecIdxType::fill(1u),
817 VecIdxType::fill(0u),
822 else if constexpr(dim >= 4u)
825 bool isContiguous =
true;
830 for(uint32_t d = dim - 3u; d >= 1u; --d)
831 isContiguous = isContiguous && (extentMd[d] * destPitch[d] == destPitch[d - 1u]);
839 alpaka::concepts::Vector<size_t, 3u>
auto mappedExtentMd = extentMd.template rshrink<3u>();
841 mappedExtentMd.z() = extentMd.template rshrink<dim - 2u>(dim - 3u).product();
844 memset3D<alpaka::trait::GetValueType_t<T_Dest>, ApiInterface>(
848 VecIdxType::fill(1u),
849 VecIdxType::fill(0u),
852 destPitch.template rshrink<3u>());
856 auto repetitions = extentMd.template rshrink<dim - 3u>(dim - 4u);
857 auto destPitchJump = destPitch.template rshrink<dim - 3u>(dim - 4u);
859 memset3D<alpaka::trait::GetValueType_t<T_Dest>, ApiInterface>(
870 queue.conditionalWait();
886 template<
typename T_ValueType,
typename T_ApiInterface>
890 alpaka::concepts::Vector<size_t>
auto const& repetitions,
891 alpaka::concepts::Vector<size_t>
auto const& destPitchJump,
892 alpaka::concepts::Vector<size_t>
auto const& extentMd,
894 alpaka::concepts::Vector<size_t>
auto const& destPitchesOriginal)
const
903 auto const pitchedPtrVal = T_ApiInterface::makePitchedPtr(
904 reinterpret_cast<uint8_t*
>(destPtr) + (idx * destPitchJump).sum(),
905 destPitchesOriginal.y(),
907 destPitchesOriginal.z() / destPitchesOriginal.y());
909 auto const extentVal = T_ApiInterface::makeExtent(
910 extentMd.x() *
sizeof(T_ValueType),
914 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
916 T_ApiInterface::memset3DAsync(
918 static_cast<int>(byteValue),
920 internal::getNativeHandle(queue)));
925 template<
typename T_Device,
typename T_Dest,
typename T_Value,
typename T_Extents>
926 struct Fill::Op<unifiedCudaHip::
Queue<T_Device>, T_Dest, T_Value, T_Extents>
929 unifiedCudaHip::Queue<T_Device>& queue,
931 T_Value elementValue,
932 T_Extents
const& extents)
const
940 alpaka::internal::generic::fill(
943 dataView.getSubView(extents),
951 template<
typename T_Type,
typename T_Device, alpaka::concepts::Vector T_Extents>
952 struct AllocDeferred::Op<T_Type, unifiedCudaHip::
Queue<T_Device>, T_Extents>
954 auto operator()(unifiedCudaHip::Queue<T_Device>& queue, T_Extents
const& extents)
const
957 using ApiInterface =
typename T_Device::ApiInterface;
964 constexpr uint32_t alignment = 128u;
967 T_Type* ptr =
nullptr;
968 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(
970 ApiInterface::mallocAsync((
void**) &ptr, memSizeInByte,
queue.getNativeHandle()));
972 queue.conditionalWait();
976 auto queueDependency =
queue.getSharedPtr();
978 auto deleter = [ptr, queueDependency]()
980 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK_NOEXCEPT(
982 ApiInterface::freeAsync(
toVoidPtr(ptr), queueDependency->getNativeHandle()));
991 Alignment<alignment>{}};
#define ALPAKA_FN_HOST
All functions that can be used on an accelerator have to be attributed with ALPAKA_FN_ACC or ALPAKA_F...
#define ALPAKA_TYPEOF(...)
Get the type of instance.
#define ALPAKA_FORWARD(instance)
Perfectly forward an instance as argument.
#define ALPAKA_LOG_FUNCTION(logLvl)
Log the entry and exit of a scope.
auto emulatedAlignedMemDescription(uint32_t alignmentInByte, T_Extents extents)
provides a memory description to create multidimensional linewise aligned memory within a one dimensi...
constexpr bool operator!=(alpaka::concepts::Api auto lhs, alpaka::concepts::Api auto rhs)
constexpr bool operator==(alpaka::concepts::Api auto lhs, alpaka::concepts::Api auto rhs)
constexpr AnyExecutor anyExecutor
Automatic executor selection.
constexpr WarpSize warpSize
constexpr DeviceKind deviceKind
Functionality which is usable on the host CPU controller thread.
auto getNativeHandle(auto const &handle)
Get the native handle of an handle.
constexpr auto defaultExecutor(internal::concepts::DeviceHandle auto deviceHandle)
Select a default executor for the given device.
SharedBuffer(T_Any const &, T_Type *, T_UserExtents const &, T_UserPitches const &, std::invocable<> auto, T_MemAlignment const) -> SharedBuffer< ALPAKA_TYPEOF(getApi(std::declval< T_Any >())), T_Type, typename T_UserPitches::UniVec, T_MemAlignment >
decltype(auto) data(auto &&any)
pointer to data of an object
std::convertible_to< std::string > auto getName(auto &&any)
Runtime name for a given object.
ThreadSpec(T_NumBlocks const &, T_NumThreads const &) -> ThreadSpec< alpaka::trait::getVec_t< T_NumBlocks >, alpaka::trait::getVec_t< T_NumThreads > >
Device(Handle< T_Device > &&) -> Device< ALPAKA_TYPEOF(alpaka::internal::getApi(std::declval< T_Device >())), ALPAKA_TYPEOF(alpaka::internal::getDeviceKind(std::declval< T_Device >()))>
void wait(alpaka::concepts::HasGet auto &handle)
wait for all work to be finished
Queue(Handle< T_Queue > &&, T_QueueKind) -> Queue< Device< ALPAKA_TYPEOF(alpaka::internal::getApi(std::declval< T_Queue >())), ALPAKA_TYPEOF(alpaka::internal::getDeviceKind(std::declval< T_Queue >()))>, T_QueueKind >
decltype(auto) getPitches(auto &&any)
Object pitches.
typename GetValueType< T >::type GetValueType_t
constexpr uint32_t getDim_v
constexpr decltype(auto) getExecutor(auto &&any)
Get the executor associated with an object.
auto * toVoidPtr(T inPtr)
Cast a pointer that may or may not point to volatile memory to a (void*) or (void const*).
constexpr decltype(auto) getDeviceKind(auto &&any)
Get the device type of an object.
constexpr decltype(auto) getApi(auto &&any)
Get the API an object depends on.
constexpr auto makeView(auto &&anyWithApi, T_ValueType *pointer, concepts::Vector auto const &extents, T_MemAlignment const memAlignment=T_MemAlignment{})
ALPAKA_FN_HOST_ACC Dict(Tuple< DictEntry< T_Keys, T_Values >... > const &) -> Dict< DictEntry< T_Keys, T_Values >... >
constexpr decltype(auto) pCast(auto &&input)
Performs a static_cast on the storage type of combined data type.