brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · dc81b71 Raw
169 lines · cpp
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 7namespace clang {8 9struct CudaVersionMapEntry {10  const char *Name;11  CudaVersion Version;12  llvm::VersionTuple TVersion;13};14#define CUDA_ENTRY(major, minor)                                               \15  {                                                                            \16    #major "." #minor, CudaVersion::CUDA_##major##minor,                       \17        llvm::VersionTuple(major, minor)                                       \18  }19 20static const CudaVersionMapEntry CudaNameVersionMap[] = {21    CUDA_ENTRY(7, 0),22    CUDA_ENTRY(7, 5),23    CUDA_ENTRY(8, 0),24    CUDA_ENTRY(9, 0),25    CUDA_ENTRY(9, 1),26    CUDA_ENTRY(9, 2),27    CUDA_ENTRY(10, 0),28    CUDA_ENTRY(10, 1),29    CUDA_ENTRY(10, 2),30    CUDA_ENTRY(11, 0),31    CUDA_ENTRY(11, 1),32    CUDA_ENTRY(11, 2),33    CUDA_ENTRY(11, 3),34    CUDA_ENTRY(11, 4),35    CUDA_ENTRY(11, 5),36    CUDA_ENTRY(11, 6),37    CUDA_ENTRY(11, 7),38    CUDA_ENTRY(11, 8),39    CUDA_ENTRY(12, 0),40    CUDA_ENTRY(12, 1),41    CUDA_ENTRY(12, 2),42    CUDA_ENTRY(12, 3),43    CUDA_ENTRY(12, 4),44    CUDA_ENTRY(12, 5),45    CUDA_ENTRY(12, 6),46    CUDA_ENTRY(12, 8),47    CUDA_ENTRY(12, 9),48    {"", CudaVersion::NEW, llvm::VersionTuple(std::numeric_limits<int>::max())},49    {"unknown", CudaVersion::UNKNOWN, {}} // End of list tombstone.50};51#undef CUDA_ENTRY52 53const char *CudaVersionToString(CudaVersion V) {54  for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I)55    if (I->Version == V)56      return I->Name;57 58  return CudaVersionToString(CudaVersion::UNKNOWN);59}60 61CudaVersion CudaStringToVersion(const llvm::Twine &S) {62  std::string VS = S.str();63  for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I)64    if (I->Name == VS)65      return I->Version;66  return CudaVersion::UNKNOWN;67}68 69CudaVersion ToCudaVersion(llvm::VersionTuple Version) {70  for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I)71    if (I->TVersion == Version)72      return I->Version;73  return CudaVersion::UNKNOWN;74}75 76CudaVersion MinVersionForOffloadArch(OffloadArch A) {77  if (A == OffloadArch::UNKNOWN)78    return CudaVersion::UNKNOWN;79 80  // AMD GPUs do not depend on CUDA versions.81  if (IsAMDOffloadArch(A))82    return CudaVersion::CUDA_70;83 84  switch (A) {85  case OffloadArch::SM_20:86  case OffloadArch::SM_21:87  case OffloadArch::SM_30:88  case OffloadArch::SM_32_:89  case OffloadArch::SM_35:90  case OffloadArch::SM_37:91  case OffloadArch::SM_50:92  case OffloadArch::SM_52:93  case OffloadArch::SM_53:94    return CudaVersion::CUDA_70;95  case OffloadArch::SM_60:96  case OffloadArch::SM_61:97  case OffloadArch::SM_62:98    return CudaVersion::CUDA_80;99  case OffloadArch::SM_70:100    return CudaVersion::CUDA_90;101  case OffloadArch::SM_72:102    return CudaVersion::CUDA_91;103  case OffloadArch::SM_75:104    return CudaVersion::CUDA_100;105  case OffloadArch::SM_80:106    return CudaVersion::CUDA_110;107  case OffloadArch::SM_86:108    return CudaVersion::CUDA_111;109  case OffloadArch::SM_87:110    return CudaVersion::CUDA_114;111  case OffloadArch::SM_89:112  case OffloadArch::SM_90:113    return CudaVersion::CUDA_118;114  case OffloadArch::SM_90a:115    return CudaVersion::CUDA_120;116  case OffloadArch::SM_100:117  case OffloadArch::SM_100a:118  case OffloadArch::SM_101:119  case OffloadArch::SM_101a:120  case OffloadArch::SM_120:121  case OffloadArch::SM_120a:122    return CudaVersion::CUDA_128;123  case OffloadArch::SM_103:124  case OffloadArch::SM_103a:125  case OffloadArch::SM_121:126  case OffloadArch::SM_121a:127    return CudaVersion::CUDA_129;128  default:129    llvm_unreachable("invalid enum");130  }131}132 133CudaVersion MaxVersionForOffloadArch(OffloadArch A) {134  // AMD GPUs do not depend on CUDA versions.135  if (IsAMDOffloadArch(A))136    return CudaVersion::NEW;137 138  switch (A) {139  case OffloadArch::UNKNOWN:140    return CudaVersion::UNKNOWN;141  case OffloadArch::SM_20:142  case OffloadArch::SM_21:143    return CudaVersion::CUDA_80;144  case OffloadArch::SM_30:145  case OffloadArch::SM_32_:146    return CudaVersion::CUDA_102;147  case OffloadArch::SM_35:148  case OffloadArch::SM_37:149    return CudaVersion::CUDA_118;150  default:151    return CudaVersion::NEW;152  }153}154 155bool CudaFeatureEnabled(llvm::VersionTuple Version, CudaFeature Feature) {156  return CudaFeatureEnabled(ToCudaVersion(Version), Feature);157}158 159bool CudaFeatureEnabled(CudaVersion Version, CudaFeature Feature) {160  switch (Feature) {161  case CudaFeature::CUDA_USES_NEW_LAUNCH:162    return Version >= CudaVersion::CUDA_92;163  case CudaFeature::CUDA_USES_FATBIN_REGISTER_END:164    return Version >= CudaVersion::CUDA_101;165  }166  llvm_unreachable("Unknown CUDA feature.");167}168} // namespace clang169