diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-02-11 12:38:04 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-02-11 12:38:11 +0000 |
commit | e3b557809604d036af6e00c60f012c2025b59a5e (patch) | |
tree | 8a11ba2269a3b669601e2fd41145b174008f4da8 /clang/lib/Basic/Cuda.cpp | |
parent | 08e8dd7b9db7bb4a9de26d44c1cbfd24e869c014 (diff) |
Diffstat (limited to 'clang/lib/Basic/Cuda.cpp')
-rw-r--r-- | clang/lib/Basic/Cuda.cpp | 153 |
1 files changed, 60 insertions, 93 deletions
diff --git a/clang/lib/Basic/Cuda.cpp b/clang/lib/Basic/Cuda.cpp index d75cc410f2d9..b4cf6cbe95f8 100644 --- a/clang/lib/Basic/Cuda.cpp +++ b/clang/lib/Basic/Cuda.cpp @@ -1,71 +1,68 @@ #include "clang/Basic/Cuda.h" #include "llvm/ADT/StringRef.h" -#include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/Twine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/VersionTuple.h" namespace clang { -const char *CudaVersionToString(CudaVersion V) { - switch (V) { - case CudaVersion::UNKNOWN: - return "unknown"; - case CudaVersion::CUDA_70: - return "7.0"; - case CudaVersion::CUDA_75: - return "7.5"; - case CudaVersion::CUDA_80: - return "8.0"; - case CudaVersion::CUDA_90: - return "9.0"; - case CudaVersion::CUDA_91: - return "9.1"; - case CudaVersion::CUDA_92: - return "9.2"; - case CudaVersion::CUDA_100: - return "10.0"; - case CudaVersion::CUDA_101: - return "10.1"; - case CudaVersion::CUDA_102: - return "10.2"; - case CudaVersion::CUDA_110: - return "11.0"; - case CudaVersion::CUDA_111: - return "11.1"; - case CudaVersion::CUDA_112: - return "11.2"; - case CudaVersion::CUDA_113: - return "11.3"; - case CudaVersion::CUDA_114: - return "11.4"; - case CudaVersion::CUDA_115: - return "11.5"; - case CudaVersion::NEW: - return ""; +struct CudaVersionMapEntry { + const char *Name; + CudaVersion Version; + llvm::VersionTuple TVersion; +}; +#define CUDA_ENTRY(major, minor) \ + { \ +#major "." #minor, CudaVersion::CUDA_##major##minor, \ + llvm::VersionTuple(major, minor) \ } - llvm_unreachable("invalid enum"); + +static const CudaVersionMapEntry CudaNameVersionMap[] = { + CUDA_ENTRY(7, 0), + CUDA_ENTRY(7, 5), + CUDA_ENTRY(8, 0), + CUDA_ENTRY(9, 0), + CUDA_ENTRY(9, 1), + CUDA_ENTRY(9, 2), + CUDA_ENTRY(10, 0), + CUDA_ENTRY(10, 1), + CUDA_ENTRY(10, 2), + CUDA_ENTRY(11, 0), + CUDA_ENTRY(11, 1), + CUDA_ENTRY(11, 2), + CUDA_ENTRY(11, 3), + CUDA_ENTRY(11, 4), + CUDA_ENTRY(11, 5), + CUDA_ENTRY(11, 6), + CUDA_ENTRY(11, 7), + CUDA_ENTRY(11, 8), + {"", CudaVersion::NEW, llvm::VersionTuple(std::numeric_limits<int>::max())}, + {"unknown", CudaVersion::UNKNOWN, {}} // End of list tombstone. +}; +#undef CUDA_ENTRY + +const char *CudaVersionToString(CudaVersion V) { + for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I) + if (I->Version == V) + return I->Name; + + return CudaVersionToString(CudaVersion::UNKNOWN); } CudaVersion CudaStringToVersion(const llvm::Twine &S) { - return llvm::StringSwitch<CudaVersion>(S.str()) - .Case("7.0", CudaVersion::CUDA_70) - .Case("7.5", CudaVersion::CUDA_75) - .Case("8.0", CudaVersion::CUDA_80) - .Case("9.0", CudaVersion::CUDA_90) - .Case("9.1", CudaVersion::CUDA_91) - .Case("9.2", CudaVersion::CUDA_92) - .Case("10.0", CudaVersion::CUDA_100) - .Case("10.1", CudaVersion::CUDA_101) - .Case("10.2", CudaVersion::CUDA_102) - .Case("11.0", CudaVersion::CUDA_110) - .Case("11.1", CudaVersion::CUDA_111) - .Case("11.2", CudaVersion::CUDA_112) - .Case("11.3", CudaVersion::CUDA_113) - .Case("11.4", CudaVersion::CUDA_114) - .Case("11.5", CudaVersion::CUDA_115) - .Default(CudaVersion::UNKNOWN); + std::string VS = S.str(); + for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I) + if (I->Name == VS) + return I->Version; + return CudaVersion::UNKNOWN; +} + +CudaVersion ToCudaVersion(llvm::VersionTuple Version) { + for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I) + if (I->TVersion == Version) + return I->Version; + return CudaVersion::UNKNOWN; } namespace { @@ -91,6 +88,9 @@ static const CudaArchToStringMap arch_names[] = { SM(70), SM(72), // Volta SM(75), // Turing SM(80), SM(86), // Ampere + SM(87), // Jetson/Drive AGX Orin + SM(89), // Ada Lovelace + SM(90), // Hopper GFX(600), // gfx600 GFX(601), // gfx601 GFX(602), // gfx602 @@ -196,6 +196,11 @@ CudaVersion MinVersionForCudaArch(CudaArch A) { return CudaVersion::CUDA_110; case CudaArch::SM_86: return CudaVersion::CUDA_111; + case CudaArch::SM_87: + return CudaVersion::CUDA_114; + case CudaArch::SM_89: + case CudaArch::SM_90: + return CudaVersion::CUDA_118; default: llvm_unreachable("invalid enum"); } @@ -219,44 +224,6 @@ CudaVersion MaxVersionForCudaArch(CudaArch A) { } } -CudaVersion ToCudaVersion(llvm::VersionTuple Version) { - int IVer = Version.getMajor() * 10 + Version.getMinor().value_or(0); - switch(IVer) { - case 70: - return CudaVersion::CUDA_70; - case 75: - return CudaVersion::CUDA_75; - case 80: - return CudaVersion::CUDA_80; - case 90: - return CudaVersion::CUDA_90; - case 91: - return CudaVersion::CUDA_91; - case 92: - return CudaVersion::CUDA_92; - case 100: - return CudaVersion::CUDA_100; - case 101: - return CudaVersion::CUDA_101; - case 102: - return CudaVersion::CUDA_102; - case 110: - return CudaVersion::CUDA_110; - case 111: - return CudaVersion::CUDA_111; - case 112: - return CudaVersion::CUDA_112; - case 113: - return CudaVersion::CUDA_113; - case 114: - return CudaVersion::CUDA_114; - case 115: - return CudaVersion::CUDA_115; - default: - return CudaVersion::UNKNOWN; - } -} - bool CudaFeatureEnabled(llvm::VersionTuple Version, CudaFeature Feature) { return CudaFeatureEnabled(ToCudaVersion(Version), Feature); } |