blob: fe03506743c87b2d1a32ffce75caf90e082253e6 [file] [log] [blame]
#include <ATen/Version.h>
#include <ATen/Config.h>
#if AT_MKL_ENABLED()
#include <mkl.h>
#endif
#if AT_MKLDNN_ENABLED()
#include <mkldnn.hpp>
#include <ideep.hpp>
#endif
#include <caffe2/core/common.h>
#include <ATen/native/DispatchStub.h>
#include <sstream>
namespace at {
std::string get_mkl_version() {
std::string version;
#if AT_MKL_ENABLED()
{
// Magic buffer number is from MKL documentation
// https://software.intel.com/en-us/mkl-developer-reference-c-mkl-get-version-string
char buf[198];
mkl_get_version_string(buf, 198);
version = buf;
}
#else
version = "MKL not found";
#endif
return version;
}
std::string get_mkldnn_version() {
std::ostringstream ss;
#if AT_MKLDNN_ENABLED()
// Cribbed from mkl-dnn/src/common/verbose.cpp
// Too bad: can't get ISA info conveniently :(
// Apparently no way to get ideep version?
// https://github.com/intel/ideep/issues/29
{
const mkldnn_version_t* ver = mkldnn_version();
ss << "Intel(R) MKL-DNN v" << ver->major << "." << ver->minor << "." << ver->patch
<< " (Git Hash " << ver->hash << ")";
}
#else
ss << "MKLDNN not found";
#endif
return ss.str();
}
std::string get_openmp_version() {
std::ostringstream ss;
#ifdef _OPENMP
{
ss << "OpenMP " << _OPENMP;
// Reference:
// https://stackoverflow.com/questions/1304363/how-to-check-the-version-of-openmp-on-linux
const char* ver_str = nullptr;
switch (_OPENMP) {
case 200505:
ver_str = "2.5";
break;
case 200805:
ver_str = "3.0";
break;
case 201107:
ver_str = "3.1";
break;
case 201307:
ver_str = "4.0";
break;
case 201511:
ver_str = "4.5";
break;
default:
ver_str = nullptr;
break;
}
if (ver_str) {
ss << " (a.k.a. OpenMP " << ver_str << ")";
}
}
#else
ss << "OpenMP not found";
#endif
return ss.str();
}
std::string used_cpu_capability() {
// It is possible that we override the cpu_capability with
// environment variable
std::ostringstream ss;
ss << "CPU capability usage: ";
auto capability = native::get_cpu_capability();
switch (capability) {
#ifdef HAVE_VSX_CPU_DEFINITION
case native::CPUCapability::DEFAULT:
ss << "DEFAULT";
break;
case native::CPUCapability::VSX:
ss << "VSX";
break;
#else
case native::CPUCapability::DEFAULT:
ss << "NO AVX";
break;
case native::CPUCapability::AVX:
ss << "AVX";
break;
case native::CPUCapability::AVX2:
ss << "AVX2";
break;
#endif
default:
break;
}
return ss.str();
}
std::string show_config() {
std::ostringstream ss;
ss << "PyTorch built with:\n";
// Reference:
// https://blog.kowalczyk.info/article/j/guide-to-predefined-macros-in-c-compilers-gcc-clang-msvc-etc..html
#if defined(__GNUC__)
{
ss << " - GCC " << __GNUC__ << "." << __GNUC_MINOR__ << "\n";
}
#endif
#if defined(__cplusplus)
{
ss << " - C++ Version: " << __cplusplus << "\n";
}
#endif
#if defined(__clang_major__)
{
ss << " - clang " << __clang_major__ << "." << __clang_minor__ << "." << __clang_patchlevel__ << "\n";
}
#endif
#if defined(_MSC_VER)
{
ss << " - MSVC " << _MSC_FULL_VER << "\n";
}
#endif
#if AT_MKL_ENABLED()
ss << " - " << get_mkl_version() << "\n";
#endif
#if AT_MKLDNN_ENABLED()
ss << " - " << get_mkldnn_version() << "\n";
#endif
#ifdef _OPENMP
ss << " - " << get_openmp_version() << "\n";
#endif
#ifdef USE_LAPACK
// TODO: Actually record which one we actually picked
ss << " - LAPACK is enabled (usually provided by MKL)\n";
#endif
#if AT_NNPACK_ENABLED()
// TODO: No version; c.f. https://github.com/Maratyszcza/NNPACK/issues/165
ss << " - NNPACK is enabled\n";
#endif
#ifdef CROSS_COMPILING_MACOSX
ss << " - Cross compiling on MacOSX\n";
#endif
ss << " - "<< used_cpu_capability() << "\n";
if (hasCUDA()) {
ss << detail::getCUDAHooks().showConfig();
}
ss << " - Build settings: ";
for (const auto& pair : caffe2::GetBuildOptions()) {
if (!pair.second.empty()) {
ss << pair.first << "=" << pair.second << ", ";
}
}
ss << "\n";
// TODO: do HIP
// TODO: do XLA
// TODO: do MLC
return ss.str();
}
std::string get_cxx_flags() {
#if defined(FBCODE_CAFFE2)
TORCH_CHECK(
false,
"Buck does not populate the `CXX_FLAGS` field of Caffe2 build options. "
"As a result, `get_cxx_flags` is OSS only."
);
#endif
return caffe2::GetBuildOptions().at("CXX_FLAGS");
}
}