| cmake_minimum_required(VERSION 3.13) |
| project(mshadow C CXX) |
| |
| include(CMakeDependentOption) |
| option(USE_CUDA "Build with CUDA support" ON) |
| option(USE_CUDNN ON) |
| cmake_dependent_option(USE_SSE "Build with x86 SSE instruction support" ON |
| "CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64" OFF) |
| cmake_dependent_option(USE_F16C "Build with x86 F16C instruction support" ON |
| "CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64" OFF) # autodetects support if ON |
| option(USE_INT64_TENSOR_SIZE "Use int64_t to represent the total number of elements in a tensor" OFF) |
| option(MSHADOW_IN_CXX11 ON) |
| |
| add_library(mshadow INTERFACE) |
| file(GLOB_RECURSE MSHADOWSOURCE "mshadow/*.h") |
| target_include_directories(mshadow INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}") |
| target_sources(mshadow INTERFACE ${MSHADOWSOURCE}) |
| if(UNIX) |
| target_compile_options(mshadow INTERFACE |
| "$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:Clang>>:-Wno-braced-scalar-init>" |
| "$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:Clang>>:-Wno-pass-failed>" |
| # TODO Replace Wno-unused-lambda-capture with [[maybe_unused]] annotation once requiring C++17 |
| "$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:Clang>>:-Wno-unused-lambda-capture>" |
| # TODO Fixing the warning leads to compile error on 4.8; fix once 4.8 support is dropped |
| "$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:Clang>>:-Wno-undefined-var-template>" |
| "$<$<COMPILE_LANGUAGE:CXX>:-Wno-unused-parameter>" |
| "$<$<COMPILE_LANGUAGE:CXX>:-Wno-unknown-pragmas>" |
| "$<$<COMPILE_LANGUAGE:CXX>:-Wno-unused-local-typedefs>" |
| "$<$<COMPILE_LANGUAGE:CUDA>:--expt-relaxed-constexpr>") |
| endif() |
| |
| if(USE_CUDA) |
| enable_language(CUDA) |
| file(GLOB_RECURSE MSHADOW_CUDASOURCE "mshadow/*.cuh") |
| target_sources(mshadow INTERFACE ${MSHADOW_CUDASOURCE}) |
| target_compile_definitions(mshadow INTERFACE MSHADOW_USE_CUDA=1 |
| MSHADOW_FORCE_STREAM) |
| else() |
| target_compile_definitions(mshadow INTERFACE MSHADOW_USE_CUDA=0) |
| endif() |
| if(USE_SSE) |
| # For cross compilation, we can't rely on the compiler checks, but mshadow |
| # will add platform specific includes not available in other arches |
| include(CheckCXXCompilerFlag) |
| check_cxx_compiler_flag("-msse3" SUPPORT_MSSE3) |
| check_cxx_compiler_flag("-msse2" SUPPORT_MSSE2) |
| if(SUPPORT_MSSE3) |
| target_compile_definitions(mshadow INTERFACE MSHADOW_USE_SSE) |
| target_compile_options(mshadow INTERFACE $<$<COMPILE_LANGUAGE:CXX>:-msse3>) |
| elseif(SUPPORT_MSSE2) |
| target_compile_definitions(mshadow INTERFACE MSHADOW_USE_SSE) |
| target_compile_options(mshadow INTERFACE $<$<COMPILE_LANGUAGE:CXX>:-msse2>) |
| else() |
| target_compile_definitions(mshadow INTERFACE MSHADOW_USE_SSE=0) |
| endif() |
| else() |
| target_compile_definitions(mshadow INTERFACE MSHADOW_USE_SSE=0) |
| endif() |
| if(USE_CUDNN) |
| target_compile_definitions(mshadow INTERFACE MSHADOW_USE_CUDNN) |
| endif() |
| if(USE_CUTENSOR) |
| target_compile_definitions(mshadow INTERFACE MSHADOW_USE_CUTENSOR) |
| endif() |
| if(MSHADOW_IN_CXX11) |
| target_compile_definitions(mshadow INTERFACE MSHADOW_IN_CXX11) |
| endif() |
| if(USE_F16C) |
| # Determine if hardware supports F16C instruction set |
| message(STATUS "Determining F16C support") |
| include(cmake/AutoDetectF16C.cmake) |
| if(SUPPORT_F16C) |
| target_compile_options(mshadow INTERFACE $<$<COMPILE_LANGUAGE:CXX>:-mf16c>) |
| else() |
| target_compile_definitions(mshadow INTERFACE MSHADOW_USE_F16C=0) |
| endif() |
| else() |
| target_compile_definitions(mshadow INTERFACE MSHADOW_USE_F16C=0) |
| endif() |
| if(USE_INT64_TENSOR_SIZE) |
| message(STATUS "Using 64-bit integer for tensor size") |
| target_compile_definitions(mshadow INTERFACE MSHADOW_INT64_TENSOR_SIZE=1) |
| else() |
| target_compile_definitions(mshadow INTERFACE MSHADOW_INT64_TENSOR_SIZE=0) |
| endif() |
| |
| set(mshadow_LINT_DIRS mshadow mshadow-ps) |
| find_package(Python3) |
| add_custom_target(mshadow_lint COMMAND ${CMAKE_COMMAND} -DMSVC=${MSVC} |
| -DPYTHON_EXECUTABLE=${Python3_EXECUTABLE} -DLINT_DIRS=${mshadow_LINT_DIRS} |
| -DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR} -DPROJECT_NAME=mshadow |
| -P ${PROJECT_SOURCE_DIR}/../dmlc-core/cmake/lint.cmake) |