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