clang 24.0.0git
Cuda.cpp
Go to the documentation of this file.
1#include "clang/Basic/Cuda.h"
2
3#include "llvm/ADT/Twine.h"
4#include "llvm/Support/ErrorHandling.h"
5#include "llvm/Support/VersionTuple.h"
6#include "llvm/TargetParser/NVPTXTargetParser.h"
7#include <cassert>
8
9namespace clang {
10
12 const char *Name;
14 llvm::VersionTuple TVersion;
15};
16#define CUDA_ENTRY(major, minor) \
17 { \
18 #major "." #minor, CudaVersion::CUDA_##major##minor, \
19 llvm::VersionTuple(major, minor) \
20 }
21
23 CUDA_ENTRY(7, 0),
24 CUDA_ENTRY(7, 5),
25 CUDA_ENTRY(8, 0),
26 CUDA_ENTRY(9, 0),
27 CUDA_ENTRY(9, 1),
28 CUDA_ENTRY(9, 2),
29 CUDA_ENTRY(10, 0),
30 CUDA_ENTRY(10, 1),
31 CUDA_ENTRY(10, 2),
32 CUDA_ENTRY(11, 0),
33 CUDA_ENTRY(11, 1),
34 CUDA_ENTRY(11, 2),
35 CUDA_ENTRY(11, 3),
36 CUDA_ENTRY(11, 4),
37 CUDA_ENTRY(11, 5),
38 CUDA_ENTRY(11, 6),
39 CUDA_ENTRY(11, 7),
40 CUDA_ENTRY(11, 8),
41 CUDA_ENTRY(12, 0),
42 CUDA_ENTRY(12, 1),
43 CUDA_ENTRY(12, 2),
44 CUDA_ENTRY(12, 3),
45 CUDA_ENTRY(12, 4),
46 CUDA_ENTRY(12, 5),
47 CUDA_ENTRY(12, 6),
48 CUDA_ENTRY(12, 8),
49 CUDA_ENTRY(12, 9),
50 CUDA_ENTRY(13, 0),
51 CUDA_ENTRY(13, 1),
52 CUDA_ENTRY(13, 2),
53 {"", CudaVersion::NEW, llvm::VersionTuple(std::numeric_limits<int>::max())},
54 {"unknown", CudaVersion::UNKNOWN, {}} // End of list tombstone.
55};
56#undef CUDA_ENTRY
57
59 for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I)
60 if (I->Version == V)
61 return I->Name;
62
64}
65
66CudaVersion CudaStringToVersion(const llvm::Twine &S) {
67 std::string VS = S.str();
68 for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I)
69 if (I->Name == VS)
70 return I->Version;
72}
73
74CudaVersion ToCudaVersion(llvm::VersionTuple Version) {
75 for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I)
76 if (I->TVersion == Version)
77 return I->Version;
79}
80
82 if (A.isUnknown())
84
85 // AMD GPUs do not depend on CUDA versions.
86 if (IsAMDOffloadArch(A))
88
89 switch (A.nvptxKind()) {
90#define NVPTX_GPU(NAME, KIND, VIRTUAL, SM_ID, MIN_VER, MAX_VER, SUFFIX) \
91 case llvm::NVPTX::GK_##KIND: \
92 return CudaVersion::MIN_VER;
93#include "llvm/TargetParser/NVPTXTargetParser.def"
94 default:
95 llvm_unreachable("invalid enum");
96 }
97}
98
100 // AMD GPUs do not depend on CUDA versions.
101 if (IsAMDOffloadArch(A))
102 return CudaVersion::NEW;
103
104 if (!A.isNVPTX())
106
107 switch (A.nvptxKind()) {
108#define NVPTX_GPU(NAME, KIND, VIRTUAL, SM_ID, MIN_VER, MAX_VER, SUFFIX) \
109 case llvm::NVPTX::GK_##KIND: \
110 return CudaVersion::MAX_VER;
111#include "llvm/TargetParser/NVPTXTargetParser.def"
112 default:
113 return CudaVersion::NEW;
114 }
115}
116
117bool CudaFeatureEnabled(llvm::VersionTuple Version, CudaFeature Feature) {
118 return CudaFeatureEnabled(ToCudaVersion(Version), Feature);
119}
120
122 switch (Feature) {
124 return Version >= CudaVersion::CUDA_92;
126 return Version >= CudaVersion::CUDA_101;
127 }
128 llvm_unreachable("Unknown CUDA feature.");
129}
130
132 assert(Arch.isNVPTX() && "invalid NVIDIA GPU architecture");
133 return llvm::NVPTX::getSmVersion(Arch.nvptxKind());
134}
135
137 return Arch.isNVPTX() && llvm::NVPTX::isAcceleratedArch(Arch.nvptxKind());
138}
139
141 return Arch.isNVPTX() && llvm::NVPTX::isFamilySpecificArch(Arch.nvptxKind());
142}
143} // namespace clang
#define V(N, I)
#define CUDA_ENTRY(major, minor)
Definition Cuda.cpp:16
A processor an offloading action can target.
Definition OffloadArch.h:32
bool isNVPTX() const
Definition OffloadArch.h:81
bool isUnknown() const
Definition OffloadArch.h:89
llvm::NVPTX::GPUKind nvptxKind() const
Definition OffloadArch.h:92
The JSON file list parser is used to communicate input to InstallAPI.
CudaVersion MaxVersionForOffloadArch(OffloadArch A)
Get the latest CudaVersion that supports the given OffloadArch.
Definition Cuda.cpp:99
unsigned CudaArchToID(OffloadArch Arch)
Get the numeric ID (e.g. 700) of a CUDA architecture.
Definition Cuda.cpp:131
CudaVersion ToCudaVersion(llvm::VersionTuple)
Definition Cuda.cpp:74
CudaVersion CudaStringToVersion(const llvm::Twine &S)
Definition Cuda.cpp:66
bool CudaFeatureEnabled(llvm::VersionTuple, CudaFeature)
Definition Cuda.cpp:117
bool IsAMDOffloadArch(OffloadArch A)
const char * CudaVersionToString(CudaVersion V)
Definition Cuda.cpp:58
bool IsNVIDIAAcceleratedOffloadArch(OffloadArch Arch)
Check if the CUDA architecture is an accelerated variant (e.g. sm_90a).
Definition Cuda.cpp:136
static const CudaVersionMapEntry CudaNameVersionMap[]
Definition Cuda.cpp:22
CudaVersion
Definition Cuda.h:22
CudaFeature
Definition Cuda.h:78
@ CUDA_USES_NEW_LAUNCH
Definition Cuda.h:80
@ CUDA_USES_FATBIN_REGISTER_END
Definition Cuda.h:82
CudaVersion MinVersionForOffloadArch(OffloadArch A)
Get the earliest CudaVersion that supports the given OffloadArch.
Definition Cuda.cpp:81
bool IsNVIDIAFamilySpecificOffloadArch(OffloadArch Arch)
Check if the CUDA architecture is a family-specific variant (e.g. sm_100f).
Definition Cuda.cpp:140
llvm::VersionTuple TVersion
Definition Cuda.cpp:14