1 #include "clang/Basic/Cuda.h" 2 3 #include "llvm/ADT/StringRef.h" 4 #include "llvm/ADT/StringSwitch.h" 5 #include "llvm/Support/ErrorHandling.h" 6 7 namespace clang { 8 9 const char *CudaVersionToString(CudaVersion V) { 10 switch (V) { 11 case CudaVersion::UNKNOWN: 12 return "unknown"; 13 case CudaVersion::CUDA_70: 14 return "7.0"; 15 case CudaVersion::CUDA_75: 16 return "7.5"; 17 case CudaVersion::CUDA_80: 18 return "8.0"; 19 case CudaVersion::CUDA_90: 20 return "9.0"; 21 } 22 llvm_unreachable("invalid enum"); 23 } 24 25 const char *CudaArchToString(CudaArch A) { 26 switch (A) { 27 case CudaArch::UNKNOWN: 28 return "unknown"; 29 case CudaArch::SM_20: 30 return "sm_20"; 31 case CudaArch::SM_21: 32 return "sm_21"; 33 case CudaArch::SM_30: 34 return "sm_30"; 35 case CudaArch::SM_32: 36 return "sm_32"; 37 case CudaArch::SM_35: 38 return "sm_35"; 39 case CudaArch::SM_37: 40 return "sm_37"; 41 case CudaArch::SM_50: 42 return "sm_50"; 43 case CudaArch::SM_52: 44 return "sm_52"; 45 case CudaArch::SM_53: 46 return "sm_53"; 47 case CudaArch::SM_60: 48 return "sm_60"; 49 case CudaArch::SM_61: 50 return "sm_61"; 51 case CudaArch::SM_62: 52 return "sm_62"; 53 case CudaArch::SM_70: 54 return "sm_70"; 55 } 56 llvm_unreachable("invalid enum"); 57 } 58 59 CudaArch StringToCudaArch(llvm::StringRef S) { 60 return llvm::StringSwitch<CudaArch>(S) 61 .Case("sm_20", CudaArch::SM_20) 62 .Case("sm_21", CudaArch::SM_21) 63 .Case("sm_30", CudaArch::SM_30) 64 .Case("sm_32", CudaArch::SM_32) 65 .Case("sm_35", CudaArch::SM_35) 66 .Case("sm_37", CudaArch::SM_37) 67 .Case("sm_50", CudaArch::SM_50) 68 .Case("sm_52", CudaArch::SM_52) 69 .Case("sm_53", CudaArch::SM_53) 70 .Case("sm_60", CudaArch::SM_60) 71 .Case("sm_61", CudaArch::SM_61) 72 .Case("sm_62", CudaArch::SM_62) 73 .Case("sm_70", CudaArch::SM_70) 74 .Default(CudaArch::UNKNOWN); 75 } 76 77 const char *CudaVirtualArchToString(CudaVirtualArch A) { 78 switch (A) { 79 case CudaVirtualArch::UNKNOWN: 80 return "unknown"; 81 case CudaVirtualArch::COMPUTE_20: 82 return "compute_20"; 83 case CudaVirtualArch::COMPUTE_30: 84 return "compute_30"; 85 case CudaVirtualArch::COMPUTE_32: 86 return "compute_32"; 87 case CudaVirtualArch::COMPUTE_35: 88 return "compute_35"; 89 case CudaVirtualArch::COMPUTE_37: 90 return "compute_37"; 91 case CudaVirtualArch::COMPUTE_50: 92 return "compute_50"; 93 case CudaVirtualArch::COMPUTE_52: 94 return "compute_52"; 95 case CudaVirtualArch::COMPUTE_53: 96 return "compute_53"; 97 case CudaVirtualArch::COMPUTE_60: 98 return "compute_60"; 99 case CudaVirtualArch::COMPUTE_61: 100 return "compute_61"; 101 case CudaVirtualArch::COMPUTE_62: 102 return "compute_62"; 103 case CudaVirtualArch::COMPUTE_70: 104 return "compute_70"; 105 } 106 llvm_unreachable("invalid enum"); 107 } 108 109 CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) { 110 return llvm::StringSwitch<CudaVirtualArch>(S) 111 .Case("compute_20", CudaVirtualArch::COMPUTE_20) 112 .Case("compute_30", CudaVirtualArch::COMPUTE_30) 113 .Case("compute_32", CudaVirtualArch::COMPUTE_32) 114 .Case("compute_35", CudaVirtualArch::COMPUTE_35) 115 .Case("compute_37", CudaVirtualArch::COMPUTE_37) 116 .Case("compute_50", CudaVirtualArch::COMPUTE_50) 117 .Case("compute_52", CudaVirtualArch::COMPUTE_52) 118 .Case("compute_53", CudaVirtualArch::COMPUTE_53) 119 .Case("compute_60", CudaVirtualArch::COMPUTE_60) 120 .Case("compute_61", CudaVirtualArch::COMPUTE_61) 121 .Case("compute_62", CudaVirtualArch::COMPUTE_62) 122 .Case("compute_70", CudaVirtualArch::COMPUTE_70) 123 .Default(CudaVirtualArch::UNKNOWN); 124 } 125 126 CudaVirtualArch VirtualArchForCudaArch(CudaArch A) { 127 switch (A) { 128 case CudaArch::UNKNOWN: 129 return CudaVirtualArch::UNKNOWN; 130 case CudaArch::SM_20: 131 case CudaArch::SM_21: 132 return CudaVirtualArch::COMPUTE_20; 133 case CudaArch::SM_30: 134 return CudaVirtualArch::COMPUTE_30; 135 case CudaArch::SM_32: 136 return CudaVirtualArch::COMPUTE_32; 137 case CudaArch::SM_35: 138 return CudaVirtualArch::COMPUTE_35; 139 case CudaArch::SM_37: 140 return CudaVirtualArch::COMPUTE_37; 141 case CudaArch::SM_50: 142 return CudaVirtualArch::COMPUTE_50; 143 case CudaArch::SM_52: 144 return CudaVirtualArch::COMPUTE_52; 145 case CudaArch::SM_53: 146 return CudaVirtualArch::COMPUTE_53; 147 case CudaArch::SM_60: 148 return CudaVirtualArch::COMPUTE_60; 149 case CudaArch::SM_61: 150 return CudaVirtualArch::COMPUTE_61; 151 case CudaArch::SM_62: 152 return CudaVirtualArch::COMPUTE_62; 153 case CudaArch::SM_70: 154 return CudaVirtualArch::COMPUTE_70; 155 } 156 llvm_unreachable("invalid enum"); 157 } 158 159 CudaVersion MinVersionForCudaArch(CudaArch A) { 160 switch (A) { 161 case CudaArch::UNKNOWN: 162 return CudaVersion::UNKNOWN; 163 case CudaArch::SM_20: 164 case CudaArch::SM_21: 165 case CudaArch::SM_30: 166 case CudaArch::SM_32: 167 case CudaArch::SM_35: 168 case CudaArch::SM_37: 169 case CudaArch::SM_50: 170 case CudaArch::SM_52: 171 case CudaArch::SM_53: 172 return CudaVersion::CUDA_70; 173 case CudaArch::SM_60: 174 case CudaArch::SM_61: 175 case CudaArch::SM_62: 176 return CudaVersion::CUDA_80; 177 case CudaArch::SM_70: 178 return CudaVersion::CUDA_90; 179 } 180 llvm_unreachable("invalid enum"); 181 } 182 183 } // namespace clang 184