10b57cec5SDimitry Andric #include "clang/Basic/Cuda.h" 20b57cec5SDimitry Andric 30b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 40b57cec5SDimitry Andric #include "llvm/ADT/StringSwitch.h" 5*13138422SDimitry Andric #include "llvm/ADT/Twine.h" 60b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 70b57cec5SDimitry Andric #include "llvm/Support/VersionTuple.h" 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric namespace clang { 100b57cec5SDimitry Andric 110b57cec5SDimitry Andric const char *CudaVersionToString(CudaVersion V) { 120b57cec5SDimitry Andric switch (V) { 130b57cec5SDimitry Andric case CudaVersion::UNKNOWN: 140b57cec5SDimitry Andric return "unknown"; 150b57cec5SDimitry Andric case CudaVersion::CUDA_70: 160b57cec5SDimitry Andric return "7.0"; 170b57cec5SDimitry Andric case CudaVersion::CUDA_75: 180b57cec5SDimitry Andric return "7.5"; 190b57cec5SDimitry Andric case CudaVersion::CUDA_80: 200b57cec5SDimitry Andric return "8.0"; 210b57cec5SDimitry Andric case CudaVersion::CUDA_90: 220b57cec5SDimitry Andric return "9.0"; 230b57cec5SDimitry Andric case CudaVersion::CUDA_91: 240b57cec5SDimitry Andric return "9.1"; 250b57cec5SDimitry Andric case CudaVersion::CUDA_92: 260b57cec5SDimitry Andric return "9.2"; 270b57cec5SDimitry Andric case CudaVersion::CUDA_100: 280b57cec5SDimitry Andric return "10.0"; 290b57cec5SDimitry Andric case CudaVersion::CUDA_101: 300b57cec5SDimitry Andric return "10.1"; 310b57cec5SDimitry Andric } 320b57cec5SDimitry Andric llvm_unreachable("invalid enum"); 330b57cec5SDimitry Andric } 340b57cec5SDimitry Andric 35*13138422SDimitry Andric CudaVersion CudaStringToVersion(const llvm::Twine &S) { 36*13138422SDimitry Andric return llvm::StringSwitch<CudaVersion>(S.str()) 370b57cec5SDimitry Andric .Case("7.0", CudaVersion::CUDA_70) 380b57cec5SDimitry Andric .Case("7.5", CudaVersion::CUDA_75) 390b57cec5SDimitry Andric .Case("8.0", CudaVersion::CUDA_80) 400b57cec5SDimitry Andric .Case("9.0", CudaVersion::CUDA_90) 410b57cec5SDimitry Andric .Case("9.1", CudaVersion::CUDA_91) 420b57cec5SDimitry Andric .Case("9.2", CudaVersion::CUDA_92) 430b57cec5SDimitry Andric .Case("10.0", CudaVersion::CUDA_100) 44*13138422SDimitry Andric .Case("10.1", CudaVersion::CUDA_101) 45*13138422SDimitry Andric .Default(CudaVersion::UNKNOWN); 460b57cec5SDimitry Andric } 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric const char *CudaArchToString(CudaArch A) { 490b57cec5SDimitry Andric switch (A) { 500b57cec5SDimitry Andric case CudaArch::LAST: 510b57cec5SDimitry Andric break; 520b57cec5SDimitry Andric case CudaArch::UNKNOWN: 530b57cec5SDimitry Andric return "unknown"; 540b57cec5SDimitry Andric case CudaArch::SM_20: 550b57cec5SDimitry Andric return "sm_20"; 560b57cec5SDimitry Andric case CudaArch::SM_21: 570b57cec5SDimitry Andric return "sm_21"; 580b57cec5SDimitry Andric case CudaArch::SM_30: 590b57cec5SDimitry Andric return "sm_30"; 600b57cec5SDimitry Andric case CudaArch::SM_32: 610b57cec5SDimitry Andric return "sm_32"; 620b57cec5SDimitry Andric case CudaArch::SM_35: 630b57cec5SDimitry Andric return "sm_35"; 640b57cec5SDimitry Andric case CudaArch::SM_37: 650b57cec5SDimitry Andric return "sm_37"; 660b57cec5SDimitry Andric case CudaArch::SM_50: 670b57cec5SDimitry Andric return "sm_50"; 680b57cec5SDimitry Andric case CudaArch::SM_52: 690b57cec5SDimitry Andric return "sm_52"; 700b57cec5SDimitry Andric case CudaArch::SM_53: 710b57cec5SDimitry Andric return "sm_53"; 720b57cec5SDimitry Andric case CudaArch::SM_60: 730b57cec5SDimitry Andric return "sm_60"; 740b57cec5SDimitry Andric case CudaArch::SM_61: 750b57cec5SDimitry Andric return "sm_61"; 760b57cec5SDimitry Andric case CudaArch::SM_62: 770b57cec5SDimitry Andric return "sm_62"; 780b57cec5SDimitry Andric case CudaArch::SM_70: 790b57cec5SDimitry Andric return "sm_70"; 800b57cec5SDimitry Andric case CudaArch::SM_72: 810b57cec5SDimitry Andric return "sm_72"; 820b57cec5SDimitry Andric case CudaArch::SM_75: 830b57cec5SDimitry Andric return "sm_75"; 840b57cec5SDimitry Andric case CudaArch::GFX600: // tahiti 850b57cec5SDimitry Andric return "gfx600"; 860b57cec5SDimitry Andric case CudaArch::GFX601: // pitcairn, verde, oland,hainan 870b57cec5SDimitry Andric return "gfx601"; 880b57cec5SDimitry Andric case CudaArch::GFX700: // kaveri 890b57cec5SDimitry Andric return "gfx700"; 900b57cec5SDimitry Andric case CudaArch::GFX701: // hawaii 910b57cec5SDimitry Andric return "gfx701"; 920b57cec5SDimitry Andric case CudaArch::GFX702: // 290,290x,R390,R390x 930b57cec5SDimitry Andric return "gfx702"; 940b57cec5SDimitry Andric case CudaArch::GFX703: // kabini mullins 950b57cec5SDimitry Andric return "gfx703"; 960b57cec5SDimitry Andric case CudaArch::GFX704: // bonaire 970b57cec5SDimitry Andric return "gfx704"; 980b57cec5SDimitry Andric case CudaArch::GFX801: // carrizo 990b57cec5SDimitry Andric return "gfx801"; 1000b57cec5SDimitry Andric case CudaArch::GFX802: // tonga,iceland 1010b57cec5SDimitry Andric return "gfx802"; 1020b57cec5SDimitry Andric case CudaArch::GFX803: // fiji,polaris10 1030b57cec5SDimitry Andric return "gfx803"; 1040b57cec5SDimitry Andric case CudaArch::GFX810: // stoney 1050b57cec5SDimitry Andric return "gfx810"; 1060b57cec5SDimitry Andric case CudaArch::GFX900: // vega, instinct 1070b57cec5SDimitry Andric return "gfx900"; 1080b57cec5SDimitry Andric case CudaArch::GFX902: // TBA 1090b57cec5SDimitry Andric return "gfx902"; 1100b57cec5SDimitry Andric case CudaArch::GFX904: // TBA 1110b57cec5SDimitry Andric return "gfx904"; 1120b57cec5SDimitry Andric case CudaArch::GFX906: // TBA 1130b57cec5SDimitry Andric return "gfx906"; 1140b57cec5SDimitry Andric case CudaArch::GFX908: // TBA 1150b57cec5SDimitry Andric return "gfx908"; 1160b57cec5SDimitry Andric case CudaArch::GFX909: // TBA 1170b57cec5SDimitry Andric return "gfx909"; 1180b57cec5SDimitry Andric case CudaArch::GFX1010: // TBA 1190b57cec5SDimitry Andric return "gfx1010"; 1200b57cec5SDimitry Andric case CudaArch::GFX1011: // TBA 1210b57cec5SDimitry Andric return "gfx1011"; 1220b57cec5SDimitry Andric case CudaArch::GFX1012: // TBA 1230b57cec5SDimitry Andric return "gfx1012"; 1240b57cec5SDimitry Andric } 1250b57cec5SDimitry Andric llvm_unreachable("invalid enum"); 1260b57cec5SDimitry Andric } 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andric CudaArch StringToCudaArch(llvm::StringRef S) { 1290b57cec5SDimitry Andric return llvm::StringSwitch<CudaArch>(S) 1300b57cec5SDimitry Andric .Case("sm_20", CudaArch::SM_20) 1310b57cec5SDimitry Andric .Case("sm_21", CudaArch::SM_21) 1320b57cec5SDimitry Andric .Case("sm_30", CudaArch::SM_30) 1330b57cec5SDimitry Andric .Case("sm_32", CudaArch::SM_32) 1340b57cec5SDimitry Andric .Case("sm_35", CudaArch::SM_35) 1350b57cec5SDimitry Andric .Case("sm_37", CudaArch::SM_37) 1360b57cec5SDimitry Andric .Case("sm_50", CudaArch::SM_50) 1370b57cec5SDimitry Andric .Case("sm_52", CudaArch::SM_52) 1380b57cec5SDimitry Andric .Case("sm_53", CudaArch::SM_53) 1390b57cec5SDimitry Andric .Case("sm_60", CudaArch::SM_60) 1400b57cec5SDimitry Andric .Case("sm_61", CudaArch::SM_61) 1410b57cec5SDimitry Andric .Case("sm_62", CudaArch::SM_62) 1420b57cec5SDimitry Andric .Case("sm_70", CudaArch::SM_70) 1430b57cec5SDimitry Andric .Case("sm_72", CudaArch::SM_72) 1440b57cec5SDimitry Andric .Case("sm_75", CudaArch::SM_75) 1450b57cec5SDimitry Andric .Case("gfx600", CudaArch::GFX600) 1460b57cec5SDimitry Andric .Case("gfx601", CudaArch::GFX601) 1470b57cec5SDimitry Andric .Case("gfx700", CudaArch::GFX700) 1480b57cec5SDimitry Andric .Case("gfx701", CudaArch::GFX701) 1490b57cec5SDimitry Andric .Case("gfx702", CudaArch::GFX702) 1500b57cec5SDimitry Andric .Case("gfx703", CudaArch::GFX703) 1510b57cec5SDimitry Andric .Case("gfx704", CudaArch::GFX704) 1520b57cec5SDimitry Andric .Case("gfx801", CudaArch::GFX801) 1530b57cec5SDimitry Andric .Case("gfx802", CudaArch::GFX802) 1540b57cec5SDimitry Andric .Case("gfx803", CudaArch::GFX803) 1550b57cec5SDimitry Andric .Case("gfx810", CudaArch::GFX810) 1560b57cec5SDimitry Andric .Case("gfx900", CudaArch::GFX900) 1570b57cec5SDimitry Andric .Case("gfx902", CudaArch::GFX902) 1580b57cec5SDimitry Andric .Case("gfx904", CudaArch::GFX904) 1590b57cec5SDimitry Andric .Case("gfx906", CudaArch::GFX906) 1600b57cec5SDimitry Andric .Case("gfx908", CudaArch::GFX908) 1610b57cec5SDimitry Andric .Case("gfx909", CudaArch::GFX909) 1620b57cec5SDimitry Andric .Case("gfx1010", CudaArch::GFX1010) 1630b57cec5SDimitry Andric .Case("gfx1011", CudaArch::GFX1011) 1640b57cec5SDimitry Andric .Case("gfx1012", CudaArch::GFX1012) 1650b57cec5SDimitry Andric .Default(CudaArch::UNKNOWN); 1660b57cec5SDimitry Andric } 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric const char *CudaVirtualArchToString(CudaVirtualArch A) { 1690b57cec5SDimitry Andric switch (A) { 1700b57cec5SDimitry Andric case CudaVirtualArch::UNKNOWN: 1710b57cec5SDimitry Andric return "unknown"; 1720b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_20: 1730b57cec5SDimitry Andric return "compute_20"; 1740b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_30: 1750b57cec5SDimitry Andric return "compute_30"; 1760b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_32: 1770b57cec5SDimitry Andric return "compute_32"; 1780b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_35: 1790b57cec5SDimitry Andric return "compute_35"; 1800b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_37: 1810b57cec5SDimitry Andric return "compute_37"; 1820b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_50: 1830b57cec5SDimitry Andric return "compute_50"; 1840b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_52: 1850b57cec5SDimitry Andric return "compute_52"; 1860b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_53: 1870b57cec5SDimitry Andric return "compute_53"; 1880b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_60: 1890b57cec5SDimitry Andric return "compute_60"; 1900b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_61: 1910b57cec5SDimitry Andric return "compute_61"; 1920b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_62: 1930b57cec5SDimitry Andric return "compute_62"; 1940b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_70: 1950b57cec5SDimitry Andric return "compute_70"; 1960b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_72: 1970b57cec5SDimitry Andric return "compute_72"; 1980b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_75: 1990b57cec5SDimitry Andric return "compute_75"; 2000b57cec5SDimitry Andric case CudaVirtualArch::COMPUTE_AMDGCN: 2010b57cec5SDimitry Andric return "compute_amdgcn"; 2020b57cec5SDimitry Andric } 2030b57cec5SDimitry Andric llvm_unreachable("invalid enum"); 2040b57cec5SDimitry Andric } 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andric CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) { 2070b57cec5SDimitry Andric return llvm::StringSwitch<CudaVirtualArch>(S) 2080b57cec5SDimitry Andric .Case("compute_20", CudaVirtualArch::COMPUTE_20) 2090b57cec5SDimitry Andric .Case("compute_30", CudaVirtualArch::COMPUTE_30) 2100b57cec5SDimitry Andric .Case("compute_32", CudaVirtualArch::COMPUTE_32) 2110b57cec5SDimitry Andric .Case("compute_35", CudaVirtualArch::COMPUTE_35) 2120b57cec5SDimitry Andric .Case("compute_37", CudaVirtualArch::COMPUTE_37) 2130b57cec5SDimitry Andric .Case("compute_50", CudaVirtualArch::COMPUTE_50) 2140b57cec5SDimitry Andric .Case("compute_52", CudaVirtualArch::COMPUTE_52) 2150b57cec5SDimitry Andric .Case("compute_53", CudaVirtualArch::COMPUTE_53) 2160b57cec5SDimitry Andric .Case("compute_60", CudaVirtualArch::COMPUTE_60) 2170b57cec5SDimitry Andric .Case("compute_61", CudaVirtualArch::COMPUTE_61) 2180b57cec5SDimitry Andric .Case("compute_62", CudaVirtualArch::COMPUTE_62) 2190b57cec5SDimitry Andric .Case("compute_70", CudaVirtualArch::COMPUTE_70) 2200b57cec5SDimitry Andric .Case("compute_72", CudaVirtualArch::COMPUTE_72) 2210b57cec5SDimitry Andric .Case("compute_75", CudaVirtualArch::COMPUTE_75) 2220b57cec5SDimitry Andric .Case("compute_amdgcn", CudaVirtualArch::COMPUTE_AMDGCN) 2230b57cec5SDimitry Andric .Default(CudaVirtualArch::UNKNOWN); 2240b57cec5SDimitry Andric } 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric CudaVirtualArch VirtualArchForCudaArch(CudaArch A) { 2270b57cec5SDimitry Andric switch (A) { 2280b57cec5SDimitry Andric case CudaArch::LAST: 2290b57cec5SDimitry Andric break; 2300b57cec5SDimitry Andric case CudaArch::UNKNOWN: 2310b57cec5SDimitry Andric return CudaVirtualArch::UNKNOWN; 2320b57cec5SDimitry Andric case CudaArch::SM_20: 2330b57cec5SDimitry Andric case CudaArch::SM_21: 2340b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_20; 2350b57cec5SDimitry Andric case CudaArch::SM_30: 2360b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_30; 2370b57cec5SDimitry Andric case CudaArch::SM_32: 2380b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_32; 2390b57cec5SDimitry Andric case CudaArch::SM_35: 2400b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_35; 2410b57cec5SDimitry Andric case CudaArch::SM_37: 2420b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_37; 2430b57cec5SDimitry Andric case CudaArch::SM_50: 2440b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_50; 2450b57cec5SDimitry Andric case CudaArch::SM_52: 2460b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_52; 2470b57cec5SDimitry Andric case CudaArch::SM_53: 2480b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_53; 2490b57cec5SDimitry Andric case CudaArch::SM_60: 2500b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_60; 2510b57cec5SDimitry Andric case CudaArch::SM_61: 2520b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_61; 2530b57cec5SDimitry Andric case CudaArch::SM_62: 2540b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_62; 2550b57cec5SDimitry Andric case CudaArch::SM_70: 2560b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_70; 2570b57cec5SDimitry Andric case CudaArch::SM_72: 2580b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_72; 2590b57cec5SDimitry Andric case CudaArch::SM_75: 2600b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_75; 2610b57cec5SDimitry Andric case CudaArch::GFX600: 2620b57cec5SDimitry Andric case CudaArch::GFX601: 2630b57cec5SDimitry Andric case CudaArch::GFX700: 2640b57cec5SDimitry Andric case CudaArch::GFX701: 2650b57cec5SDimitry Andric case CudaArch::GFX702: 2660b57cec5SDimitry Andric case CudaArch::GFX703: 2670b57cec5SDimitry Andric case CudaArch::GFX704: 2680b57cec5SDimitry Andric case CudaArch::GFX801: 2690b57cec5SDimitry Andric case CudaArch::GFX802: 2700b57cec5SDimitry Andric case CudaArch::GFX803: 2710b57cec5SDimitry Andric case CudaArch::GFX810: 2720b57cec5SDimitry Andric case CudaArch::GFX900: 2730b57cec5SDimitry Andric case CudaArch::GFX902: 2740b57cec5SDimitry Andric case CudaArch::GFX904: 2750b57cec5SDimitry Andric case CudaArch::GFX906: 2760b57cec5SDimitry Andric case CudaArch::GFX908: 2770b57cec5SDimitry Andric case CudaArch::GFX909: 2780b57cec5SDimitry Andric case CudaArch::GFX1010: 2790b57cec5SDimitry Andric case CudaArch::GFX1011: 2800b57cec5SDimitry Andric case CudaArch::GFX1012: 2810b57cec5SDimitry Andric return CudaVirtualArch::COMPUTE_AMDGCN; 2820b57cec5SDimitry Andric } 2830b57cec5SDimitry Andric llvm_unreachable("invalid enum"); 2840b57cec5SDimitry Andric } 2850b57cec5SDimitry Andric 2860b57cec5SDimitry Andric CudaVersion MinVersionForCudaArch(CudaArch A) { 2870b57cec5SDimitry Andric switch (A) { 2880b57cec5SDimitry Andric case CudaArch::LAST: 2890b57cec5SDimitry Andric break; 2900b57cec5SDimitry Andric case CudaArch::UNKNOWN: 2910b57cec5SDimitry Andric return CudaVersion::UNKNOWN; 2920b57cec5SDimitry Andric case CudaArch::SM_20: 2930b57cec5SDimitry Andric case CudaArch::SM_21: 2940b57cec5SDimitry Andric case CudaArch::SM_30: 2950b57cec5SDimitry Andric case CudaArch::SM_32: 2960b57cec5SDimitry Andric case CudaArch::SM_35: 2970b57cec5SDimitry Andric case CudaArch::SM_37: 2980b57cec5SDimitry Andric case CudaArch::SM_50: 2990b57cec5SDimitry Andric case CudaArch::SM_52: 3000b57cec5SDimitry Andric case CudaArch::SM_53: 3010b57cec5SDimitry Andric return CudaVersion::CUDA_70; 3020b57cec5SDimitry Andric case CudaArch::SM_60: 3030b57cec5SDimitry Andric case CudaArch::SM_61: 3040b57cec5SDimitry Andric case CudaArch::SM_62: 3050b57cec5SDimitry Andric return CudaVersion::CUDA_80; 3060b57cec5SDimitry Andric case CudaArch::SM_70: 3070b57cec5SDimitry Andric return CudaVersion::CUDA_90; 3080b57cec5SDimitry Andric case CudaArch::SM_72: 3090b57cec5SDimitry Andric return CudaVersion::CUDA_91; 3100b57cec5SDimitry Andric case CudaArch::SM_75: 3110b57cec5SDimitry Andric return CudaVersion::CUDA_100; 3120b57cec5SDimitry Andric case CudaArch::GFX600: 3130b57cec5SDimitry Andric case CudaArch::GFX601: 3140b57cec5SDimitry Andric case CudaArch::GFX700: 3150b57cec5SDimitry Andric case CudaArch::GFX701: 3160b57cec5SDimitry Andric case CudaArch::GFX702: 3170b57cec5SDimitry Andric case CudaArch::GFX703: 3180b57cec5SDimitry Andric case CudaArch::GFX704: 3190b57cec5SDimitry Andric case CudaArch::GFX801: 3200b57cec5SDimitry Andric case CudaArch::GFX802: 3210b57cec5SDimitry Andric case CudaArch::GFX803: 3220b57cec5SDimitry Andric case CudaArch::GFX810: 3230b57cec5SDimitry Andric case CudaArch::GFX900: 3240b57cec5SDimitry Andric case CudaArch::GFX902: 3250b57cec5SDimitry Andric case CudaArch::GFX904: 3260b57cec5SDimitry Andric case CudaArch::GFX906: 3270b57cec5SDimitry Andric case CudaArch::GFX908: 3280b57cec5SDimitry Andric case CudaArch::GFX909: 3290b57cec5SDimitry Andric case CudaArch::GFX1010: 3300b57cec5SDimitry Andric case CudaArch::GFX1011: 3310b57cec5SDimitry Andric case CudaArch::GFX1012: 3320b57cec5SDimitry Andric return CudaVersion::CUDA_70; 3330b57cec5SDimitry Andric } 3340b57cec5SDimitry Andric llvm_unreachable("invalid enum"); 3350b57cec5SDimitry Andric } 3360b57cec5SDimitry Andric 3370b57cec5SDimitry Andric CudaVersion MaxVersionForCudaArch(CudaArch A) { 3380b57cec5SDimitry Andric switch (A) { 3390b57cec5SDimitry Andric case CudaArch::UNKNOWN: 3400b57cec5SDimitry Andric return CudaVersion::UNKNOWN; 3410b57cec5SDimitry Andric case CudaArch::SM_20: 3420b57cec5SDimitry Andric case CudaArch::SM_21: 3430b57cec5SDimitry Andric case CudaArch::GFX600: 3440b57cec5SDimitry Andric case CudaArch::GFX601: 3450b57cec5SDimitry Andric case CudaArch::GFX700: 3460b57cec5SDimitry Andric case CudaArch::GFX701: 3470b57cec5SDimitry Andric case CudaArch::GFX702: 3480b57cec5SDimitry Andric case CudaArch::GFX703: 3490b57cec5SDimitry Andric case CudaArch::GFX704: 3500b57cec5SDimitry Andric case CudaArch::GFX801: 3510b57cec5SDimitry Andric case CudaArch::GFX802: 3520b57cec5SDimitry Andric case CudaArch::GFX803: 3530b57cec5SDimitry Andric case CudaArch::GFX810: 3540b57cec5SDimitry Andric case CudaArch::GFX900: 3550b57cec5SDimitry Andric case CudaArch::GFX902: 3560b57cec5SDimitry Andric case CudaArch::GFX1010: 3570b57cec5SDimitry Andric case CudaArch::GFX1011: 3580b57cec5SDimitry Andric case CudaArch::GFX1012: 3590b57cec5SDimitry Andric return CudaVersion::CUDA_80; 3600b57cec5SDimitry Andric default: 3610b57cec5SDimitry Andric return CudaVersion::LATEST; 3620b57cec5SDimitry Andric } 3630b57cec5SDimitry Andric } 3640b57cec5SDimitry Andric 3650b57cec5SDimitry Andric static CudaVersion ToCudaVersion(llvm::VersionTuple Version) { 3660b57cec5SDimitry Andric int IVer = 3670b57cec5SDimitry Andric Version.getMajor() * 10 + Version.getMinor().getValueOr(0); 3680b57cec5SDimitry Andric switch(IVer) { 3690b57cec5SDimitry Andric case 70: 3700b57cec5SDimitry Andric return CudaVersion::CUDA_70; 3710b57cec5SDimitry Andric case 75: 3720b57cec5SDimitry Andric return CudaVersion::CUDA_75; 3730b57cec5SDimitry Andric case 80: 3740b57cec5SDimitry Andric return CudaVersion::CUDA_80; 3750b57cec5SDimitry Andric case 90: 3760b57cec5SDimitry Andric return CudaVersion::CUDA_90; 3770b57cec5SDimitry Andric case 91: 3780b57cec5SDimitry Andric return CudaVersion::CUDA_91; 3790b57cec5SDimitry Andric case 92: 3800b57cec5SDimitry Andric return CudaVersion::CUDA_92; 3810b57cec5SDimitry Andric case 100: 3820b57cec5SDimitry Andric return CudaVersion::CUDA_100; 3830b57cec5SDimitry Andric case 101: 3840b57cec5SDimitry Andric return CudaVersion::CUDA_101; 3850b57cec5SDimitry Andric default: 3860b57cec5SDimitry Andric return CudaVersion::UNKNOWN; 3870b57cec5SDimitry Andric } 3880b57cec5SDimitry Andric } 3890b57cec5SDimitry Andric 3900b57cec5SDimitry Andric bool CudaFeatureEnabled(llvm::VersionTuple Version, CudaFeature Feature) { 3910b57cec5SDimitry Andric return CudaFeatureEnabled(ToCudaVersion(Version), Feature); 3920b57cec5SDimitry Andric } 3930b57cec5SDimitry Andric 3940b57cec5SDimitry Andric bool CudaFeatureEnabled(CudaVersion Version, CudaFeature Feature) { 3950b57cec5SDimitry Andric switch (Feature) { 3960b57cec5SDimitry Andric case CudaFeature::CUDA_USES_NEW_LAUNCH: 3970b57cec5SDimitry Andric return Version >= CudaVersion::CUDA_92; 3980b57cec5SDimitry Andric case CudaFeature::CUDA_USES_FATBIN_REGISTER_END: 3990b57cec5SDimitry Andric return Version >= CudaVersion::CUDA_101; 4000b57cec5SDimitry Andric } 4010b57cec5SDimitry Andric llvm_unreachable("Unknown CUDA feature."); 4020b57cec5SDimitry Andric } 4030b57cec5SDimitry Andric } // namespace clang 404