xref: /aosp_15_r20/external/pytorch/aten/src/ATen/Version.cpp (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
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 Worker std::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 Worker std::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 Worker std::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 Worker std::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 Worker static 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 Worker std::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 Worker std::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