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 case CudaVersion::CUDA_91: 22 return "9.1"; 23 } 24 llvm_unreachable("invalid enum"); 25 } 26 27 const char *CudaArchToString(CudaArch A) { 28 switch (A) { 29 case CudaArch::UNKNOWN: 30 return "unknown"; 31 case CudaArch::SM_20: 32 return "sm_20"; 33 case CudaArch::SM_21: 34 return "sm_21"; 35 case CudaArch::SM_30: 36 return "sm_30"; 37 case CudaArch::SM_32: 38 return "sm_32"; 39 case CudaArch::SM_35: 40 return "sm_35"; 41 case CudaArch::SM_37: 42 return "sm_37"; 43 case CudaArch::SM_50: 44 return "sm_50"; 45 case CudaArch::SM_52: 46 return "sm_52"; 47 case CudaArch::SM_53: 48 return "sm_53"; 49 case CudaArch::SM_60: 50 return "sm_60"; 51 case CudaArch::SM_61: 52 return "sm_61"; 53 case CudaArch::SM_62: 54 return "sm_62"; 55 case CudaArch::SM_70: 56 return "sm_70"; 57 case CudaArch::SM_72: 58 return "sm_72"; 59 } 60 llvm_unreachable("invalid enum"); 61 } 62 63 CudaArch StringToCudaArch(llvm::StringRef S) { 64 return llvm::StringSwitch<CudaArch>(S) 65 .Case("sm_20", CudaArch::SM_20) 66 .Case("sm_21", CudaArch::SM_21) 67 .Case("sm_30", CudaArch::SM_30) 68 .Case("sm_32", CudaArch::SM_32) 69 .Case("sm_35", CudaArch::SM_35) 70 .Case("sm_37", CudaArch::SM_37) 71 .Case("sm_50", CudaArch::SM_50) 72 .Case("sm_52", CudaArch::SM_52) 73 .Case("sm_53", CudaArch::SM_53) 74 .Case("sm_60", CudaArch::SM_60) 75 .Case("sm_61", CudaArch::SM_61) 76 .Case("sm_62", CudaArch::SM_62) 77 .Case("sm_70", CudaArch::SM_70) 78 .Case("sm_72", CudaArch::SM_72) 79 .Default(CudaArch::UNKNOWN); 80 } 81 82 const char *CudaVirtualArchToString(CudaVirtualArch A) { 83 switch (A) { 84 case CudaVirtualArch::UNKNOWN: 85 return "unknown"; 86 case CudaVirtualArch::COMPUTE_20: 87 return "compute_20"; 88 case CudaVirtualArch::COMPUTE_30: 89 return "compute_30"; 90 case CudaVirtualArch::COMPUTE_32: 91 return "compute_32"; 92 case CudaVirtualArch::COMPUTE_35: 93 return "compute_35"; 94 case CudaVirtualArch::COMPUTE_37: 95 return "compute_37"; 96 case CudaVirtualArch::COMPUTE_50: 97 return "compute_50"; 98 case CudaVirtualArch::COMPUTE_52: 99 return "compute_52"; 100 case CudaVirtualArch::COMPUTE_53: 101 return "compute_53"; 102 case CudaVirtualArch::COMPUTE_60: 103 return "compute_60"; 104 case CudaVirtualArch::COMPUTE_61: 105 return "compute_61"; 106 case CudaVirtualArch::COMPUTE_62: 107 return "compute_62"; 108 case CudaVirtualArch::COMPUTE_70: 109 return "compute_70"; 110 case CudaVirtualArch::COMPUTE_72: 111 return "compute_72"; 112 } 113 llvm_unreachable("invalid enum"); 114 } 115 116 CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) { 117 return llvm::StringSwitch<CudaVirtualArch>(S) 118 .Case("compute_20", CudaVirtualArch::COMPUTE_20) 119 .Case("compute_30", CudaVirtualArch::COMPUTE_30) 120 .Case("compute_32", CudaVirtualArch::COMPUTE_32) 121 .Case("compute_35", CudaVirtualArch::COMPUTE_35) 122 .Case("compute_37", CudaVirtualArch::COMPUTE_37) 123 .Case("compute_50", CudaVirtualArch::COMPUTE_50) 124 .Case("compute_52", CudaVirtualArch::COMPUTE_52) 125 .Case("compute_53", CudaVirtualArch::COMPUTE_53) 126 .Case("compute_60", CudaVirtualArch::COMPUTE_60) 127 .Case("compute_61", CudaVirtualArch::COMPUTE_61) 128 .Case("compute_62", CudaVirtualArch::COMPUTE_62) 129 .Case("compute_70", CudaVirtualArch::COMPUTE_70) 130 .Case("compute_72", CudaVirtualArch::COMPUTE_72) 131 .Default(CudaVirtualArch::UNKNOWN); 132 } 133 134 CudaVirtualArch VirtualArchForCudaArch(CudaArch A) { 135 switch (A) { 136 case CudaArch::UNKNOWN: 137 return CudaVirtualArch::UNKNOWN; 138 case CudaArch::SM_20: 139 case CudaArch::SM_21: 140 return CudaVirtualArch::COMPUTE_20; 141 case CudaArch::SM_30: 142 return CudaVirtualArch::COMPUTE_30; 143 case CudaArch::SM_32: 144 return CudaVirtualArch::COMPUTE_32; 145 case CudaArch::SM_35: 146 return CudaVirtualArch::COMPUTE_35; 147 case CudaArch::SM_37: 148 return CudaVirtualArch::COMPUTE_37; 149 case CudaArch::SM_50: 150 return CudaVirtualArch::COMPUTE_50; 151 case CudaArch::SM_52: 152 return CudaVirtualArch::COMPUTE_52; 153 case CudaArch::SM_53: 154 return CudaVirtualArch::COMPUTE_53; 155 case CudaArch::SM_60: 156 return CudaVirtualArch::COMPUTE_60; 157 case CudaArch::SM_61: 158 return CudaVirtualArch::COMPUTE_61; 159 case CudaArch::SM_62: 160 return CudaVirtualArch::COMPUTE_62; 161 case CudaArch::SM_70: 162 return CudaVirtualArch::COMPUTE_70; 163 case CudaArch::SM_72: 164 return CudaVirtualArch::COMPUTE_72; 165 } 166 llvm_unreachable("invalid enum"); 167 } 168 169 CudaVersion MinVersionForCudaArch(CudaArch A) { 170 switch (A) { 171 case CudaArch::UNKNOWN: 172 return CudaVersion::UNKNOWN; 173 case CudaArch::SM_20: 174 case CudaArch::SM_21: 175 case CudaArch::SM_30: 176 case CudaArch::SM_32: 177 case CudaArch::SM_35: 178 case CudaArch::SM_37: 179 case CudaArch::SM_50: 180 case CudaArch::SM_52: 181 case CudaArch::SM_53: 182 return CudaVersion::CUDA_70; 183 case CudaArch::SM_60: 184 case CudaArch::SM_61: 185 case CudaArch::SM_62: 186 return CudaVersion::CUDA_80; 187 case CudaArch::SM_70: 188 return CudaVersion::CUDA_90; 189 case CudaArch::SM_72: 190 return CudaVersion::CUDA_91; 191 } 192 llvm_unreachable("invalid enum"); 193 } 194 195 CudaVersion MaxVersionForCudaArch(CudaArch A) { 196 switch (A) { 197 case CudaArch::UNKNOWN: 198 return CudaVersion::UNKNOWN; 199 case CudaArch::SM_20: 200 case CudaArch::SM_21: 201 return CudaVersion::CUDA_80; 202 default: 203 return CudaVersion::LATEST; 204 } 205 } 206 207 } // namespace clang 208