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