diff options
Diffstat (limited to 'lib/Basic/Cuda.cpp')
-rw-r--r-- | lib/Basic/Cuda.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/Basic/Cuda.cpp b/lib/Basic/Cuda.cpp index 6c34856dfdf7..f2b6c8cd3ee9 100644 --- a/lib/Basic/Cuda.cpp +++ b/lib/Basic/Cuda.cpp @@ -3,6 +3,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/VersionTuple.h" namespace clang { @@ -24,10 +25,24 @@ const char *CudaVersionToString(CudaVersion V) { return "9.2"; case CudaVersion::CUDA_100: return "10.0"; + case CudaVersion::CUDA_101: + return "10.1"; } llvm_unreachable("invalid enum"); } +CudaVersion CudaStringToVersion(llvm::StringRef S) { + return llvm::StringSwitch<CudaVersion>(S) + .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); +} + const char *CudaArchToString(CudaArch A) { switch (A) { case CudaArch::LAST: @@ -94,8 +109,16 @@ const char *CudaArchToString(CudaArch A) { return "gfx904"; case CudaArch::GFX906: // TBA return "gfx906"; + case CudaArch::GFX908: // TBA + return "gfx908"; case CudaArch::GFX909: // TBA return "gfx909"; + case CudaArch::GFX1010: // TBA + return "gfx1010"; + case CudaArch::GFX1011: // TBA + return "gfx1011"; + case CudaArch::GFX1012: // TBA + return "gfx1012"; } llvm_unreachable("invalid enum"); } @@ -132,7 +155,11 @@ CudaArch StringToCudaArch(llvm::StringRef S) { .Case("gfx902", CudaArch::GFX902) .Case("gfx904", CudaArch::GFX904) .Case("gfx906", CudaArch::GFX906) + .Case("gfx908", CudaArch::GFX908) .Case("gfx909", CudaArch::GFX909) + .Case("gfx1010", CudaArch::GFX1010) + .Case("gfx1011", CudaArch::GFX1011) + .Case("gfx1012", CudaArch::GFX1012) .Default(CudaArch::UNKNOWN); } @@ -244,7 +271,11 @@ CudaVirtualArch VirtualArchForCudaArch(CudaArch A) { case CudaArch::GFX902: case CudaArch::GFX904: case CudaArch::GFX906: + case CudaArch::GFX908: case CudaArch::GFX909: + case CudaArch::GFX1010: + case CudaArch::GFX1011: + case CudaArch::GFX1012: return CudaVirtualArch::COMPUTE_AMDGCN; } llvm_unreachable("invalid enum"); @@ -291,7 +322,11 @@ CudaVersion MinVersionForCudaArch(CudaArch A) { case CudaArch::GFX902: case CudaArch::GFX904: case CudaArch::GFX906: + case CudaArch::GFX908: case CudaArch::GFX909: + case CudaArch::GFX1010: + case CudaArch::GFX1011: + case CudaArch::GFX1012: return CudaVersion::CUDA_70; } llvm_unreachable("invalid enum"); @@ -316,10 +351,51 @@ CudaVersion MaxVersionForCudaArch(CudaArch A) { case CudaArch::GFX810: case CudaArch::GFX900: case CudaArch::GFX902: + case CudaArch::GFX1010: + case CudaArch::GFX1011: + case CudaArch::GFX1012: return CudaVersion::CUDA_80; default: return CudaVersion::LATEST; } } +static CudaVersion ToCudaVersion(llvm::VersionTuple Version) { + int IVer = + Version.getMajor() * 10 + Version.getMinor().getValueOr(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; + default: + return CudaVersion::UNKNOWN; + } +} + +bool CudaFeatureEnabled(llvm::VersionTuple Version, CudaFeature Feature) { + return CudaFeatureEnabled(ToCudaVersion(Version), Feature); +} + +bool CudaFeatureEnabled(CudaVersion Version, CudaFeature Feature) { + switch (Feature) { + case CudaFeature::CUDA_USES_NEW_LAUNCH: + return Version >= CudaVersion::CUDA_92; + case CudaFeature::CUDA_USES_FATBIN_REGISTER_END: + return Version >= CudaVersion::CUDA_101; + } + llvm_unreachable("Unknown CUDA feature."); +} } // namespace clang |