alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
AccGpuUniformCudaHipRt.hpp
Go to the documentation of this file.
1/* Copyright 2026 Benjamin Worpitz, René Widera, Jan Stephan, Andrea Bocci, Bernhard Manfred Gruber, Antonio Di Pilato
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5#pragma once
6
7// Base classes.
24
25// Specialized traits.
26#include "alpaka/acc/Traits.hpp"
27#include "alpaka/dev/Traits.hpp"
28#include "alpaka/idx/Traits.hpp"
31
32// Implementation details.
34#include "alpaka/core/Cuda.hpp"
37
38#ifdef __cpp_lib_format
39# include <format>
40#endif
41#include <string>
42
43#if defined(ALPAKA_ACC_GPU_CUDA_ENABLED) || defined(ALPAKA_ACC_GPU_HIP_ENABLED)
44
45namespace alpaka
46{
47 template<
48 typename TApi,
49 typename TAcc,
50 typename TDim,
51 typename TIdx,
52 typename TKernelFnObj,
53 bool TCooperative,
54 typename... TArgs>
55 class TaskKernelGpuUniformCudaHipRt;
56
57 //! The GPU CUDA accelerator.
58 //!
59 //! This accelerator allows parallel kernel execution on devices supporting CUDA.
60 template<typename TApi, typename TDim, typename TIdx>
62 : public WorkDivUniformCudaHipBuiltIn<TDim, TIdx>
63 , public gb::IdxGbUniformCudaHipBuiltIn<TDim, TIdx>
64 , public bt::IdxBtUniformCudaHipBuiltIn<TDim, TIdx>
65 , public AtomicHierarchy<
66 AtomicUniformCudaHipBuiltIn, // grid atomics
67 AtomicUniformCudaHipBuiltIn, // block atomics
68 AtomicUniformCudaHipBuiltIn> // thread atomics
76# ifdef ALPAKA_DISABLE_VENDOR_RNG
77 , public rand::RandDefault
78# else
79 , public rand::RandUniformCudaHipRand<TApi>
80# endif
82 , public interface::Implements<InterfaceAcc, AccGpuUniformCudaHipRt<TApi, TDim, TIdx>>
83 {
84 static_assert(
85 sizeof(TIdx) >= sizeof(int),
86 "Index type is not supported, consider using int or a larger type.");
87
88 public:
93
95 : WorkDivUniformCudaHipBuiltIn<TDim, TIdx>(threadElemExtent)
96 {
97 }
98 };
99
100 namespace trait
101 {
102 //! The GPU CUDA accelerator accelerator type trait specialization.
103 template<typename TApi, typename TDim, typename TIdx>
108
109 //! The GPU CUDA single thread accelerator type trait specialization.
110 template<typename TApi, typename TDim, typename TIdx>
111 struct IsSingleThreadAcc<AccGpuUniformCudaHipRt<TApi, TDim, TIdx>> : std::false_type
112 {
113 };
114
115 //! The GPU CUDA multi thread accelerator type trait specialization.
116 template<typename TApi, typename TDim, typename TIdx>
117 struct IsMultiThreadAcc<AccGpuUniformCudaHipRt<TApi, TDim, TIdx>> : std::true_type
118 {
119 };
120
121 //! The GPU CUDA accelerator device properties get trait specialization.
122 template<typename TApi, typename TDim, typename TIdx>
123 struct GetAccDevProps<AccGpuUniformCudaHipRt<TApi, TDim, TIdx>>
124 {
126 {
127# ifdef ALPAKA_ACC_GPU_CUDA_ENABLED
128 // Reading only the necessary attributes with cudaDeviceGetAttribute is faster than reading all with
129 // cuda https://devblogs.nvidia.com/cuda-pro-tip-the-fast-way-to-query-device-properties/
130 int multiProcessorCount = {};
131 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::deviceGetAttribute(
132 &multiProcessorCount,
133 TApi::deviceAttributeMultiprocessorCount,
134 dev.getNativeHandle()));
135
136 int maxGridSize[3] = {};
137 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::deviceGetAttribute(
138 &maxGridSize[0],
139 TApi::deviceAttributeMaxGridDimX,
140 dev.getNativeHandle()));
141 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::deviceGetAttribute(
142 &maxGridSize[1],
143 TApi::deviceAttributeMaxGridDimY,
144 dev.getNativeHandle()));
145 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::deviceGetAttribute(
146 &maxGridSize[2],
147 TApi::deviceAttributeMaxGridDimZ,
148 dev.getNativeHandle()));
149
150 int maxBlockDim[3] = {};
151 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::deviceGetAttribute(
152 &maxBlockDim[0],
153 TApi::deviceAttributeMaxBlockDimX,
154 dev.getNativeHandle()));
155 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::deviceGetAttribute(
156 &maxBlockDim[1],
157 TApi::deviceAttributeMaxBlockDimY,
158 dev.getNativeHandle()));
159 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::deviceGetAttribute(
160 &maxBlockDim[2],
161 TApi::deviceAttributeMaxBlockDimZ,
162 dev.getNativeHandle()));
163
164 int maxThreadsPerBlock = {};
165 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::deviceGetAttribute(
166 &maxThreadsPerBlock,
167 TApi::deviceAttributeMaxThreadsPerBlock,
168 dev.getNativeHandle()));
169
170 int sharedMemSizeBytes = {};
171 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::deviceGetAttribute(
172 &sharedMemSizeBytes,
173 TApi::deviceAttributeMaxSharedMemoryPerBlock,
174 dev.getNativeHandle()));
175
176 int cooperativeLaunch = {};
177 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::deviceGetAttribute(
178 &cooperativeLaunch,
179 TApi::deviceAttributeCooperativeLaunch,
180 dev.getNativeHandle()));
181
182 return {// m_multiProcessorCount
183 alpaka::core::clipCast<TIdx>(multiProcessorCount),
184 // m_gridBlockExtentMax
186 alpaka::core::clipCast<TIdx>(maxGridSize[2u]),
187 alpaka::core::clipCast<TIdx>(maxGridSize[1u]),
188 alpaka::core::clipCast<TIdx>(maxGridSize[0u]))),
189 // m_gridBlockCountMax
190 std::numeric_limits<TIdx>::max(),
191 // m_blockThreadExtentMax
193 alpaka::core::clipCast<TIdx>(maxBlockDim[2u]),
194 alpaka::core::clipCast<TIdx>(maxBlockDim[1u]),
195 alpaka::core::clipCast<TIdx>(maxBlockDim[0u]))),
196 // m_blockThreadCountMax
197 alpaka::core::clipCast<TIdx>(maxThreadsPerBlock),
198 // m_threadElemExtentMax
199 Vec<TDim, TIdx>::all(std::numeric_limits<TIdx>::max()),
200 // m_threadElemCountMax
201 std::numeric_limits<TIdx>::max(),
202 // m_sharedMemSizeBytes
203 static_cast<size_t>(sharedMemSizeBytes),
204 // m_globalMemSizeBytes
205 getMemBytes(dev),
206 // m_cooperativeLaunch
207 static_cast<bool>(cooperativeLaunch)};
208
209# else
210 typename TApi::DeviceProp_t properties;
211 ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(TApi::getDeviceProperties(&properties, dev.getNativeHandle()));
212
213 return {// m_multiProcessorCount
214 alpaka::core::clipCast<TIdx>(properties.multiProcessorCount),
215 // m_gridBlockExtentMax
217 alpaka::core::clipCast<TIdx>(properties.maxGridSize[2u]),
218 alpaka::core::clipCast<TIdx>(properties.maxGridSize[1u]),
219 alpaka::core::clipCast<TIdx>(properties.maxGridSize[0u]))),
220 // m_gridBlockCountMax
221 std::numeric_limits<TIdx>::max(),
222 // m_blockThreadExtentMax
224 alpaka::core::clipCast<TIdx>(properties.maxThreadsDim[2u]),
225 alpaka::core::clipCast<TIdx>(properties.maxThreadsDim[1u]),
226 alpaka::core::clipCast<TIdx>(properties.maxThreadsDim[0u]))),
227 // m_blockThreadCountMax
228 alpaka::core::clipCast<TIdx>(properties.maxThreadsPerBlock),
229 // m_threadElemExtentMax
230 Vec<TDim, TIdx>::all(std::numeric_limits<TIdx>::max()),
231 // m_threadElemCountMax
232 std::numeric_limits<TIdx>::max(),
233 // m_sharedMemSizeBytes
234 static_cast<size_t>(properties.sharedMemPerBlock),
235 // m_globalMemSizeBytes
236 getMemBytes(dev),
237 // m_cooperativeLaunch
238 static_cast<bool>(properties.cooperativeLaunch)};
239# endif
240 }
241 };
242
243 //! The GPU CUDA accelerator name trait specialization.
244 template<typename TApi, typename TDim, typename TIdx>
245 struct GetAccName<AccGpuUniformCudaHipRt<TApi, TDim, TIdx>>
246 {
247 ALPAKA_FN_HOST static auto getAccName() -> std::string
248 {
249# if ALPAKA_COMP_CLANG
250# pragma clang diagnostic push
251# pragma clang diagnostic ignored "-Wexit-time-destructors"
252# endif
253 using namespace std::literals;
254 static std::string const accName =
255# ifdef __cpp_lib_format
256 std::format("AccGpu{}Rt<{},{}>", TApi::name, TDim::value, core::demangled<TIdx>);
257# else
258 "AccGpu"s + TApi::name + "Rt<"s + std::to_string(TDim::value) + ","s
259 + std::string(core::demangled<TIdx>) + ">"s;
260# endif
261 return accName;
262# if ALPAKA_COMP_CLANG
263# pragma clang diagnostic pop
264# endif
265 }
266 };
267
268 //! The GPU CUDA accelerator device type trait specialization.
269 template<typename TApi, typename TDim, typename TIdx>
270 struct DevType<AccGpuUniformCudaHipRt<TApi, TDim, TIdx>>
271 {
273 };
274
275 //! The GPU CUDA accelerator dimension getter trait specialization.
276 template<typename TApi, typename TDim, typename TIdx>
277 struct DimType<AccGpuUniformCudaHipRt<TApi, TDim, TIdx>>
278 {
279 using type = TDim;
280 };
281 } // namespace trait
282
283 namespace trait
284 {
285 //! The GPU CUDA accelerator execution task type trait specialization.
286 template<
287 typename TApi,
288 typename TDim,
289 typename TIdx,
290 typename TWorkDiv,
291 typename TKernelFnObj,
292 typename... TArgs>
293 struct CreateTaskKernel<AccGpuUniformCudaHipRt<TApi, TDim, TIdx>, TWorkDiv, TKernelFnObj, TArgs...>
294 {
296 TWorkDiv const& workDiv,
297 TKernelFnObj const& kernelFnObj,
298 TArgs&&... args)
299 {
301 TApi,
303 TDim,
304 TIdx,
305 TKernelFnObj,
306 false,
307 TArgs...>(workDiv, kernelFnObj, std::forward<TArgs>(args)...);
308 }
309 };
310
311 //! The GPU CUDA accelerator execution cooperative task type trait specialization.
312 template<
313 typename TApi,
314 typename TDim,
315 typename TIdx,
316 typename TWorkDiv,
317 typename TKernelFnObj,
318 typename... TArgs>
319 struct CreateTaskCooperativeKernel<AccGpuUniformCudaHipRt<TApi, TDim, TIdx>, TWorkDiv, TKernelFnObj, TArgs...>
320 {
322 TWorkDiv const& workDiv,
323 TKernelFnObj const& kernelFnObj,
324 TArgs&&... args)
325 {
327 TApi,
329 TDim,
330 TIdx,
331 TKernelFnObj,
332 true,
333 TArgs...>(workDiv, kernelFnObj, std::forward<TArgs>(args)...);
334 }
335 };
336
337 //! The CPU CUDA execution task platform type trait specialization.
338 template<typename TApi, typename TDim, typename TIdx>
339 struct PlatformType<AccGpuUniformCudaHipRt<TApi, TDim, TIdx>>
340 {
342 };
343
344 //! The GPU CUDA accelerator idx type trait specialization.
345 template<typename TApi, typename TDim, typename TIdx>
346 struct IdxType<AccGpuUniformCudaHipRt<TApi, TDim, TIdx>>
347 {
348 using type = TIdx;
349 };
350 } // namespace trait
351} // namespace alpaka
352
353#endif
#define ALPAKA_UNIFORM_CUDA_HIP_RT_CHECK(cmd)
CUDA/HIP runtime error checking with log and exception.
ALPAKA_FN_HOST_ACC AccGpuUniformCudaHipRt(Vec< TDim, TIdx > const &threadElemExtent)
auto operator=(AccGpuUniformCudaHipRt &&) -> AccGpuUniformCudaHipRt &=delete
AccGpuUniformCudaHipRt(AccGpuUniformCudaHipRt const &)=delete
AccGpuUniformCudaHipRt(AccGpuUniformCudaHipRt &&)=delete
auto operator=(AccGpuUniformCudaHipRt const &) -> AccGpuUniformCudaHipRt &=delete
The GPU CUDA/HIP block synchronization.
The CUDA/HIP RT device handle.
The GPU CUDA/HIP grid synchronization.
The GPU CUDA/HIP accelerator execution task.
A n-dimensional vector.
Definition Vec.hpp:38
ALPAKA_NO_HOST_ACC_WARNING static ALPAKA_FN_HOST_ACC constexpr auto all(TVal const &val) -> Vec< TDim, TVal >
Single value constructor.
Definition Vec.hpp:89
The GPU CUDA/HIP accelerator work division.
The CUDA/HIP accelerator ND index provider.
The CUDA/HIP accelerator ND index provider.
The standard library math trait specializations.
The CUDA/HIP rand implementation.
#define ALPAKA_FN_HOST
Definition Common.hpp:43
#define ALPAKA_FN_HOST_ACC
Definition Common.hpp:42
constexpr std::string_view demangled
auto clipCast(V const &val) -> T
Definition ClipCast.hpp:16
The alpaka accelerator library.
ALPAKA_FN_HOST auto getMemBytes(TDev const &dev) -> std::size_t
Definition Traits.hpp:102
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC constexpr auto getExtentVecEnd(T const &object={}) -> Vec< TDim, Idx< T > >
Definition Traits.hpp:78
std::integral_constant< std::size_t, N > DimInt
The acceleration properties on a device.
Tag used in class inheritance hierarchies that describes that a specific interface (TInterface) is im...
Definition Interface.hpp:15
The accelerator type trait.
Definition Traits.hpp:42
static ALPAKA_FN_HOST auto createTaskCooperativeKernel(TWorkDiv const &workDiv, TKernelFnObj const &kernelFnObj, TArgs &&... args)
The cooperative kernel execution task creation trait.
Definition Traits.hpp:46
static ALPAKA_FN_HOST auto createTaskKernel(TWorkDiv const &workDiv, TKernelFnObj const &kernelFnObj, TArgs &&... args)
The kernel execution task creation trait.
Definition Traits.hpp:37
The device type trait.
Definition Traits.hpp:23
The dimension getter type trait.
Definition Traits.hpp:14
static ALPAKA_FN_HOST auto getAccDevProps(DevUniformCudaHipRt< TApi > const &dev) -> AccDevProps< TDim, TIdx >
The device properties get trait.
Definition Traits.hpp:66
The accelerator name trait.
Definition Traits.hpp:73
The idx type trait.
Definition Traits.hpp:25
The multi thread accelerator trait.
Definition Traits.hpp:61
The single thread accelerator trait.
Definition Traits.hpp:51
The platform type trait.
Definition Traits.hpp:38