Cuda.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #include "clang/Basic/Cuda.h"
  2. #include "llvm/ADT/StringRef.h"
  3. #include "llvm/ADT/StringSwitch.h"
  4. #include "llvm/Support/ErrorHandling.h"
  5. namespace clang {
  6. const char *CudaVersionToString(CudaVersion V) {
  7. switch (V) {
  8. case CudaVersion::UNKNOWN:
  9. return "unknown";
  10. case CudaVersion::CUDA_70:
  11. return "7.0";
  12. case CudaVersion::CUDA_75:
  13. return "7.5";
  14. case CudaVersion::CUDA_80:
  15. return "8.0";
  16. case CudaVersion::CUDA_90:
  17. return "9.0";
  18. case CudaVersion::CUDA_91:
  19. return "9.1";
  20. case CudaVersion::CUDA_92:
  21. return "9.2";
  22. case CudaVersion::CUDA_100:
  23. return "10.0";
  24. }
  25. llvm_unreachable("invalid enum");
  26. }
  27. const char *CudaArchToString(CudaArch A) {
  28. switch (A) {
  29. case CudaArch::LAST:
  30. break;
  31. case CudaArch::UNKNOWN:
  32. return "unknown";
  33. case CudaArch::SM_20:
  34. return "sm_20";
  35. case CudaArch::SM_21:
  36. return "sm_21";
  37. case CudaArch::SM_30:
  38. return "sm_30";
  39. case CudaArch::SM_32:
  40. return "sm_32";
  41. case CudaArch::SM_35:
  42. return "sm_35";
  43. case CudaArch::SM_37:
  44. return "sm_37";
  45. case CudaArch::SM_50:
  46. return "sm_50";
  47. case CudaArch::SM_52:
  48. return "sm_52";
  49. case CudaArch::SM_53:
  50. return "sm_53";
  51. case CudaArch::SM_60:
  52. return "sm_60";
  53. case CudaArch::SM_61:
  54. return "sm_61";
  55. case CudaArch::SM_62:
  56. return "sm_62";
  57. case CudaArch::SM_70:
  58. return "sm_70";
  59. case CudaArch::SM_72:
  60. return "sm_72";
  61. case CudaArch::SM_75:
  62. return "sm_75";
  63. case CudaArch::GFX600: // tahiti
  64. return "gfx600";
  65. case CudaArch::GFX601: // pitcairn, verde, oland,hainan
  66. return "gfx601";
  67. case CudaArch::GFX700: // kaveri
  68. return "gfx700";
  69. case CudaArch::GFX701: // hawaii
  70. return "gfx701";
  71. case CudaArch::GFX702: // 290,290x,R390,R390x
  72. return "gfx702";
  73. case CudaArch::GFX703: // kabini mullins
  74. return "gfx703";
  75. case CudaArch::GFX704: // bonaire
  76. return "gfx704";
  77. case CudaArch::GFX801: // carrizo
  78. return "gfx801";
  79. case CudaArch::GFX802: // tonga,iceland
  80. return "gfx802";
  81. case CudaArch::GFX803: // fiji,polaris10
  82. return "gfx803";
  83. case CudaArch::GFX810: // stoney
  84. return "gfx810";
  85. case CudaArch::GFX900: // vega, instinct
  86. return "gfx900";
  87. case CudaArch::GFX902: // TBA
  88. return "gfx902";
  89. }
  90. llvm_unreachable("invalid enum");
  91. }
  92. CudaArch StringToCudaArch(llvm::StringRef S) {
  93. return llvm::StringSwitch<CudaArch>(S)
  94. .Case("sm_20", CudaArch::SM_20)
  95. .Case("sm_21", CudaArch::SM_21)
  96. .Case("sm_30", CudaArch::SM_30)
  97. .Case("sm_32", CudaArch::SM_32)
  98. .Case("sm_35", CudaArch::SM_35)
  99. .Case("sm_37", CudaArch::SM_37)
  100. .Case("sm_50", CudaArch::SM_50)
  101. .Case("sm_52", CudaArch::SM_52)
  102. .Case("sm_53", CudaArch::SM_53)
  103. .Case("sm_60", CudaArch::SM_60)
  104. .Case("sm_61", CudaArch::SM_61)
  105. .Case("sm_62", CudaArch::SM_62)
  106. .Case("sm_70", CudaArch::SM_70)
  107. .Case("sm_72", CudaArch::SM_72)
  108. .Case("sm_75", CudaArch::SM_75)
  109. .Case("gfx600", CudaArch::GFX600)
  110. .Case("gfx601", CudaArch::GFX601)
  111. .Case("gfx700", CudaArch::GFX700)
  112. .Case("gfx701", CudaArch::GFX701)
  113. .Case("gfx702", CudaArch::GFX702)
  114. .Case("gfx703", CudaArch::GFX703)
  115. .Case("gfx704", CudaArch::GFX704)
  116. .Case("gfx801", CudaArch::GFX801)
  117. .Case("gfx802", CudaArch::GFX802)
  118. .Case("gfx803", CudaArch::GFX803)
  119. .Case("gfx810", CudaArch::GFX810)
  120. .Case("gfx900", CudaArch::GFX900)
  121. .Case("gfx902", CudaArch::GFX902)
  122. .Default(CudaArch::UNKNOWN);
  123. }
  124. const char *CudaVirtualArchToString(CudaVirtualArch A) {
  125. switch (A) {
  126. case CudaVirtualArch::UNKNOWN:
  127. return "unknown";
  128. case CudaVirtualArch::COMPUTE_20:
  129. return "compute_20";
  130. case CudaVirtualArch::COMPUTE_30:
  131. return "compute_30";
  132. case CudaVirtualArch::COMPUTE_32:
  133. return "compute_32";
  134. case CudaVirtualArch::COMPUTE_35:
  135. return "compute_35";
  136. case CudaVirtualArch::COMPUTE_37:
  137. return "compute_37";
  138. case CudaVirtualArch::COMPUTE_50:
  139. return "compute_50";
  140. case CudaVirtualArch::COMPUTE_52:
  141. return "compute_52";
  142. case CudaVirtualArch::COMPUTE_53:
  143. return "compute_53";
  144. case CudaVirtualArch::COMPUTE_60:
  145. return "compute_60";
  146. case CudaVirtualArch::COMPUTE_61:
  147. return "compute_61";
  148. case CudaVirtualArch::COMPUTE_62:
  149. return "compute_62";
  150. case CudaVirtualArch::COMPUTE_70:
  151. return "compute_70";
  152. case CudaVirtualArch::COMPUTE_72:
  153. return "compute_72";
  154. case CudaVirtualArch::COMPUTE_75:
  155. return "compute_75";
  156. case CudaVirtualArch::COMPUTE_AMDGCN:
  157. return "compute_amdgcn";
  158. }
  159. llvm_unreachable("invalid enum");
  160. }
  161. CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) {
  162. return llvm::StringSwitch<CudaVirtualArch>(S)
  163. .Case("compute_20", CudaVirtualArch::COMPUTE_20)
  164. .Case("compute_30", CudaVirtualArch::COMPUTE_30)
  165. .Case("compute_32", CudaVirtualArch::COMPUTE_32)
  166. .Case("compute_35", CudaVirtualArch::COMPUTE_35)
  167. .Case("compute_37", CudaVirtualArch::COMPUTE_37)
  168. .Case("compute_50", CudaVirtualArch::COMPUTE_50)
  169. .Case("compute_52", CudaVirtualArch::COMPUTE_52)
  170. .Case("compute_53", CudaVirtualArch::COMPUTE_53)
  171. .Case("compute_60", CudaVirtualArch::COMPUTE_60)
  172. .Case("compute_61", CudaVirtualArch::COMPUTE_61)
  173. .Case("compute_62", CudaVirtualArch::COMPUTE_62)
  174. .Case("compute_70", CudaVirtualArch::COMPUTE_70)
  175. .Case("compute_72", CudaVirtualArch::COMPUTE_72)
  176. .Case("compute_75", CudaVirtualArch::COMPUTE_75)
  177. .Case("compute_amdgcn", CudaVirtualArch::COMPUTE_AMDGCN)
  178. .Default(CudaVirtualArch::UNKNOWN);
  179. }
  180. CudaVirtualArch VirtualArchForCudaArch(CudaArch A) {
  181. switch (A) {
  182. case CudaArch::LAST:
  183. break;
  184. case CudaArch::UNKNOWN:
  185. return CudaVirtualArch::UNKNOWN;
  186. case CudaArch::SM_20:
  187. case CudaArch::SM_21:
  188. return CudaVirtualArch::COMPUTE_20;
  189. case CudaArch::SM_30:
  190. return CudaVirtualArch::COMPUTE_30;
  191. case CudaArch::SM_32:
  192. return CudaVirtualArch::COMPUTE_32;
  193. case CudaArch::SM_35:
  194. return CudaVirtualArch::COMPUTE_35;
  195. case CudaArch::SM_37:
  196. return CudaVirtualArch::COMPUTE_37;
  197. case CudaArch::SM_50:
  198. return CudaVirtualArch::COMPUTE_50;
  199. case CudaArch::SM_52:
  200. return CudaVirtualArch::COMPUTE_52;
  201. case CudaArch::SM_53:
  202. return CudaVirtualArch::COMPUTE_53;
  203. case CudaArch::SM_60:
  204. return CudaVirtualArch::COMPUTE_60;
  205. case CudaArch::SM_61:
  206. return CudaVirtualArch::COMPUTE_61;
  207. case CudaArch::SM_62:
  208. return CudaVirtualArch::COMPUTE_62;
  209. case CudaArch::SM_70:
  210. return CudaVirtualArch::COMPUTE_70;
  211. case CudaArch::SM_72:
  212. return CudaVirtualArch::COMPUTE_72;
  213. case CudaArch::SM_75:
  214. return CudaVirtualArch::COMPUTE_75;
  215. case CudaArch::GFX600:
  216. case CudaArch::GFX601:
  217. case CudaArch::GFX700:
  218. case CudaArch::GFX701:
  219. case CudaArch::GFX702:
  220. case CudaArch::GFX703:
  221. case CudaArch::GFX704:
  222. case CudaArch::GFX801:
  223. case CudaArch::GFX802:
  224. case CudaArch::GFX803:
  225. case CudaArch::GFX810:
  226. case CudaArch::GFX900:
  227. case CudaArch::GFX902:
  228. return CudaVirtualArch::COMPUTE_AMDGCN;
  229. }
  230. llvm_unreachable("invalid enum");
  231. }
  232. CudaVersion MinVersionForCudaArch(CudaArch A) {
  233. switch (A) {
  234. case CudaArch::LAST:
  235. break;
  236. case CudaArch::UNKNOWN:
  237. return CudaVersion::UNKNOWN;
  238. case CudaArch::SM_20:
  239. case CudaArch::SM_21:
  240. case CudaArch::SM_30:
  241. case CudaArch::SM_32:
  242. case CudaArch::SM_35:
  243. case CudaArch::SM_37:
  244. case CudaArch::SM_50:
  245. case CudaArch::SM_52:
  246. case CudaArch::SM_53:
  247. return CudaVersion::CUDA_70;
  248. case CudaArch::SM_60:
  249. case CudaArch::SM_61:
  250. case CudaArch::SM_62:
  251. return CudaVersion::CUDA_80;
  252. case CudaArch::SM_70:
  253. return CudaVersion::CUDA_90;
  254. case CudaArch::SM_72:
  255. return CudaVersion::CUDA_91;
  256. case CudaArch::SM_75:
  257. return CudaVersion::CUDA_100;
  258. case CudaArch::GFX600:
  259. case CudaArch::GFX601:
  260. case CudaArch::GFX700:
  261. case CudaArch::GFX701:
  262. case CudaArch::GFX702:
  263. case CudaArch::GFX703:
  264. case CudaArch::GFX704:
  265. case CudaArch::GFX801:
  266. case CudaArch::GFX802:
  267. case CudaArch::GFX803:
  268. case CudaArch::GFX810:
  269. case CudaArch::GFX900:
  270. case CudaArch::GFX902:
  271. return CudaVersion::CUDA_70;
  272. }
  273. llvm_unreachable("invalid enum");
  274. }
  275. CudaVersion MaxVersionForCudaArch(CudaArch A) {
  276. switch (A) {
  277. case CudaArch::UNKNOWN:
  278. return CudaVersion::UNKNOWN;
  279. case CudaArch::SM_20:
  280. case CudaArch::SM_21:
  281. case CudaArch::GFX600:
  282. case CudaArch::GFX601:
  283. case CudaArch::GFX700:
  284. case CudaArch::GFX701:
  285. case CudaArch::GFX702:
  286. case CudaArch::GFX703:
  287. case CudaArch::GFX704:
  288. case CudaArch::GFX801:
  289. case CudaArch::GFX802:
  290. case CudaArch::GFX803:
  291. case CudaArch::GFX810:
  292. case CudaArch::GFX900:
  293. case CudaArch::GFX902:
  294. return CudaVersion::CUDA_80;
  295. default:
  296. return CudaVersion::LATEST;
  297. }
  298. }
  299. } // namespace clang