https://github.com/Microsoft/CNTK
Raw File
Tip revision: 2a409312994822702b865ca9f7e7ee3a31a35ceb authored by Mark Hillebrand on 18 January 2016, 08:34:43 UTC
License change
Tip revision: 2a40931
CMakeLists.txt
# vim:set expandtab shiftwidth=4 tabstop=4:

cmake_minimum_required(VERSION 2.8)

project(CNTKCMake CXX)

# Enable usage of legacy environment variables (TODO we may not want this)
if(EXISTS "$ENV{BOOST_LIB_PATH}")
    set(BOOST_LIBRARYDIR $ENV{BOOST_LIB_PATH})
endif()

if(EXISTS "$ENV{BOOST_INCLUDE_PATH}")
    set(BOOST_ROOT $ENV{BOOST_INCLUDE_PATH})
endif()

if(EXISTS "$ENV{ACML_PATH}")
    set(ACML_PATH $ENV{ACML_PATH})
endif()

if(EXISTS "$ENV{CUB_PATH}")
    set(CUB_PATH $ENV{CUB_PATH})
endif()

find_package(MPI)
find_package(CUDA 7.0 REQUIRED)

if(WIN32)

add_definitions(-DUNICODE -D_UNICODE)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")

set(CMAKE_CXX_STANDARD 11)

set(NVML_PATH "c:/Program Files/NVIDIA Corporation/GDK/gdk_win7_amd64_release/nvml")

else()

# Note: I'm on an older version on Linux, no CMAKE_CXX_STANDARD ?
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse3 -std=c++0x -std=c++11 -fopenmp -fpermissive -fPIC -Werror -fcheck-new")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse3 -std=c++11 -fpermissive")
# TODO less flags?

# TODO set(NVML_PATH ...)

endif()

set(CMAKE_BUILD_TYPE "Release" "Build Type")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

include_directories(
    Math/Math
    Common/Include
    ${ACML_PATH}/include
    ${MPI_CXX_INCLUDE_PATH}
    ${CUB_PATH}
    ${NVML_PATH}/include
    MachineLearning/CNTK
    MachineLearning/CNTKComputationNetworkLib
    MachineLearning/CNTKSGDLib
    MachineLearning/CNTKSequenceTrainingLib
    BrainScript)

# Note (from FindCUDA): Some standard CMake target calls can be used on the
# target after calling this macro (e.g. set_target_properties and
# target_link_libraries), but setting properties that adjust compilation flags
# will not affect code compiled by nvcc.  Such flags should be modified before
# calling CUDA_ADD_EXECUTABLE, CUDA_ADD_LIBRARY or CUDA_WRAP_SRCS.

add_definitions(-DMATH_EXPORTS)
cuda_add_library(CNTKMathCUDA
    STATIC
    Math/Math/cudalatticeops.cu
    Math/Math/cudalattice.cpp
    Math/Math/cudalib.cpp
    Math/Math/GPUMatrix.cu
    Math/Math/GPUMatrixCUDAKernels.cu
    Math/Math/GPUSparseMatrix.cu
    Math/Math/GPUWatcher.cu
    Math/Math/MatrixQuantizerGPU.cu
    Math/Math/MatrixQuantizer_kernel.cu)
target_link_libraries(CNTKMathCUDA
    ${CUDA_LIBRARIES}
    ${CUDA_CUBLAS_LIBRARIES}
    ${CUDA_cusparse_LIBRARY}
    ${CUDA_curand_LIBRARY})
remove_definitions(-DMATH_EXPORTS)

# TODO add_definitions(-DCPUONLY)

add_library(Common STATIC
    Common/BestGpu.cpp
    Common/ConfigFile.cpp
    Common/DataReader.cpp
    Common/DataWriter.cpp
    Common/DebugUtil.cpp
    Common/Eval.cpp
    Common/File.cpp
    Common/TimerUtility.cpp
    Common/fileutil.cpp)

if(NOT WIN32)
target_link_libraries(Common
    dl)
endif()

add_library(Math SHARED
    Math/Math/CPUMatrix.cpp
    Math/Math/CPUSparseMatrix.cpp
    Math/Math/MatrixQuantizer.cpp
    Math/Math/MatrixQuantizerCPU.cpp
    Math/Math/QuantizedMatrix.cpp
    Math/Math/Matrix.cpp
    Math/Math/CUDAPageLockedMemAllocator.cpp
    Math/Math/NoGPU.cpp)
set_target_properties(Math PROPERTIES
    COMPILE_DEFINITIONS MATH_EXPORTS)

add_library(acml SHARED IMPORTED)

#add_library(nvml SHARED IMPORTED)

if(WIN32)

    #set_target_properties(nvml PROPERTIES
    #IMPORTED_IMPLIB ${NVML_PATH}/lib/nvml.lib)

set_target_properties(acml PROPERTIES
    IMPORTED_LOCATION ${ACML_PATH}/lib/libacml_mp_dll.dll
    IMPORTED_IMPLIB ${ACML_PATH}/lib/libacml_mp_dll.lib)

else()

# TODO NVML

set_target_properties(acml PROPERTIES
    IMPORTED_LOCATION ${ACML_PATH}/lib/libacml.so)

endif()

target_link_libraries(Math
    CNTKMathCUDA
    acml
    Common)

add_library(UCIFastReader SHARED
    DataReader/UCIFastReader/Exports.cpp
    DataReader/UCIFastReader/UCIFastReader.cpp
    DataReader/UCIFastReader/UCIParser.cpp)

target_link_libraries(UCIFastReader
    Common
    Math)

# TODO default on Win anyway:
set_target_properties(UCIFastReader PROPERTIES
    PREFIX "")

add_library(HTKMLFReader SHARED
    DataReader/HTKMLFReader/DataReader.cpp
    DataReader/HTKMLFReader/DataWriter.cpp
    DataReader/HTKMLFReader/HTKMLFReader.cpp
    DataReader/HTKMLFReader/HTKMLFWriter.cpp
    DataReader/HTKMLFReader/fileutil.cpp) # TODO :| expand_wildcards, and possibly diverged implementations

# TODO default on Win anyway:
set_target_properties(HTKMLFReader PROPERTIES
    PREFIX "")

target_link_libraries(HTKMLFReader
    Common
    Math)

add_library(LMSequenceReader SHARED
    DataReader/LMSequenceReader/Exports.cpp
    DataReader/LMSequenceReader/SequenceParser.cpp
    DataReader/LMSequenceReader/SequenceReader.cpp)

target_link_libraries(LMSequenceReader
    Common
    Math)

# TODO default on Win anyway:
set_target_properties(LMSequenceReader PROPERTIES
    PREFIX "")

add_library(LUSequenceReader SHARED
    DataReader/LUSequenceReader/Exports.cpp
    DataReader/LUSequenceReader/LUSequenceParser.cpp
    DataReader/LUSequenceReader/LUSequenceReader.cpp)

target_link_libraries(LUSequenceReader
    Common
    Math)

# TODO default on Win anyway:
set_target_properties(LUSequenceReader PROPERTIES
    PREFIX "")

add_executable(cntk
    MachineLearning/CNTK/CNTK.cpp
    MachineLearning/CNTK/ModelEditLanguage.cpp
    MachineLearning/CNTK/NetworkDescriptionLanguage.cpp
    MachineLearning/CNTK/SimpleNetworkBuilder.cpp
    MachineLearning/CNTK/SynchronousExecutionEngine.cpp
    MachineLearning/CNTK/tests.cpp
    MachineLearning/CNTKComputationNetworkLib/ComputationNode.cpp
    MachineLearning/CNTKComputationNetworkLib/ComputationNetwork.cpp
    MachineLearning/CNTKComputationNetworkLib/ComputationNetworkEvaluation.cpp
    MachineLearning/CNTKComputationNetworkLib/ComputationNetworkAnalysis.cpp
    MachineLearning/CNTKComputationNetworkLib/ComputationNetworkEditing.cpp
    MachineLearning/CNTKComputationNetworkLib/ComputationNetworkBuilder.cpp
    MachineLearning/CNTKComputationNetworkLib/NetworkBuilderFromConfig.cpp
    MachineLearning/CNTKSGDLib/Profiler.cpp
    MachineLearning/CNTKSGDLib/SGD.cpp
    MachineLearning/CNTKSequenceTrainingLib/latticeforwardbackward.cpp
    MachineLearning/CNTKSequenceTrainingLib/parallelforwardbackward.cpp
    BrainScript/BrainScriptEvaluator.cpp
    BrainScript/BrainScriptParser.cpp
    BrainScript/BrainScriptTest.cpp
    MachineLearning/CNTK/ExperimentalNetworkBuilder.cpp
    MachineLearning/CNTKSequenceTrainingLib/latticeNoGPU.cpp
    Common/MPIWrapper.cpp)

link_directories(${ACML_PATH}/lib)

if(WIN32)

set_target_properties(cntk PROPERTIES LINK_FLAGS "/DELAYLOAD:nvml.dll")

target_link_libraries(cntk
    Math
    acml
    #nvml
    "c:/Program Files/NVIDIA Corporation/GDK/gdk_win7_amd64_release/nvml/lib/nvml.lib"
    ${MPI_CXX_LIBRARIES})

# -DCMAKE_EXE_LINKER_FLAGS=" /DELAYLOAD:MyDLL.dll"

else()

# TODO m and pthread required or implicit already?
target_link_libraries(cntk
    Math
    acml
    m
    pthread
    ${MPI_CXX_LIBRARIES})

endif()

if(WIN32)

foreach(dll libacml_mp_dll.dll libifcoremd.dll libiomp5md.dll svml_dispmd.dll libmmd.dll)
    add_custom_command(TARGET cntk POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            ${ACML_PATH}/lib/${dll}
            $<TARGET_FILE_DIR:cntk>)
endforeach(dll)

add_custom_command(TARGET cntk POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${MPI_CXX_LIBRARIES}
        $<TARGET_FILE_DIR:cntk>)

endif()

# CNTK/CNTK.vcxproj:      <Command>if exist "%ProgramW6432%\NVIDIA Corporation\NVSMI" xcopy /I /D /Y "%ProgramW6432%\NVIDIA Corporation\NVSMI\nvml*.dll" $(TargetDir)</Command>

enable_testing()

# Right now, we use Boost only for testing
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost 1.55.0 REQUIRED
  COMPONENTS
  unit_test_framework REQUIRED)

include_directories(${Boost_INCLUDE_DIRS})

add_executable(MathTests
    Tests/UnitTests/MathTests/CPUMatrixTests.cpp
    Tests/UnitTests/MathTests/CPUSparseMatrixTests.cpp)

target_link_libraries(MathTests
    Math
    ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
    acml)

add_test(NAME MathTests COMMAND MathTests)


# Random notes follow

# cmake.org/Wiki/CMake_RPATH_handling
# TODO needs change
#set(CMAKE_SKIP_BUILD_RPATH FALSE)
#set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
#set(CMAKE_INSTALL_RPATH "")
#set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)

# TODO per-target include paths?
# TODO cleanup
# Defined by default:
#set_target_properties(UCIFastReader PROPERTIES
#    COMPILE_DEFINITIONS DATAREADER_EXPORTS)

#message("${MPI_CXX_LINK_FLAGS}")
#message("${MPI_CXX_LIBRARIES}")

#    MPI_<lang>_LINK_FLAGS      Linking flags for MPI programs

#set(BLA_VENDOR ACML_MP)
#find_package(BLAS)
#set(_ACML_ROOT /usr/local/acml5.3.1)
#set(BLAS_LIBRARIES /usr/local/acml5.3.1)
#set(BLAS_ACML_LIB_DIRS /usr/local/acml5.3.1)
#set(BLAS_ACML_MP_LIB_DIRS /usr/local/acml5.3.1)
#set(BLAS_ACML_LIB_DIRS

# CMAKE 3 has more smarts around this
#set_property(TARGET Common PROPERTY CXX_STANDARD_REQUIRED ON)

#add_library(ACML SHARED IMPORTED0
#set_property(TARGET ssl PROPERTY IMPORTED_LOCATION /usr/lib/...)

# TODO
# set(CMAKE_CXX_FLAGS "  ")
# set(BLAS_PATH "/usr/local/acml5.3.1/ifort64")
#if( WIN32 )
#else()

# TODO check out BLAS detection (i) with new version (ii) on Windows.
#Math/Math/Math.vcxproj:      <Command>xcopy /D /I /Y "$(ACML_PATH)\lib\*.dll" $(OutputPath)</Command>
back to top