alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
Api.hpp
Go to the documentation of this file.
1/* Copyright 2024 René Widera
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5
6#pragma once
7
9#include "alpaka/concepts.hpp"
12#include "alpaka/utility.hpp"
13
14#include <memory>
15#include <sstream>
16
17namespace alpaka
18{
19 namespace api
20 {
22 {
24
25 auto get() const
26 {
27 return this;
28 }
29
30 void _()
31 {
32 static_assert(concepts::Api<Cuda>);
33 }
34
35 static std::string getName()
36 {
37 return "Cuda";
38 }
39 };
40
41 constexpr auto cuda = Cuda{};
42
43 } // namespace api
44
45 namespace onHost::trait
46 {
47#if ALPAKA_LANG_CUDA
48 template<>
49 struct IsPlatformAvailable::Op<api::Cuda> : std::true_type
50 {
51 };
52
53 template<>
54 struct IsDeviceSupportedBy::Op<deviceKind::NvidiaGpu, api::Cuda> : std::true_type
55 {
56 };
57#endif
58
59 /** All modern NVIDIA GPUs support at least 1024 threads per block. */
60 template<>
62 {
63 consteval uint32_t operator()(api::Cuda const, deviceKind::NvidiaGpu const, exec::GpuCuda const) const
64 {
65 return 1024u;
66 }
67 };
68 } // namespace onHost::trait
69
71 {
72 template<>
73 struct IsUnifiedApi<api::Cuda> : std::true_type
74 {
75 };
76 } // namespace unifiedCudaHip::trait
77
78 namespace trait
79 {
80 template<typename T_Type>
82 {
83 constexpr uint32_t operator()(api::Cuda const, deviceKind::NvidiaGpu const) const
84 {
85 /** vector load and store width in bytes */
86 constexpr size_t simdWidthInByte = 16u;
87 return alpaka::divExZero(simdWidthInByte, sizeof(T_Type));
88 }
89 };
90
91 template<>
93 {
94 constexpr uint32_t operator()(api::Cuda const, deviceKind::NvidiaGpu const) const
95 {
96 /* NVIDIA GPUs have two scheduler what we interpreted as pipelines. */
97 constexpr uint32_t numPipes = 2u;
98 return numPipes;
99 }
100 };
101
102 template<>
104 {
105 constexpr uint32_t operator()(api::Cuda const, deviceKind::NvidiaGpu const) const
106 {
107 // loading 16 byte per thread will result in optimal memory bandwidth
108 return 16u;
109 }
110 };
111 } // namespace trait
112} // namespace alpaka
Concept to check for APIs.
Definition api.hpp:42
constexpr auto cuda
Definition Api.hpp:41
main alpaka namespace.
Definition alpaka.hpp:76
ALPAKA_FN_HOST_ACC constexpr auto divExZero(Integral a, Integral b) -> Integral
Returns the max(a / b, 1) as integer.
Definition utility.hpp:41
static std::string getName()
Definition Api.hpp:35
Cuda element_type
Definition Api.hpp:23
auto get() const
Definition Api.hpp:25
consteval uint32_t operator()(api::Cuda const, deviceKind::NvidiaGpu const, exec::GpuCuda const) const
Definition Api.hpp:63
constexpr uint32_t operator()(api::Cuda const, deviceKind::NvidiaGpu const) const
Definition Api.hpp:83
constexpr uint32_t operator()(api::Cuda const, deviceKind::NvidiaGpu const) const
Definition Api.hpp:105
constexpr uint32_t operator()(api::Cuda const, deviceKind::NvidiaGpu const) const
Definition Api.hpp:94