1*da0073e9SAndroid Build Coastguard Worker #include <ATen/Version.h> 2*da0073e9SAndroid Build Coastguard Worker #include <ATen/Config.h> 3*da0073e9SAndroid Build Coastguard Worker 4*da0073e9SAndroid Build Coastguard Worker #if AT_MKL_ENABLED() 5*da0073e9SAndroid Build Coastguard Worker #include <mkl.h> 6*da0073e9SAndroid Build Coastguard Worker #endif 7*da0073e9SAndroid Build Coastguard Worker 8*da0073e9SAndroid Build Coastguard Worker #if AT_MKLDNN_ENABLED() 9*da0073e9SAndroid Build Coastguard Worker #include <dnnl.hpp> 10*da0073e9SAndroid Build Coastguard Worker #include <ideep.hpp> 11*da0073e9SAndroid Build Coastguard Worker #endif 12*da0073e9SAndroid Build Coastguard Worker 13*da0073e9SAndroid Build Coastguard Worker #include <caffe2/core/common.h> 14*da0073e9SAndroid Build Coastguard Worker 15*da0073e9SAndroid Build Coastguard Worker #include <ATen/native/DispatchStub.h> 16*da0073e9SAndroid Build Coastguard Worker 17*da0073e9SAndroid Build Coastguard Worker #include <sstream> 18*da0073e9SAndroid Build Coastguard Worker 19*da0073e9SAndroid Build Coastguard Worker namespace at { 20*da0073e9SAndroid Build Coastguard Worker get_mkl_version()21*da0073e9SAndroid Build Coastguard Workerstd::string get_mkl_version() { 22*da0073e9SAndroid Build Coastguard Worker std::string version; 23*da0073e9SAndroid Build Coastguard Worker #if AT_MKL_ENABLED() 24*da0073e9SAndroid Build Coastguard Worker { 25*da0073e9SAndroid Build Coastguard Worker // Magic buffer number is from MKL documentation 26*da0073e9SAndroid Build Coastguard Worker // https://software.intel.com/en-us/mkl-developer-reference-c-mkl-get-version-string 27*da0073e9SAndroid Build Coastguard Worker char buf[198]; 28*da0073e9SAndroid Build Coastguard Worker mkl_get_version_string(buf, 198); 29*da0073e9SAndroid Build Coastguard Worker version = buf; 30*da0073e9SAndroid Build Coastguard Worker } 31*da0073e9SAndroid Build Coastguard Worker #else 32*da0073e9SAndroid Build Coastguard Worker version = "MKL not found"; 33*da0073e9SAndroid Build Coastguard Worker #endif 34*da0073e9SAndroid Build Coastguard Worker return version; 35*da0073e9SAndroid Build Coastguard Worker } 36*da0073e9SAndroid Build Coastguard Worker get_mkldnn_version()37*da0073e9SAndroid Build Coastguard Workerstd::string get_mkldnn_version() { 38*da0073e9SAndroid Build Coastguard Worker std::ostringstream ss; 39*da0073e9SAndroid Build Coastguard Worker #if AT_MKLDNN_ENABLED() 40*da0073e9SAndroid Build Coastguard Worker // Cribbed from mkl-dnn/src/common/verbose.cpp 41*da0073e9SAndroid Build Coastguard Worker // Too bad: can't get ISA info conveniently :( 42*da0073e9SAndroid Build Coastguard Worker // Apparently no way to get ideep version? 43*da0073e9SAndroid Build Coastguard Worker // https://github.com/intel/ideep/issues/29 44*da0073e9SAndroid Build Coastguard Worker { 45*da0073e9SAndroid Build Coastguard Worker const dnnl_version_t* ver = dnnl_version(); 46*da0073e9SAndroid Build Coastguard Worker ss << "Intel(R) MKL-DNN v" << ver->major << "." << ver->minor << "." << ver->patch 47*da0073e9SAndroid Build Coastguard Worker << " (Git Hash " << ver->hash << ")"; 48*da0073e9SAndroid Build Coastguard Worker } 49*da0073e9SAndroid Build Coastguard Worker #else 50*da0073e9SAndroid Build Coastguard Worker ss << "MKLDNN not found"; 51*da0073e9SAndroid Build Coastguard Worker #endif 52*da0073e9SAndroid Build Coastguard Worker return ss.str(); 53*da0073e9SAndroid Build Coastguard Worker } 54*da0073e9SAndroid Build Coastguard Worker get_openmp_version()55*da0073e9SAndroid Build Coastguard Workerstd::string get_openmp_version() { 56*da0073e9SAndroid Build Coastguard Worker std::ostringstream ss; 57*da0073e9SAndroid Build Coastguard Worker #ifdef _OPENMP 58*da0073e9SAndroid Build Coastguard Worker { 59*da0073e9SAndroid Build Coastguard Worker ss << "OpenMP " << _OPENMP; 60*da0073e9SAndroid Build Coastguard Worker // Reference: 61*da0073e9SAndroid Build Coastguard Worker // https://stackoverflow.com/questions/1304363/how-to-check-the-version-of-openmp-on-linux 62*da0073e9SAndroid Build Coastguard Worker const char* ver_str = nullptr; 63*da0073e9SAndroid Build Coastguard Worker switch (_OPENMP) { 64*da0073e9SAndroid Build Coastguard Worker case 200505: 65*da0073e9SAndroid Build Coastguard Worker ver_str = "2.5"; 66*da0073e9SAndroid Build Coastguard Worker break; 67*da0073e9SAndroid Build Coastguard Worker case 200805: 68*da0073e9SAndroid Build Coastguard Worker ver_str = "3.0"; 69*da0073e9SAndroid Build Coastguard Worker break; 70*da0073e9SAndroid Build Coastguard Worker case 201107: 71*da0073e9SAndroid Build Coastguard Worker ver_str = "3.1"; 72*da0073e9SAndroid Build Coastguard Worker break; 73*da0073e9SAndroid Build Coastguard Worker case 201307: 74*da0073e9SAndroid Build Coastguard Worker ver_str = "4.0"; 75*da0073e9SAndroid Build Coastguard Worker break; 76*da0073e9SAndroid Build Coastguard Worker case 201511: 77*da0073e9SAndroid Build Coastguard Worker ver_str = "4.5"; 78*da0073e9SAndroid Build Coastguard Worker break; 79*da0073e9SAndroid Build Coastguard Worker default: 80*da0073e9SAndroid Build Coastguard Worker ver_str = nullptr; 81*da0073e9SAndroid Build Coastguard Worker break; 82*da0073e9SAndroid Build Coastguard Worker } 83*da0073e9SAndroid Build Coastguard Worker if (ver_str) { 84*da0073e9SAndroid Build Coastguard Worker ss << " (a.k.a. OpenMP " << ver_str << ")"; 85*da0073e9SAndroid Build Coastguard Worker } 86*da0073e9SAndroid Build Coastguard Worker } 87*da0073e9SAndroid Build Coastguard Worker #else 88*da0073e9SAndroid Build Coastguard Worker ss << "OpenMP not found"; 89*da0073e9SAndroid Build Coastguard Worker #endif 90*da0073e9SAndroid Build Coastguard Worker return ss.str(); 91*da0073e9SAndroid Build Coastguard Worker } 92*da0073e9SAndroid Build Coastguard Worker get_cpu_capability()93*da0073e9SAndroid Build Coastguard Workerstd::string get_cpu_capability() { 94*da0073e9SAndroid Build Coastguard Worker // It is possible that we override the cpu_capability with 95*da0073e9SAndroid Build Coastguard Worker // environment variable 96*da0073e9SAndroid Build Coastguard Worker auto capability = native::get_cpu_capability(); 97*da0073e9SAndroid Build Coastguard Worker switch (capability) { 98*da0073e9SAndroid Build Coastguard Worker #if defined(HAVE_VSX_CPU_DEFINITION) 99*da0073e9SAndroid Build Coastguard Worker case native::CPUCapability::DEFAULT: 100*da0073e9SAndroid Build Coastguard Worker return "DEFAULT"; 101*da0073e9SAndroid Build Coastguard Worker case native::CPUCapability::VSX: 102*da0073e9SAndroid Build Coastguard Worker return "VSX"; 103*da0073e9SAndroid Build Coastguard Worker #elif defined(HAVE_ZVECTOR_CPU_DEFINITION) 104*da0073e9SAndroid Build Coastguard Worker case native::CPUCapability::DEFAULT: 105*da0073e9SAndroid Build Coastguard Worker return "DEFAULT"; 106*da0073e9SAndroid Build Coastguard Worker case native::CPUCapability::ZVECTOR: 107*da0073e9SAndroid Build Coastguard Worker return "Z VECTOR"; 108*da0073e9SAndroid Build Coastguard Worker #else 109*da0073e9SAndroid Build Coastguard Worker case native::CPUCapability::DEFAULT: 110*da0073e9SAndroid Build Coastguard Worker return "NO AVX"; 111*da0073e9SAndroid Build Coastguard Worker case native::CPUCapability::AVX2: 112*da0073e9SAndroid Build Coastguard Worker return "AVX2"; 113*da0073e9SAndroid Build Coastguard Worker case native::CPUCapability::AVX512: 114*da0073e9SAndroid Build Coastguard Worker return "AVX512"; 115*da0073e9SAndroid Build Coastguard Worker #endif 116*da0073e9SAndroid Build Coastguard Worker default: 117*da0073e9SAndroid Build Coastguard Worker break; 118*da0073e9SAndroid Build Coastguard Worker } 119*da0073e9SAndroid Build Coastguard Worker return ""; 120*da0073e9SAndroid Build Coastguard Worker } 121*da0073e9SAndroid Build Coastguard Worker used_cpu_capability()122*da0073e9SAndroid Build Coastguard Workerstatic std::string used_cpu_capability() { 123*da0073e9SAndroid Build Coastguard Worker // It is possible that we override the cpu_capability with 124*da0073e9SAndroid Build Coastguard Worker // environment variable 125*da0073e9SAndroid Build Coastguard Worker std::ostringstream ss; 126*da0073e9SAndroid Build Coastguard Worker ss << "CPU capability usage: " << get_cpu_capability(); 127*da0073e9SAndroid Build Coastguard Worker return ss.str(); 128*da0073e9SAndroid Build Coastguard Worker } 129*da0073e9SAndroid Build Coastguard Worker show_config()130*da0073e9SAndroid Build Coastguard Workerstd::string show_config() { 131*da0073e9SAndroid Build Coastguard Worker std::ostringstream ss; 132*da0073e9SAndroid Build Coastguard Worker ss << "PyTorch built with:\n"; 133*da0073e9SAndroid Build Coastguard Worker 134*da0073e9SAndroid Build Coastguard Worker // Reference: 135*da0073e9SAndroid Build Coastguard Worker // https://blog.kowalczyk.info/article/j/guide-to-predefined-macros-in-c-compilers-gcc-clang-msvc-etc..html 136*da0073e9SAndroid Build Coastguard Worker 137*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) 138*da0073e9SAndroid Build Coastguard Worker { 139*da0073e9SAndroid Build Coastguard Worker ss << " - GCC " << __GNUC__ << "." << __GNUC_MINOR__ << "\n"; 140*da0073e9SAndroid Build Coastguard Worker } 141*da0073e9SAndroid Build Coastguard Worker #endif 142*da0073e9SAndroid Build Coastguard Worker 143*da0073e9SAndroid Build Coastguard Worker #if defined(__cplusplus) 144*da0073e9SAndroid Build Coastguard Worker { 145*da0073e9SAndroid Build Coastguard Worker ss << " - C++ Version: " << __cplusplus << "\n"; 146*da0073e9SAndroid Build Coastguard Worker } 147*da0073e9SAndroid Build Coastguard Worker #endif 148*da0073e9SAndroid Build Coastguard Worker 149*da0073e9SAndroid Build Coastguard Worker #if defined(__clang_major__) 150*da0073e9SAndroid Build Coastguard Worker { 151*da0073e9SAndroid Build Coastguard Worker ss << " - clang " << __clang_major__ << "." << __clang_minor__ << "." << __clang_patchlevel__ << "\n"; 152*da0073e9SAndroid Build Coastguard Worker } 153*da0073e9SAndroid Build Coastguard Worker #endif 154*da0073e9SAndroid Build Coastguard Worker 155*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) 156*da0073e9SAndroid Build Coastguard Worker { 157*da0073e9SAndroid Build Coastguard Worker ss << " - MSVC " << _MSC_FULL_VER << "\n"; 158*da0073e9SAndroid Build Coastguard Worker } 159*da0073e9SAndroid Build Coastguard Worker #endif 160*da0073e9SAndroid Build Coastguard Worker 161*da0073e9SAndroid Build Coastguard Worker #if AT_MKL_ENABLED() 162*da0073e9SAndroid Build Coastguard Worker ss << " - " << get_mkl_version() << "\n"; 163*da0073e9SAndroid Build Coastguard Worker #endif 164*da0073e9SAndroid Build Coastguard Worker 165*da0073e9SAndroid Build Coastguard Worker #if AT_MKLDNN_ENABLED() 166*da0073e9SAndroid Build Coastguard Worker ss << " - " << get_mkldnn_version() << "\n"; 167*da0073e9SAndroid Build Coastguard Worker #endif 168*da0073e9SAndroid Build Coastguard Worker 169*da0073e9SAndroid Build Coastguard Worker #ifdef _OPENMP 170*da0073e9SAndroid Build Coastguard Worker ss << " - " << get_openmp_version() << "\n"; 171*da0073e9SAndroid Build Coastguard Worker #endif 172*da0073e9SAndroid Build Coastguard Worker 173*da0073e9SAndroid Build Coastguard Worker #if AT_BUILD_WITH_LAPACK() 174*da0073e9SAndroid Build Coastguard Worker // TODO: Actually record which one we actually picked 175*da0073e9SAndroid Build Coastguard Worker ss << " - LAPACK is enabled (usually provided by MKL)\n"; 176*da0073e9SAndroid Build Coastguard Worker #endif 177*da0073e9SAndroid Build Coastguard Worker 178*da0073e9SAndroid Build Coastguard Worker #if AT_NNPACK_ENABLED() 179*da0073e9SAndroid Build Coastguard Worker // TODO: No version; c.f. https://github.com/Maratyszcza/NNPACK/issues/165 180*da0073e9SAndroid Build Coastguard Worker ss << " - NNPACK is enabled\n"; 181*da0073e9SAndroid Build Coastguard Worker #endif 182*da0073e9SAndroid Build Coastguard Worker 183*da0073e9SAndroid Build Coastguard Worker #ifdef CROSS_COMPILING_MACOSX 184*da0073e9SAndroid Build Coastguard Worker ss << " - Cross compiling on MacOSX\n"; 185*da0073e9SAndroid Build Coastguard Worker #endif 186*da0073e9SAndroid Build Coastguard Worker 187*da0073e9SAndroid Build Coastguard Worker ss << " - "<< used_cpu_capability() << "\n"; 188*da0073e9SAndroid Build Coastguard Worker 189*da0073e9SAndroid Build Coastguard Worker if (hasCUDA()) { 190*da0073e9SAndroid Build Coastguard Worker ss << detail::getCUDAHooks().showConfig(); 191*da0073e9SAndroid Build Coastguard Worker } 192*da0073e9SAndroid Build Coastguard Worker 193*da0073e9SAndroid Build Coastguard Worker if (hasMAIA()) { 194*da0073e9SAndroid Build Coastguard Worker ss << detail::getMAIAHooks().showConfig(); 195*da0073e9SAndroid Build Coastguard Worker } 196*da0073e9SAndroid Build Coastguard Worker 197*da0073e9SAndroid Build Coastguard Worker if (hasXPU()) { 198*da0073e9SAndroid Build Coastguard Worker ss << detail::getXPUHooks().showConfig(); 199*da0073e9SAndroid Build Coastguard Worker } 200*da0073e9SAndroid Build Coastguard Worker 201*da0073e9SAndroid Build Coastguard Worker ss << " - Build settings: "; 202*da0073e9SAndroid Build Coastguard Worker for (const auto& pair : caffe2::GetBuildOptions()) { 203*da0073e9SAndroid Build Coastguard Worker if (!pair.second.empty()) { 204*da0073e9SAndroid Build Coastguard Worker ss << pair.first << "=" << pair.second << ", "; 205*da0073e9SAndroid Build Coastguard Worker } 206*da0073e9SAndroid Build Coastguard Worker } 207*da0073e9SAndroid Build Coastguard Worker ss << "\n"; 208*da0073e9SAndroid Build Coastguard Worker 209*da0073e9SAndroid Build Coastguard Worker // TODO: do HIP 210*da0073e9SAndroid Build Coastguard Worker // TODO: do XLA 211*da0073e9SAndroid Build Coastguard Worker // TODO: do MPS 212*da0073e9SAndroid Build Coastguard Worker 213*da0073e9SAndroid Build Coastguard Worker return ss.str(); 214*da0073e9SAndroid Build Coastguard Worker } 215*da0073e9SAndroid Build Coastguard Worker get_cxx_flags()216*da0073e9SAndroid Build Coastguard Workerstd::string get_cxx_flags() { 217*da0073e9SAndroid Build Coastguard Worker #if defined(FBCODE_CAFFE2) 218*da0073e9SAndroid Build Coastguard Worker TORCH_CHECK( 219*da0073e9SAndroid Build Coastguard Worker false, 220*da0073e9SAndroid Build Coastguard Worker "Buck does not populate the `CXX_FLAGS` field of Caffe2 build options. " 221*da0073e9SAndroid Build Coastguard Worker "As a result, `get_cxx_flags` is OSS only." 222*da0073e9SAndroid Build Coastguard Worker ); 223*da0073e9SAndroid Build Coastguard Worker #endif 224*da0073e9SAndroid Build Coastguard Worker return caffe2::GetBuildOptions().at("CXX_FLAGS"); 225*da0073e9SAndroid Build Coastguard Worker } 226*da0073e9SAndroid Build Coastguard Worker 227*da0073e9SAndroid Build Coastguard Worker } 228