diff options
Diffstat (limited to 'clang/lib/Basic/Cuda.cpp')
| -rw-r--r-- | clang/lib/Basic/Cuda.cpp | 364 | 
1 files changed, 89 insertions, 275 deletions
| diff --git a/clang/lib/Basic/Cuda.cpp b/clang/lib/Basic/Cuda.cpp index f2b6c8cd3ee92..709185707bd9c 100644 --- a/clang/lib/Basic/Cuda.cpp +++ b/clang/lib/Basic/Cuda.cpp @@ -2,6 +2,7 @@  #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" @@ -27,12 +28,16 @@ const char *CudaVersionToString(CudaVersion V) {      return "10.0";    case CudaVersion::CUDA_101:      return "10.1"; +  case CudaVersion::CUDA_102: +    return "10.2"; +  case CudaVersion::CUDA_110: +    return "11.0";    }    llvm_unreachable("invalid enum");  } -CudaVersion CudaStringToVersion(llvm::StringRef S) { -  return llvm::StringSwitch<CudaVersion>(S) +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) @@ -40,253 +45,88 @@ CudaVersion CudaStringToVersion(llvm::StringRef S) {        .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.1", CudaVersion::CUDA_101) +      .Case("10.2", CudaVersion::CUDA_102) +      .Case("11.0", CudaVersion::CUDA_110) +      .Default(CudaVersion::UNKNOWN);  } -const char *CudaArchToString(CudaArch A) { -  switch (A) { -  case CudaArch::LAST: -    break; -  case CudaArch::UNKNOWN: -    return "unknown"; -  case CudaArch::SM_20: -    return "sm_20"; -  case CudaArch::SM_21: -    return "sm_21"; -  case CudaArch::SM_30: -    return "sm_30"; -  case CudaArch::SM_32: -    return "sm_32"; -  case CudaArch::SM_35: -    return "sm_35"; -  case CudaArch::SM_37: -    return "sm_37"; -  case CudaArch::SM_50: -    return "sm_50"; -  case CudaArch::SM_52: -    return "sm_52"; -  case CudaArch::SM_53: -    return "sm_53"; -  case CudaArch::SM_60: -    return "sm_60"; -  case CudaArch::SM_61: -    return "sm_61"; -  case CudaArch::SM_62: -    return "sm_62"; -  case CudaArch::SM_70: -    return "sm_70"; -  case CudaArch::SM_72: -    return "sm_72"; -  case CudaArch::SM_75: -    return "sm_75"; -  case CudaArch::GFX600: // tahiti -    return "gfx600"; -  case CudaArch::GFX601: // pitcairn, verde, oland,hainan -    return "gfx601"; -  case CudaArch::GFX700: // kaveri -    return "gfx700"; -  case CudaArch::GFX701: // hawaii -    return "gfx701"; -  case CudaArch::GFX702: // 290,290x,R390,R390x -    return "gfx702"; -  case CudaArch::GFX703: // kabini mullins -    return "gfx703"; -  case CudaArch::GFX704: // bonaire -    return "gfx704"; -  case CudaArch::GFX801: // carrizo -    return "gfx801"; -  case CudaArch::GFX802: // tonga,iceland -    return "gfx802"; -  case CudaArch::GFX803: // fiji,polaris10 -    return "gfx803"; -  case CudaArch::GFX810: // stoney -    return "gfx810"; -  case CudaArch::GFX900: // vega, instinct -    return "gfx900"; -  case CudaArch::GFX902: // TBA -    return "gfx902"; -  case CudaArch::GFX904: // TBA -    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"); -} +struct CudaArchToStringMap { +  CudaArch arch; +  const char *arch_name; +  const char *virtual_arch_name; +}; -CudaArch StringToCudaArch(llvm::StringRef S) { -  return llvm::StringSwitch<CudaArch>(S) -      .Case("sm_20", CudaArch::SM_20) -      .Case("sm_21", CudaArch::SM_21) -      .Case("sm_30", CudaArch::SM_30) -      .Case("sm_32", CudaArch::SM_32) -      .Case("sm_35", CudaArch::SM_35) -      .Case("sm_37", CudaArch::SM_37) -      .Case("sm_50", CudaArch::SM_50) -      .Case("sm_52", CudaArch::SM_52) -      .Case("sm_53", CudaArch::SM_53) -      .Case("sm_60", CudaArch::SM_60) -      .Case("sm_61", CudaArch::SM_61) -      .Case("sm_62", CudaArch::SM_62) -      .Case("sm_70", CudaArch::SM_70) -      .Case("sm_72", CudaArch::SM_72) -      .Case("sm_75", CudaArch::SM_75) -      .Case("gfx600", CudaArch::GFX600) -      .Case("gfx601", CudaArch::GFX601) -      .Case("gfx700", CudaArch::GFX700) -      .Case("gfx701", CudaArch::GFX701) -      .Case("gfx702", CudaArch::GFX702) -      .Case("gfx703", CudaArch::GFX703) -      .Case("gfx704", CudaArch::GFX704) -      .Case("gfx801", CudaArch::GFX801) -      .Case("gfx802", CudaArch::GFX802) -      .Case("gfx803", CudaArch::GFX803) -      .Case("gfx810", CudaArch::GFX810) -      .Case("gfx900", CudaArch::GFX900) -      .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); -} +#define SM2(sm, ca)                                                            \ +  { CudaArch::SM_##sm, "sm_" #sm, ca } +#define SM(sm) SM2(sm, "compute_" #sm) +#define GFX(gpu)                                                               \ +  { CudaArch::GFX##gpu, "gfx" #gpu, "compute_amdgcn" } +CudaArchToStringMap arch_names[] = { +    // clang-format off +    SM2(20, "compute_20"), SM2(21, "compute_20"), // Fermi +    SM(30), SM(32), SM(35), SM(37),  // Kepler +    SM(50), SM(52), SM(53),          // Maxwell +    SM(60), SM(61), SM(62),          // Pascal +    SM(70), SM(72),                  // Volta +    SM(75),                          // Turing +    SM(80),                          // Ampere +    GFX(600), // tahiti +    GFX(601), // pitcairn, verde, oland,hainan +    GFX(700), // kaveri +    GFX(701), // hawaii +    GFX(702), // 290,290x,R390,R390x +    GFX(703), // kabini mullins +    GFX(704), // bonaire +    GFX(801), // carrizo +    GFX(802), // tonga,iceland +    GFX(803), // fiji,polaris10 +    GFX(810), // stoney +    GFX(900), // vega, instinct +    GFX(902), GFX(904), GFX(906), GFX(908), GFX(909), +    GFX(1010), GFX(1011), GFX(1012), +    // clang-format on +}; +#undef SM +#undef SM2 +#undef GFX -const char *CudaVirtualArchToString(CudaVirtualArch A) { -  switch (A) { -  case CudaVirtualArch::UNKNOWN: +const char *CudaArchToString(CudaArch A) { +  auto result = std::find_if( +      std::begin(arch_names), std::end(arch_names), +      [A](const CudaArchToStringMap &map) { return A == map.arch; }); +  if (result == std::end(arch_names))      return "unknown"; -  case CudaVirtualArch::COMPUTE_20: -    return "compute_20"; -  case CudaVirtualArch::COMPUTE_30: -    return "compute_30"; -  case CudaVirtualArch::COMPUTE_32: -    return "compute_32"; -  case CudaVirtualArch::COMPUTE_35: -    return "compute_35"; -  case CudaVirtualArch::COMPUTE_37: -    return "compute_37"; -  case CudaVirtualArch::COMPUTE_50: -    return "compute_50"; -  case CudaVirtualArch::COMPUTE_52: -    return "compute_52"; -  case CudaVirtualArch::COMPUTE_53: -    return "compute_53"; -  case CudaVirtualArch::COMPUTE_60: -    return "compute_60"; -  case CudaVirtualArch::COMPUTE_61: -    return "compute_61"; -  case CudaVirtualArch::COMPUTE_62: -    return "compute_62"; -  case CudaVirtualArch::COMPUTE_70: -    return "compute_70"; -  case CudaVirtualArch::COMPUTE_72: -    return "compute_72"; -  case CudaVirtualArch::COMPUTE_75: -    return "compute_75"; -  case CudaVirtualArch::COMPUTE_AMDGCN: -    return "compute_amdgcn"; -  } -  llvm_unreachable("invalid enum"); +  return result->arch_name;  } -CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) { -  return llvm::StringSwitch<CudaVirtualArch>(S) -      .Case("compute_20", CudaVirtualArch::COMPUTE_20) -      .Case("compute_30", CudaVirtualArch::COMPUTE_30) -      .Case("compute_32", CudaVirtualArch::COMPUTE_32) -      .Case("compute_35", CudaVirtualArch::COMPUTE_35) -      .Case("compute_37", CudaVirtualArch::COMPUTE_37) -      .Case("compute_50", CudaVirtualArch::COMPUTE_50) -      .Case("compute_52", CudaVirtualArch::COMPUTE_52) -      .Case("compute_53", CudaVirtualArch::COMPUTE_53) -      .Case("compute_60", CudaVirtualArch::COMPUTE_60) -      .Case("compute_61", CudaVirtualArch::COMPUTE_61) -      .Case("compute_62", CudaVirtualArch::COMPUTE_62) -      .Case("compute_70", CudaVirtualArch::COMPUTE_70) -      .Case("compute_72", CudaVirtualArch::COMPUTE_72) -      .Case("compute_75", CudaVirtualArch::COMPUTE_75) -      .Case("compute_amdgcn", CudaVirtualArch::COMPUTE_AMDGCN) -      .Default(CudaVirtualArch::UNKNOWN); +const char *CudaArchToVirtualArchString(CudaArch A) { +  auto result = std::find_if( +      std::begin(arch_names), std::end(arch_names), +      [A](const CudaArchToStringMap &map) { return A == map.arch; }); +  if (result == std::end(arch_names)) +    return "unknown"; +  return result->virtual_arch_name;  } -CudaVirtualArch VirtualArchForCudaArch(CudaArch A) { -  switch (A) { -  case CudaArch::LAST: -    break; -  case CudaArch::UNKNOWN: -    return CudaVirtualArch::UNKNOWN; -  case CudaArch::SM_20: -  case CudaArch::SM_21: -    return CudaVirtualArch::COMPUTE_20; -  case CudaArch::SM_30: -    return CudaVirtualArch::COMPUTE_30; -  case CudaArch::SM_32: -    return CudaVirtualArch::COMPUTE_32; -  case CudaArch::SM_35: -    return CudaVirtualArch::COMPUTE_35; -  case CudaArch::SM_37: -    return CudaVirtualArch::COMPUTE_37; -  case CudaArch::SM_50: -    return CudaVirtualArch::COMPUTE_50; -  case CudaArch::SM_52: -    return CudaVirtualArch::COMPUTE_52; -  case CudaArch::SM_53: -    return CudaVirtualArch::COMPUTE_53; -  case CudaArch::SM_60: -    return CudaVirtualArch::COMPUTE_60; -  case CudaArch::SM_61: -    return CudaVirtualArch::COMPUTE_61; -  case CudaArch::SM_62: -    return CudaVirtualArch::COMPUTE_62; -  case CudaArch::SM_70: -    return CudaVirtualArch::COMPUTE_70; -  case CudaArch::SM_72: -    return CudaVirtualArch::COMPUTE_72; -  case CudaArch::SM_75: -    return CudaVirtualArch::COMPUTE_75; -  case CudaArch::GFX600: -  case CudaArch::GFX601: -  case CudaArch::GFX700: -  case CudaArch::GFX701: -  case CudaArch::GFX702: -  case CudaArch::GFX703: -  case CudaArch::GFX704: -  case CudaArch::GFX801: -  case CudaArch::GFX802: -  case CudaArch::GFX803: -  case CudaArch::GFX810: -  case CudaArch::GFX900: -  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"); +CudaArch StringToCudaArch(llvm::StringRef S) { +  auto result = std::find_if( +      std::begin(arch_names), std::end(arch_names), +      [S](const CudaArchToStringMap &map) { return S == map.arch_name; }); +  if (result == std::end(arch_names)) +    return CudaArch::UNKNOWN; +  return result->arch;  }  CudaVersion MinVersionForCudaArch(CudaArch A) { -  switch (A) { -  case CudaArch::LAST: -    break; -  case CudaArch::UNKNOWN: +  if (A == CudaArch::UNKNOWN)      return CudaVersion::UNKNOWN; + +  // AMD GPUs do not depend on CUDA versions. +  if (IsAMDGpuArch(A)) +    return CudaVersion::CUDA_70; + +  switch (A) {    case CudaArch::SM_20:    case CudaArch::SM_21:    case CudaArch::SM_30: @@ -307,60 +147,30 @@ CudaVersion MinVersionForCudaArch(CudaArch A) {      return CudaVersion::CUDA_91;    case CudaArch::SM_75:      return CudaVersion::CUDA_100; -  case CudaArch::GFX600: -  case CudaArch::GFX601: -  case CudaArch::GFX700: -  case CudaArch::GFX701: -  case CudaArch::GFX702: -  case CudaArch::GFX703: -  case CudaArch::GFX704: -  case CudaArch::GFX801: -  case CudaArch::GFX802: -  case CudaArch::GFX803: -  case CudaArch::GFX810: -  case CudaArch::GFX900: -  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; +  case CudaArch::SM_80: +    return CudaVersion::CUDA_110; +  default: +    llvm_unreachable("invalid enum");    } -  llvm_unreachable("invalid enum");  }  CudaVersion MaxVersionForCudaArch(CudaArch A) { +  // AMD GPUs do not depend on CUDA versions. +  if (IsAMDGpuArch(A)) +    return CudaVersion::LATEST; +    switch (A) {    case CudaArch::UNKNOWN:      return CudaVersion::UNKNOWN;    case CudaArch::SM_20:    case CudaArch::SM_21: -  case CudaArch::GFX600: -  case CudaArch::GFX601: -  case CudaArch::GFX700: -  case CudaArch::GFX701: -  case CudaArch::GFX702: -  case CudaArch::GFX703: -  case CudaArch::GFX704: -  case CudaArch::GFX801: -  case CudaArch::GFX802: -  case CudaArch::GFX803: -  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) { +CudaVersion ToCudaVersion(llvm::VersionTuple Version) {    int IVer =        Version.getMajor() * 10 + Version.getMinor().getValueOr(0);    switch(IVer) { @@ -380,6 +190,10 @@ static CudaVersion ToCudaVersion(llvm::VersionTuple Version) {      return CudaVersion::CUDA_100;    case 101:      return CudaVersion::CUDA_101; +  case 102: +    return CudaVersion::CUDA_102; +  case 110: +    return CudaVersion::CUDA_110;    default:      return CudaVersion::UNKNOWN;    } | 
