xref: /aosp_15_r20/external/pytorch/cmake/MiscCheck.cmake (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1include(CheckCXXSourceCompiles)
2include(CheckCXXCompilerFlag)
3include(CMakePushCheckState)
4
5set(CAFFE2_USE_EXCEPTION_PTR 1)
6
7# ---[ Check if we want to turn off deprecated warning due to glog.
8if(USE_GLOG)
9  cmake_push_check_state(RESET)
10  set(CMAKE_REQUIRED_FLAGS "-std=c++17")
11  CHECK_CXX_SOURCE_COMPILES(
12      "#include <glog/stl_logging.h>
13      int main(int argc, char** argv) {
14        return 0;
15      }" CAFFE2_NEED_TO_TURN_OFF_DEPRECATION_WARNING
16      FAIL_REGEX ".*-Wno-deprecated.*")
17
18  if(NOT CAFFE2_NEED_TO_TURN_OFF_DEPRECATION_WARNING AND NOT MSVC)
19    message(STATUS "Turning off deprecation warning due to glog.")
20    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated")
21  endif()
22  cmake_pop_check_state()
23endif()
24
25# ---[ Check if the compiler has AVX/AVX2 support. We only check AVX2.
26if(NOT INTERN_BUILD_MOBILE)
27  find_package(AVX) # checks AVX and AVX2
28  if(CXX_AVX2_FOUND)
29    message(STATUS "Current compiler supports avx2 extension. Will build perfkernels.")
30    # Also see CMakeLists.txt under caffe2/perfkernels.
31    set(CAFFE2_PERF_WITH_AVX 1)
32    set(CAFFE2_PERF_WITH_AVX2 1)
33  endif()
34endif()
35# ---[ Check if the compiler has AVX512 support.
36cmake_push_check_state(RESET)
37if(MSVC AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
38  # We could've used MSVC's hidden option /arch:AVX512 that defines __AVX512F__,
39  # __AVX512DQ__, and __AVX512VL__, and /arch:AVX512F that defines __AVX512F__.
40  # But, we chose not to do that not to rely on hidden options.
41  set(CMAKE_REQUIRED_FLAGS "/D__AVX512F__ /D__AVX512DQ__ /D__AVX512VL__")
42else()
43  # We only consider the case where all of avx512f, avx512dq, and avx512vl are
44  # supported.
45  # Platforms where avx512f is supported by not avx512dq and avx512vl as of
46  # Jan 15 2019 : linux_manywheel_2.7mu_cpu_build and
47  # linux_conda_3.7_cu100_build
48  set(CMAKE_REQUIRED_FLAGS "-mavx512f -mavx512dq -mavx512vl")
49endif()
50CHECK_CXX_SOURCE_COMPILES(
51    "#if defined(_MSC_VER)
52     #include <intrin.h>
53     #else
54     #include <immintrin.h>
55     #endif
56     // check avx512f
57     __m512 addConstant(__m512 arg) {
58       return _mm512_add_ps(arg, _mm512_set1_ps(1.f));
59     }
60     // check avx512dq
61     __m512 andConstant(__m512 arg) {
62       return _mm512_and_ps(arg, _mm512_set1_ps(1.f));
63     }
64     int main() {
65       __m512i a = _mm512_set1_epi32(1);
66       __m256i ymm = _mm512_extracti64x4_epi64(a, 0);
67       ymm = _mm256_abs_epi64(ymm); // check avx512vl
68       __mmask16 m = _mm512_cmp_epi32_mask(a, a, _MM_CMPINT_EQ);
69       __m512i r = _mm512_andnot_si512(a, a);
70     }" CAFFE2_COMPILER_SUPPORTS_AVX512_EXTENSIONS)
71if(CAFFE2_COMPILER_SUPPORTS_AVX512_EXTENSIONS)
72  message(STATUS "Current compiler supports avx512f extension. Will build fbgemm.")
73endif()
74cmake_pop_check_state()
75
76# ---[ Checks if compiler supports -fvisibility=hidden
77check_cxx_compiler_flag("-fvisibility=hidden" COMPILER_SUPPORTS_HIDDEN_VISIBILITY)
78check_cxx_compiler_flag("-fvisibility-inlines-hidden" COMPILER_SUPPORTS_HIDDEN_INLINE_VISIBILITY)
79if(${COMPILER_SUPPORTS_HIDDEN_INLINE_VISIBILITY})
80  set(CAFFE2_VISIBILITY_FLAG "-fvisibility-inlines-hidden")
81  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CAFFE2_VISIBILITY_FLAG}")
82endif()
83
84# ---[ Checks if linker supports -rdynamic. `-rdynamic` tells linker
85# -to add all (including unused) symbols into the dynamic symbol
86# -table. We need this to get symbols when generating backtrace at
87# -runtime.
88if(NOT MSVC)
89  check_cxx_compiler_flag("-rdynamic" COMPILER_SUPPORTS_RDYNAMIC)
90  if(${COMPILER_SUPPORTS_RDYNAMIC})
91    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -rdynamic")
92    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic")
93  endif()
94endif()
95
96# ---[ If we are building on ios, or building with opengl support, we will
97# enable -mfpu=neon-fp16 for iOS Metal build. For Android, this fpu setting
98# is going to be done with android-cmake by setting
99#     -DANDROID_ABI="armeabi-v7a with NEON FP16"
100# in the build command.
101# Also, we will turn off deprecated-declarations
102# due to protobuf.
103
104if(IOS AND (${IOS_ARCH} MATCHES "armv7*"))
105  add_definitions("-mfpu=neon-fp16")
106  add_definitions("-arch" ${IOS_ARCH})
107  add_definitions("-Wno-deprecated-declarations")
108endif()
109
110# ---[ Create CAFFE2_BUILD_SHARED_LIBS for macros.h.in usage.
111set(CAFFE2_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
112
113if(USE_NATIVE_ARCH)
114  check_cxx_compiler_flag("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE)
115  if(COMPILER_SUPPORTS_MARCH_NATIVE)
116    add_definitions("-march=native")
117  else()
118    message(
119        WARNING
120        "Your compiler does not support -march=native. Turn off this warning "
121        "by setting -DUSE_NATIVE_ARCH=OFF.")
122  endif()
123endif()
124