2016-05-07 23:56:23 +03:00
|
|
|
cmake_minimum_required(VERSION 3.5.1)
|
|
|
|
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
|
|
|
|
|
2018-11-29 06:30:27 +03:00
|
|
|
if (POLICY CMP0074)
|
|
|
|
cmake_policy(SET CMP0074 NEW) # CMake 3.12
|
|
|
|
endif ()
|
|
|
|
|
2018-01-24 05:35:55 +03:00
|
|
|
project(marian CXX C)
|
2018-10-08 02:26:32 +03:00
|
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
2018-10-23 22:05:34 +03:00
|
|
|
set(BUILD_ARCH native CACHE STRING "Compile for this CPU architecture.")
|
2017-06-14 15:06:20 +03:00
|
|
|
|
2017-07-04 16:06:26 +03:00
|
|
|
# Custom CMake options
|
2019-10-29 17:29:20 +03:00
|
|
|
option(COMPILE_CPU "Compile CPU version" ON)
|
|
|
|
option(COMPILE_CUDA "Compile GPU version" ON)
|
2020-01-06 22:14:00 +03:00
|
|
|
option(COMPILE_CUDA_SM35 "Compile GPU version with SM35 support" ON)
|
|
|
|
option(COMPILE_CUDA_SM50 "Compile GPU version with SM50 support" ON)
|
|
|
|
option(COMPILE_CUDA_SM60 "Compile GPU version with SM60 support" ON)
|
|
|
|
option(COMPILE_CUDA_SM70 "Compile GPU version with SM70 support" ON)
|
2018-12-07 08:55:12 +03:00
|
|
|
option(COMPILE_EXAMPLES "Compile examples" OFF)
|
2019-10-26 03:02:16 +03:00
|
|
|
option(COMPILE_SERVER "Compile marian-server" OFF)
|
2019-11-11 12:33:13 +03:00
|
|
|
option(COMPILE_TESTS "Compile tests" OFF)
|
2019-10-30 20:29:27 +03:00
|
|
|
option(USE_CCACHE "Use ccache compiler cache (https://ccache.dev)" OFF)
|
2019-11-11 12:33:13 +03:00
|
|
|
option(USE_CUDNN "Use CUDNN library" OFF)
|
|
|
|
option(USE_DOXYGEN "Build documentation with Doxygen" ON)
|
|
|
|
option(USE_FBGEMM "Use FBGEMM" OFF)
|
2020-03-06 00:08:23 +03:00
|
|
|
option(USE_MKL "Compile with MKL support" ON)
|
2019-11-11 12:33:13 +03:00
|
|
|
option(USE_MPI "Use MPI library" OFF)
|
|
|
|
option(USE_NCCL "Use NCCL library" ON)
|
|
|
|
option(USE_SENTENCEPIECE "Download and compile SentencePiece" OFF)
|
|
|
|
option(USE_STATIC_LIBS "Link statically against non-system libs" OFF)
|
2019-10-30 20:29:27 +03:00
|
|
|
|
|
|
|
# use ccache (https://ccache.dev) for faster compilation if requested and available
|
|
|
|
if(USE_CCACHE)
|
|
|
|
find_program(CCACHE_PROGRAM ccache)
|
|
|
|
if(CCACHE_PROGRAM)
|
2020-03-06 00:08:23 +03:00
|
|
|
message(STATUS "Will be using ccache for faster repeat compilation (use cmake -DUSE_CCACHE=off to disable).")
|
2019-10-30 20:29:27 +03:00
|
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
|
|
|
|
else(CCACHE_PROGRAM)
|
|
|
|
message(WARNING "Compilation with ccache requested but no ccache found.")
|
|
|
|
endif(CCACHE_PROGRAM)
|
|
|
|
endif(USE_CCACHE)
|
2017-06-27 17:20:32 +03:00
|
|
|
|
2017-07-04 16:06:26 +03:00
|
|
|
# Project versioning
|
|
|
|
find_package(Git QUIET)
|
2017-07-13 15:02:43 +03:00
|
|
|
include(GetVersionFromFile)
|
2017-07-04 16:06:26 +03:00
|
|
|
|
|
|
|
message(STATUS "Project name: ${PROJECT_NAME}")
|
2017-08-30 16:35:47 +03:00
|
|
|
message(STATUS "Project version: ${PROJECT_VERSION_STRING_FULL}")
|
2017-01-21 18:11:40 +03:00
|
|
|
|
2018-10-03 03:02:52 +03:00
|
|
|
execute_process(COMMAND git submodule update --init --recursive --no-fetch
|
|
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
2019-02-05 10:07:00 +03:00
|
|
|
|
2019-09-04 00:28:47 +03:00
|
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
|
|
message(WARNING "CMAKE_BUILD_TYPE not set; setting to Release")
|
|
|
|
set(CMAKE_BUILD_TYPE "Release")
|
|
|
|
endif()
|
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
###############################################################################
|
2018-12-13 00:33:04 +03:00
|
|
|
# Set compilation flags
|
|
|
|
if(MSVC)
|
|
|
|
# These are used in src/CMakeLists.txt on a per-target basis
|
|
|
|
list(APPEND ALL_WARNINGS /WX; /W4;)
|
|
|
|
|
|
|
|
# Disabled bogus warnings for CPU intrincics:
|
|
|
|
# C4310: cast truncates constant value
|
|
|
|
# C4324: 'marian::cpu::int16::`anonymous-namespace'::ScatterPut': structure was padded due to alignment specifier
|
|
|
|
set(DISABLE_GLOBALLY "/wd\"4310\" /wd\"4324\"")
|
2019-02-05 10:07:00 +03:00
|
|
|
|
2018-12-13 00:45:57 +03:00
|
|
|
set(INTRINSICS "/arch:AVX")
|
|
|
|
|
|
|
|
# Or maybe use these?
|
|
|
|
# set(INTRINSICS "/arch:AVX2")
|
|
|
|
# set(INTRINSICS "/arch:AVX512")
|
2018-12-13 00:33:04 +03:00
|
|
|
|
|
|
|
set(CMAKE_CXX_FLAGS "/EHsc /DWIN32 /D_WINDOWS /DUNICODE /D_UNICODE /D_CRT_NONSTDC_NO_WARNINGS /D_CRT_SECURE_NO_WARNINGS ${DISABLE_GLOBALLY}")
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} /MT /O2 ${INTRINSICS} /Zi /MP /GL /DNDEBUG")
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} /MTd /Od /Ob0 ${INTRINSICS} /RTC1 /Zi /D_DEBUG")
|
2018-12-13 00:45:57 +03:00
|
|
|
|
|
|
|
# ignores warning LNK4049: locally defined symbol free imported - this comes from zlib
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG /LTCG:incremental /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT /ignore:4049")
|
2018-12-13 00:33:04 +03:00
|
|
|
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /LTCG:incremental")
|
|
|
|
|
2019-02-05 10:07:00 +03:00
|
|
|
find_library(SHLWAPI Shlwapi.lib)
|
2018-12-13 00:33:04 +03:00
|
|
|
set(EXT_LIBS ${EXT_LIBS} SHLWAPI)
|
2019-06-19 02:59:11 +03:00
|
|
|
else(MSVC)
|
|
|
|
|
2019-10-28 23:57:43 +03:00
|
|
|
# Check we are using at least g++ 5.0
|
|
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
|
|
|
|
message(FATAL_ERROR "FATAL ERROR: Compiling Marian requires at least g++ 5.0, your version is ${CMAKE_CXX_COMPILER_VERSION}")
|
|
|
|
endif()
|
|
|
|
|
2019-06-19 02:59:11 +03:00
|
|
|
# Detect support CPU instrinsics for the current platform. This will
|
|
|
|
# only by used with BUILD_ARCH=native. For overridden BUILD_ARCH we
|
|
|
|
# minimally use -msse4.1. This seems to work with MKL.
|
|
|
|
set(INTRINSICS "")
|
2019-09-07 01:23:05 +03:00
|
|
|
list(APPEND INTRINSICS_NVCC)
|
|
|
|
|
2019-06-19 02:59:11 +03:00
|
|
|
if(BUILD_ARCH STREQUAL "native")
|
|
|
|
message(STATUS "Checking support for CPU intrinsics")
|
|
|
|
include(FindSSE)
|
|
|
|
if(SSE2_FOUND)
|
|
|
|
message(STATUS "SSE2 support found")
|
|
|
|
set(INTRINSICS "${INTRINSICS} -msse2")
|
2019-09-07 01:23:05 +03:00
|
|
|
list(APPEND INTRINSICS_NVCC -Xcompiler\ -msse2)
|
2019-06-19 02:59:11 +03:00
|
|
|
endif(SSE2_FOUND)
|
|
|
|
if(SSE3_FOUND)
|
|
|
|
message(STATUS "SSE3 support found")
|
|
|
|
set(INTRINSICS "${INTRINSICS} -msse3")
|
2019-09-07 01:23:05 +03:00
|
|
|
list(APPEND INTRINSICS_NVCC -Xcompiler\ -msse3)
|
2019-06-19 02:59:11 +03:00
|
|
|
endif(SSE3_FOUND)
|
|
|
|
if(SSE4_1_FOUND)
|
|
|
|
message(STATUS "SSE4.1 support found")
|
|
|
|
set(INTRINSICS "${INTRINSICS} -msse4.1")
|
2019-09-07 01:23:05 +03:00
|
|
|
list(APPEND INTRINSICS_NVCC -Xcompiler\ -msse4.1)
|
2019-06-19 02:59:11 +03:00
|
|
|
endif(SSE4_1_FOUND)
|
2019-11-07 02:07:12 +03:00
|
|
|
if(SSE4_2_FOUND)
|
|
|
|
message(STATUS "SSE4.2 support found")
|
|
|
|
set(INTRINSICS "${INTRINSICS} -msse4.2")
|
|
|
|
list(APPEND INTRINSICS_NVCC -Xcompiler\ -msse4.2)
|
|
|
|
endif(SSE4_2_FOUND)
|
2019-06-19 02:59:11 +03:00
|
|
|
if(AVX_FOUND)
|
|
|
|
message(STATUS "AVX support found")
|
|
|
|
set(INTRINSICS "${INTRINSICS} -mavx")
|
2019-09-07 01:23:05 +03:00
|
|
|
list(APPEND INTRINSICS_NVCC -Xcompiler\ -mavx)
|
2019-06-19 02:59:11 +03:00
|
|
|
endif(AVX_FOUND)
|
|
|
|
if(AVX2_FOUND)
|
|
|
|
message(STATUS "AVX2 support found")
|
|
|
|
set(INTRINSICS "${INTRINSICS} -mavx2")
|
2019-09-07 01:23:05 +03:00
|
|
|
list(APPEND INTRINSICS_NVCC -Xcompiler\ -mavx2)
|
2019-06-19 02:59:11 +03:00
|
|
|
endif(AVX2_FOUND)
|
|
|
|
if(AVX512_FOUND)
|
|
|
|
message(STATUS "AVX512 support found")
|
|
|
|
set(INTRINSICS "${INTRINSICS} -mavx512f")
|
|
|
|
list(APPEND INTRINSICS_NVCC -Xcompiler\ -mavx512f)
|
|
|
|
endif(AVX512_FOUND)
|
|
|
|
else()
|
|
|
|
set(INTRINSICS "-msse4.1")
|
|
|
|
endif()
|
2018-12-07 08:24:33 +03:00
|
|
|
|
2019-06-19 02:59:11 +03:00
|
|
|
if(USE_FBGEMM)
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} fbgemm dl)
|
|
|
|
add_definitions(-DUSE_FBGEMM=1)
|
|
|
|
endif(USE_FBGEMM)
|
2018-11-29 04:27:12 +03:00
|
|
|
|
2020-03-06 00:08:23 +03:00
|
|
|
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 9.0)
|
|
|
|
# Clang-10.0.0 complains when CUDA is newer than 10.1
|
|
|
|
set(CLANG_IGNORE_UNKNOWN_CUDA "-Wno-unknown-cuda-version")
|
|
|
|
endif()
|
|
|
|
set(DISABLE_GLOBALLY "-Wno-unused-result -Wno-unknown-warning-option ${CLANG_IGNORE_UNKNOWN_CUDA}")
|
2019-06-19 02:59:11 +03:00
|
|
|
|
|
|
|
# These are used in src/CMakeLists.txt on a per-target basis
|
2020-03-06 00:08:23 +03:00
|
|
|
list(APPEND ALL_WARNINGS -Wall; -Werror; -Wextra; -Wno-unused-result; -Wno-deprecated;
|
|
|
|
-Wno-pragmas; -Wno-unused-parameter; -Wno-unused-function;
|
|
|
|
-Wno-unused-value; -Wno-unknown-pragmas; -Wno-sign-compare;
|
|
|
|
-Wno-missing-field-initializers;)
|
2018-11-29 04:27:12 +03:00
|
|
|
|
|
|
|
# This warning does not exist prior to gcc 5.0
|
2018-11-29 06:30:27 +03:00
|
|
|
if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.0)
|
2020-03-06 00:08:23 +03:00
|
|
|
list(APPEND ALL_WARNINGS -Wsuggest-override -Wno-int-in-bool-context)
|
2018-11-29 06:30:27 +03:00
|
|
|
endif()
|
2018-11-29 04:27:12 +03:00
|
|
|
|
2020-03-06 00:08:23 +03:00
|
|
|
if(CMAKE_COMPILER_IS_GNUCC)
|
|
|
|
# these flags are not known to clang
|
|
|
|
set(CMAKE_GCC_FLAGS "-Wl,--no-as-needed")
|
|
|
|
set(CMAKE_RDYNAMIC_FLAG "-rdynamic")
|
|
|
|
endif(CMAKE_COMPILER_IS_GNUCC)
|
|
|
|
|
|
|
|
set(CMAKE_CXX_FLAGS "-std=c++11 -pthread ${CMAKE_GCC_FLAGS} -fPIC ${DISABLE_GLOBALLY} -march=${BUILD_ARCH} ${INTRINSICS}")
|
2020-03-14 03:07:37 +03:00
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -m64 -funroll-loops -g ${CMAKE_RDYNAMIC_FLAG}")
|
2020-03-06 00:08:23 +03:00
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g ${CMAKE_RDYNAMIC_FLAG}")
|
2020-03-14 03:07:37 +03:00
|
|
|
set(CMAKE_CXX_FLAGS_SLIM "-O3 -m64 -funroll-loops -DNDEBUG")
|
2019-08-12 23:12:14 +03:00
|
|
|
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE}")
|
|
|
|
set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE} -pg")
|
2018-10-05 03:48:28 +03:00
|
|
|
set(CMAKE_CXX_FLAGS_PROFGEN "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-generate -fprofile-correction")
|
|
|
|
set(CMAKE_CXX_FLAGS_PROFUSE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-use -fprofile-correction")
|
2019-09-04 00:28:47 +03:00
|
|
|
|
|
|
|
# these need to be set separately
|
2020-03-06 00:08:23 +03:00
|
|
|
set(CMAKE_C_FLAGS "-pthread ${CMAKE_GCC_FLAGS} -fPIC ${DISABLE_GLOBALLY} -march=${BUILD_ARCH} ${INTRINSICS}")
|
2020-03-14 03:07:37 +03:00
|
|
|
set(CMAKE_C_FLAGS_RELEASE "-O3 -m64 -funroll-loops -g ${CMAKE_RDYNAMIC_FLAG}")
|
2020-03-06 00:08:23 +03:00
|
|
|
set(CMAKE_C_FLAGS_DEBUG "-O0 -g ${CMAKE_RDYNAMIC_FLAG}")
|
2020-03-14 03:07:37 +03:00
|
|
|
set(CMAKE_C_FLAGS_SLIM "-O3 -m64 -funroll-loops -DNDEBUG")
|
2019-09-04 00:28:47 +03:00
|
|
|
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE}")
|
|
|
|
set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE} -pg")
|
|
|
|
set(CMAKE_C_FLAGS_PROFGEN "${CMAKE_C_FLAGS_RELEASE} -fprofile-generate -fprofile-correction")
|
|
|
|
set(CMAKE_C_FLAGS_PROFUSE "${CMAKE_C_FLAGS_RELEASE} -fprofile-use -fprofile-correction")
|
2019-06-19 02:59:11 +03:00
|
|
|
endif(MSVC)
|
2017-06-01 01:03:55 +03:00
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
###############################################################################
|
2018-10-08 02:09:29 +03:00
|
|
|
# Downloading SentencePiece if requested and set to compile with it.
|
|
|
|
# Requires all the dependencies imposed by SentencePiece
|
|
|
|
if(USE_SENTENCEPIECE)
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_SENTENCEPIECE")
|
2018-10-08 02:26:32 +03:00
|
|
|
LIST(APPEND CUDA_NVCC_FLAGS -DUSE_SENTENCEPIECE; )
|
2018-11-24 10:12:55 +03:00
|
|
|
set(EXT_LIBS ${EXT_LIBS} sentencepiece sentencepiece_train)
|
2018-10-08 02:09:29 +03:00
|
|
|
endif()
|
|
|
|
|
|
|
|
# Find packages
|
2018-03-03 05:06:26 +03:00
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${CMAKE_DL_LIBS})
|
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
###############################################################################
|
2018-03-03 05:06:26 +03:00
|
|
|
if(COMPILE_CUDA)
|
2018-12-07 07:43:44 +03:00
|
|
|
|
|
|
|
if(USE_STATIC_LIBS)
|
2018-12-10 06:53:57 +03:00
|
|
|
# link statically to stdlib libraries
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
|
|
|
|
|
|
|
|
# look for libraries that have .a suffix
|
2018-12-07 07:43:44 +03:00
|
|
|
set(_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
|
|
|
if(WIN32)
|
|
|
|
list(INSERT CMAKE_FIND_LIBRARY_SUFFIXES 0 .lib .a)
|
|
|
|
else()
|
|
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES .a _static.a)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2019-11-26 04:48:07 +03:00
|
|
|
find_package(CUDA "9.0") # TODO: only enable FP16-related options for compute_70 and higher.
|
2017-07-04 16:06:26 +03:00
|
|
|
if(CUDA_FOUND)
|
2019-07-19 17:13:18 +03:00
|
|
|
# CUDA >= 10.0 requires CMake >= 3.12.2
|
|
|
|
if((CUDA_VERSION VERSION_EQUAL "10.0" OR CUDA_VERSION VERSION_GREATER "10.0") AND (CMAKE_VERSION VERSION_LESS "3.12.2"))
|
2019-08-11 19:08:38 +03:00
|
|
|
message(WARNING "On some Unix systems CUDA 10.0+ requires CMake 3.12.2+; you use CMake ${CMAKE_VERSION}")
|
2019-07-19 17:13:18 +03:00
|
|
|
endif()
|
2020-03-06 00:08:23 +03:00
|
|
|
|
2020-01-06 22:14:00 +03:00
|
|
|
if(COMPILE_CUDA_SM35)
|
|
|
|
LIST(APPEND COMPUTE -arch=sm_35; -gencode=arch=compute_35,code=sm_35;) # Tesla K40 and above
|
|
|
|
endif(COMPILE_CUDA_SM35)
|
|
|
|
if(COMPILE_CUDA_SM50)
|
|
|
|
LIST(APPEND COMPUTE -gencode=arch=compute_50,code=sm_50; -gencode=arch=compute_52,code=sm_52;) # Maxwell GPUs
|
|
|
|
endif(COMPILE_CUDA_SM50)
|
|
|
|
if(COMPILE_CUDA_SM60)
|
|
|
|
LIST(APPEND COMPUTE -gencode=arch=compute_60,code=sm_60; -gencode=arch=compute_61,code=sm_61;) # Pascal GPUs
|
|
|
|
endif(COMPILE_CUDA_SM60)
|
|
|
|
if(COMPILE_CUDA_SM70)
|
|
|
|
LIST(APPEND COMPUTE -gencode=arch=compute_70,code=sm_70; -gencode=arch=compute_70,code=compute_70) # Volta GPUs
|
|
|
|
endif(COMPILE_CUDA_SM70)
|
2019-10-28 23:18:07 +03:00
|
|
|
|
2018-12-07 07:43:44 +03:00
|
|
|
if(USE_STATIC_LIBS)
|
|
|
|
find_library(CUDA_culibos_LIBRARY NAMES culibos PATHS ${CUDA_TOOLKIT_ROOT_DIR}/lib64)
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${CUDA_curand_LIBRARY} ${CUDA_cusparse_LIBRARY} ${CUDA_culibos_LIBRARY} ${CUDA_CUBLAS_LIBRARIES})
|
2019-09-09 23:19:00 +03:00
|
|
|
set(CUDA_LIBS ${CUDA_curand_LIBRARY} ${CUDA_cusparse_LIBRARY} ${CUDA_culibos_LIBRARY} ${CUDA_CUBLAS_LIBRARIES})
|
|
|
|
# CUDA 10.1 introduces cublasLt library that is required on static build
|
|
|
|
if ((CUDA_VERSION VERSION_EQUAL "10.1" OR CUDA_VERSION VERSION_GREATER "10.1"))
|
|
|
|
find_library(CUDA_cublasLt_LIBRARY NAMES cublasLt PATHS ${CUDA_TOOLKIT_ROOT_DIR}/lib64)
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${CUDA_cublasLt_LIBRARY})
|
|
|
|
set(CUDA_LIBS ${CUDA_LIBS} ${CUDA_cublasLt_LIBRARY})
|
|
|
|
endif()
|
|
|
|
message(STATUS "Found CUDA libraries: ${CUDA_LIBS}")
|
2018-12-07 07:43:44 +03:00
|
|
|
else(USE_STATIC_LIBS)
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${CUDA_curand_LIBRARY} ${CUDA_cusparse_LIBRARY} ${CUDA_CUBLAS_LIBRARIES})
|
2018-12-07 08:24:33 +03:00
|
|
|
message(STATUS "Found CUDA libraries: ${CUDA_curand_LIBRARY} ${CUDA_cusparse_LIBRARY} ${CUDA_CUBLAS_LIBRARIES}")
|
2019-07-19 17:13:18 +03:00
|
|
|
endif(USE_STATIC_LIBS)
|
2018-02-25 07:11:02 +03:00
|
|
|
|
|
|
|
if(USE_CUDNN)
|
|
|
|
find_package(CUDNN "7.0")
|
|
|
|
if(CUDNN_FOUND)
|
|
|
|
include_directories(${CUDNN_INCLUDE_DIRS})
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${CUDNN_LIBRARIES})
|
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCUDNN")
|
|
|
|
LIST(APPEND CUDA_NVCC_FLAGS -DCUDNN; )
|
2018-03-01 15:36:27 +03:00
|
|
|
endif(CUDNN_FOUND)
|
|
|
|
endif(USE_CUDNN)
|
2018-06-25 09:07:41 +03:00
|
|
|
|
2018-03-03 05:06:26 +03:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCUDA_FOUND")
|
2018-03-05 04:50:21 +03:00
|
|
|
list(APPEND CUDA_NVCC_FLAGS -DCUDA_FOUND; )
|
2018-09-05 16:42:16 +03:00
|
|
|
|
2018-09-27 16:52:39 +03:00
|
|
|
if(MSVC)
|
2018-09-05 16:42:16 +03:00
|
|
|
list(APPEND CUDA_NVCC_FLAGS -DBOOST_PP_VARIADICS=0; )
|
|
|
|
endif()
|
|
|
|
|
2018-11-23 03:20:05 +03:00
|
|
|
if(USE_NCCL)
|
|
|
|
add_library(nccl STATIC IMPORTED)
|
2018-12-07 03:35:33 +03:00
|
|
|
set(EXT_LIBS ${EXT_LIBS} nccl)
|
2019-02-05 10:07:00 +03:00
|
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_NCCL")
|
|
|
|
LIST(APPEND CUDA_NVCC_FLAGS -DUSE_NCCL; )
|
2018-11-23 03:20:05 +03:00
|
|
|
endif(USE_NCCL)
|
|
|
|
|
2019-07-19 17:13:18 +03:00
|
|
|
if(USE_STATIC_LIBS)
|
|
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
|
|
|
|
endif()
|
2018-12-07 07:43:44 +03:00
|
|
|
|
2018-03-03 05:06:26 +03:00
|
|
|
else(CUDA_FOUND)
|
2019-10-23 20:54:34 +03:00
|
|
|
message("
|
|
|
|
Cannot find suitable CUDA libraries. Specify the path explicitly with
|
|
|
|
-DCUDA_TOOLKIT_ROOT_DIR=/path/to/appropriate/cuda/installation
|
|
|
|
(hint: try /usr/local/$(readlink /usr/local/cuda))
|
|
|
|
OR compile the CPU-only version of Marian with
|
|
|
|
-DCOMPILE_CUDA=off
|
|
|
|
")
|
|
|
|
message(FATAL_ERROR "FATAL ERROR: No suitable CUDA library found.")
|
2017-07-04 16:06:26 +03:00
|
|
|
endif(CUDA_FOUND)
|
|
|
|
|
2018-03-03 05:06:26 +03:00
|
|
|
else(COMPILE_CUDA)
|
|
|
|
message(WARNING "COMPILE_CUDA=off : Building only CPU version")
|
|
|
|
endif(COMPILE_CUDA)
|
|
|
|
|
2019-09-07 01:23:05 +03:00
|
|
|
# TODO: make compatible with older CUDA versions
|
2018-09-27 16:52:39 +03:00
|
|
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
2019-10-28 23:18:07 +03:00
|
|
|
list(APPEND CUDA_NVCC_FLAGS --default-stream per-thread; -O0; -g; --use_fast_math; ${COMPUTE})
|
2017-06-17 22:22:27 +03:00
|
|
|
else(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
2019-10-28 23:18:07 +03:00
|
|
|
list(APPEND CUDA_NVCC_FLAGS --default-stream per-thread; -O3; -g; --use_fast_math; ${COMPUTE})
|
2017-06-17 22:22:27 +03:00
|
|
|
endif(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
2018-09-27 16:52:39 +03:00
|
|
|
if(NOT MSVC)
|
2018-11-29 04:27:12 +03:00
|
|
|
# @TODO: add warnings here too
|
2018-12-15 02:11:34 +03:00
|
|
|
list(APPEND CUDA_NVCC_FLAGS -ccbin ${CMAKE_C_COMPILER}; -std=c++11; -Xcompiler\ -fPIC; -Xcompiler\ -Wno-unused-result; -Xcompiler\ -Wno-deprecated; -Xcompiler\ -Wno-pragmas; -Xcompiler\ -Wno-unused-value; -Xcompiler\ -Werror;)
|
2019-09-07 01:23:05 +03:00
|
|
|
list(APPEND CUDA_NVCC_FLAGS ${INTRINSICS_NVCC})
|
2018-09-12 19:28:36 +03:00
|
|
|
else()
|
|
|
|
list(APPEND CUDA_NVCC_FLAGS -Xcompiler\ /FS; )
|
2018-09-04 17:44:04 +03:00
|
|
|
endif()
|
2017-06-17 22:22:27 +03:00
|
|
|
|
2017-07-04 16:06:26 +03:00
|
|
|
list(REMOVE_DUPLICATES CUDA_NVCC_FLAGS)
|
|
|
|
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
|
2017-06-27 17:20:32 +03:00
|
|
|
|
2018-04-18 18:26:46 +03:00
|
|
|
if(USE_STATIC_LIBS)
|
|
|
|
set(_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
|
|
|
if(WIN32)
|
|
|
|
list(INSERT CMAKE_FIND_LIBRARY_SUFFIXES 0 .lib .a)
|
|
|
|
else()
|
|
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
###############################################################################
|
|
|
|
# Find Tcmalloc
|
2018-09-27 16:52:39 +03:00
|
|
|
if(NOT WIN32)
|
|
|
|
find_package(Tcmalloc)
|
|
|
|
if(Tcmalloc_FOUND)
|
|
|
|
include_directories(${Tcmalloc_INCLUDE_DIR})
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${Tcmalloc_LIBRARIES})
|
|
|
|
else(Tcmalloc_FOUND)
|
|
|
|
message(WARNING "Cannot find TCMalloc library. Continuing.")
|
|
|
|
endif(Tcmalloc_FOUND)
|
2018-09-12 19:28:36 +03:00
|
|
|
endif()
|
2017-11-02 13:33:47 +03:00
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
###############################################################################
|
|
|
|
# Find MPI
|
2018-02-26 09:08:25 +03:00
|
|
|
if(USE_MPI)
|
2018-03-01 15:36:27 +03:00
|
|
|
find_package(MPI 2.0)
|
|
|
|
if(MPI_FOUND)
|
|
|
|
include_directories(${MPI_INCLUDE_PATH})
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${MPI_LIBRARIES})
|
|
|
|
add_definitions(-DMPI_FOUND=1)
|
|
|
|
endif(MPI_FOUND)
|
2018-02-26 09:08:25 +03:00
|
|
|
endif(USE_MPI)
|
2018-01-21 10:06:51 +03:00
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
###############################################################################
|
|
|
|
# Find MKL
|
2018-03-01 15:36:27 +03:00
|
|
|
if(COMPILE_CPU)
|
2020-03-06 00:08:23 +03:00
|
|
|
if(USE_MKL)
|
|
|
|
find_package(MKL)
|
|
|
|
endif(USE_MKL)
|
2018-03-01 15:36:27 +03:00
|
|
|
if(MKL_FOUND)
|
|
|
|
include_directories(${MKL_INCLUDE_DIR})
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${MKL_LIBRARIES})
|
|
|
|
add_definitions(-DBLAS_FOUND=1 -DMKL_FOUND=1)
|
|
|
|
else(MKL_FOUND)
|
2020-03-06 00:08:23 +03:00
|
|
|
set(BLAS_VENDOR "OpenBLAS")
|
2018-03-01 15:36:27 +03:00
|
|
|
find_package(BLAS)
|
|
|
|
if(BLAS_FOUND)
|
2019-02-24 23:29:54 +03:00
|
|
|
include(FindCBLAS)
|
|
|
|
if(CBLAS_FOUND)
|
|
|
|
include_directories(${BLAS_INCLUDE_DIR} ${CBLAS_INCLUDE_DIR})
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${BLAS_LIBRARIES} ${CBLAS_LIBRARIES})
|
|
|
|
add_definitions(-DBLAS_FOUND=1)
|
|
|
|
endif(CBLAS_FOUND)
|
2018-03-01 15:36:27 +03:00
|
|
|
endif(BLAS_FOUND)
|
|
|
|
endif(MKL_FOUND)
|
|
|
|
endif(COMPILE_CPU)
|
2018-02-22 04:44:04 +03:00
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
###############################################################################
|
|
|
|
# Find OpenSSL
|
2019-10-26 03:02:16 +03:00
|
|
|
set(BOOST_COMPONENTS "")
|
2018-04-18 18:26:46 +03:00
|
|
|
if(COMPILE_SERVER)
|
2018-01-09 17:18:57 +03:00
|
|
|
find_package(OpenSSL)
|
|
|
|
if(OpenSSL_FOUND)
|
|
|
|
message(STATUS "Found OpenSSL")
|
|
|
|
include_directories(${OPENSSL_INCLUDE_DIR})
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${OPENSSL_CRYPTO_LIBRARY})
|
2019-10-26 03:02:16 +03:00
|
|
|
set(BOOST_COMPONENTS ${BOOST_COMPONENTS} system)
|
2018-01-09 17:18:57 +03:00
|
|
|
else(OpenSSL_FOUND)
|
|
|
|
message(WARNING "Cannot find OpenSSL library. Not compiling server.")
|
2018-01-13 22:24:03 +03:00
|
|
|
set(COMPILE_SERVER "off")
|
2018-01-09 17:18:57 +03:00
|
|
|
endif(OpenSSL_FOUND)
|
|
|
|
endif(COMPILE_SERVER)
|
2017-08-19 10:01:31 +03:00
|
|
|
|
2018-04-18 18:26:46 +03:00
|
|
|
if(USE_STATIC_LIBS)
|
|
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
|
|
|
|
endif()
|
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
# TODO: move inside if(BOOST_COMPONENTS) ?
|
2018-04-18 18:26:46 +03:00
|
|
|
if(USE_STATIC_LIBS)
|
|
|
|
set(Boost_USE_STATIC_LIBS ON)
|
|
|
|
endif()
|
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
###############################################################################
|
|
|
|
# Find Boost if required
|
2019-10-26 03:02:16 +03:00
|
|
|
if(BOOST_COMPONENTS)
|
|
|
|
find_package(Boost COMPONENTS ${BOOST_COMPONENTS})
|
|
|
|
if(Boost_FOUND)
|
|
|
|
include_directories(${Boost_INCLUDE_DIRS})
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${Boost_LIBRARIES})
|
|
|
|
set(EXT_LIBS ${EXT_LIBS} ${ZLIB_LIBRARIES}) # hack for static compilation
|
|
|
|
else(Boost_FOUND)
|
|
|
|
message(SEND_ERROR "Cannot find Boost libraries. Terminating.")
|
|
|
|
endif(Boost_FOUND)
|
|
|
|
endif(BOOST_COMPONENTS)
|
2017-08-19 15:49:55 +03:00
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
###############################################################################
|
2017-06-14 15:06:20 +03:00
|
|
|
if(COMPILE_TESTS)
|
2017-07-13 15:02:43 +03:00
|
|
|
enable_testing()
|
2017-06-14 15:06:20 +03:00
|
|
|
endif(COMPILE_TESTS)
|
|
|
|
|
2018-02-25 04:56:33 +03:00
|
|
|
if(COMPILE_EXAMPLES)
|
|
|
|
add_definitions(-DCOMPILE_EXAMPLES=1)
|
|
|
|
endif(COMPILE_EXAMPLES)
|
2017-07-04 16:06:26 +03:00
|
|
|
|
2018-10-25 01:24:08 +03:00
|
|
|
# Generate project_version.h to reflect our version number
|
|
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/common/project_version.h.in
|
2018-10-25 04:01:45 +03:00
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/common/project_version.h @ONLY)
|
2017-07-04 16:06:26 +03:00
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
# Generate build_info.cpp with CMake cache variables
|
|
|
|
include(GetCacheVariables)
|
|
|
|
|
|
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/common/build_info.cpp.in
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/common/build_info.cpp @ONLY)
|
|
|
|
|
2018-10-25 01:24:08 +03:00
|
|
|
# Compile source files
|
2016-05-07 23:56:23 +03:00
|
|
|
include_directories(${marian_SOURCE_DIR}/src)
|
|
|
|
add_subdirectory(src)
|
2016-09-16 19:28:00 +03:00
|
|
|
|
2020-03-10 20:29:50 +03:00
|
|
|
###############################################################################
|
2019-10-09 01:54:59 +03:00
|
|
|
if(USE_DOXYGEN)
|
2017-06-14 15:06:20 +03:00
|
|
|
# Add a target to generate API documentation with Doxygen
|
2019-10-09 01:54:59 +03:00
|
|
|
find_package(Doxygen)
|
2019-09-17 23:46:52 +03:00
|
|
|
if(DOXYGEN_FOUND)
|
|
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
|
|
|
|
add_custom_target(doc
|
|
|
|
${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
|
|
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
|
|
COMMENT "Generating API documentation with Doxygen" VERBATIM
|
|
|
|
)
|
|
|
|
endif(DOXYGEN_FOUND)
|
2019-10-09 01:54:59 +03:00
|
|
|
endif(USE_DOXYGEN)
|