2015-09-02 18:43:31 +03:00
# Makefile for a Linux/GCC build of CNTK
#
# The Linux and Windows versions are not different branches, but rather build off the same
# source files, using different makefiles. This current makefile has the purpose of enabling
# work to make all sources compile with GCC, and also to check for GCC-compat regressions due to
# modifications which are currently done under Windows.
#
# To use this Makefile, create a directory to build in and make a Config.make in the directory
# that provides
2016-02-29 22:58:13 +03:00
# BUILDTYPE= One of release or debug
# defaults to release
# ACML_PATH= path to ACML library installation
# only needed if MATHLIB=acml
# MKL_PATH= path to MKL library installation
# only needed if MATHLIB=mkl
# GDK_PATH= path to cuda gdk installation, so $(GDK_PATH)/include/nvidia/gdk/nvml.h exists
# defaults to /usr
# MATHLIB= One of acml or mkl
# defaults to acml
# CUDA_PATH= Path to CUDA
# If not specified, GPU will not be enabled
# CUB_PATH= path to NVIDIA CUB installation, so $(CUB_PATH)/cub/cub.cuh exists
# defaults to /usr/local/cub-1.4.1
# CUDNN_PATH= path to NVIDIA cuDNN installation so $(CUDNN_PATH)/cuda/include/cudnn.h exists
# If not specified, CNTK will be be built without cuDNN.
# KALDI_PATH= Path to Kaldi
# If not specified, Kaldi plugins will not be built
# OPENCV_PATH= path to OpenCV 3.0.0 installation, so $(OPENCV_PATH) exists
# defaults to /usr/local/opencv-3.0.0
# LIBZIP_PATH= path to libzip installation, so $(LIBZIP_PATH) exists
# defaults to /usr/local/
# These can be overridden on the command line, e.g. make BUILDTYPE=debug
2015-09-02 18:43:31 +03:00
2016-03-11 21:22:21 +03:00
ARCH = $( shell uname)
2015-09-02 18:43:31 +03:00
i f n d e f B U I L D _ T O P
BUILD_TOP = .
e n d i f
i f n e q ( "$(wildcard $(BUILD_TOP)/Config.make)" , "" )
include $( BUILD_TOP) /Config.make
e l s e
2016-01-22 18:27:50 +03:00
$( error Cannot find $( BUILD_TOP) /Config.make. Please see CNTK Wiki at https://github.com/Microsoft/cntk/wiki for configuration instructions.)
2015-09-02 18:43:31 +03:00
e n d i f
i f n d e f B U I L D T Y P E
$( info Defaulting BUILDTYPE =release )
BUILDTYPE = release
e n d i f
i f n d e f M A T H L I B
$( info DEFAULTING MATHLIB =acml )
MATHLIB = acml
e n d i f
#### Configure based on options above
# The mpic++ wrapper only adds MPI specific flags to the g++ command line.
# The actual compiler/linker flags added can be viewed by running 'mpic++ --showme:compile' and 'mpic++ --showme:link'
CXX = mpic++
2015-12-15 11:58:24 +03:00
SOURCEDIR := Source
2016-02-02 15:31:59 +03:00
INCLUDEPATH := $( addprefix $( SOURCEDIR) /, Common/Include Math CNTK ActionsLib ComputationNetworkLib SGDLib SequenceTrainingLib CNTK/BrainScript Readers/ReaderLib)
2016-02-11 04:50:53 +03:00
# COMMON_FLAGS include settings that are passed both to NVCC and C++ compilers.
COMMON_FLAGS := -D_POSIX_SOURCE -D_XOPEN_SOURCE= 600 -D__USE_XOPEN2K -std= c++11
CPPFLAGS :=
CXXFLAGS := -msse3 -std= c++0x -fopenmp -fpermissive -fPIC -Werror -fcheck-new
2015-09-02 18:43:31 +03:00
LIBPATH :=
LIBS :=
LDFLAGS :=
2015-10-01 01:02:05 +03:00
CXXVER_GE480 := $( shell expr ` $( CXX) -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/' ` \> = 40800)
i f e q ( $( CXXVER_GE 480) , 1 )
CXXFLAGS += -Wno-error= literal-suffix
e n d i f
2015-09-02 18:43:31 +03:00
SEPARATOR = "=-----------------------------------------------------------="
ALL :=
SRC :=
# Make sure all is the first (i.e. default) target, but we can't actually define it
# this early in the file, so let buildall do the work.
all : buildall
# Set up basic nvcc options and add CUDA targets from above
2016-02-11 04:50:53 +03:00
CUFLAGS = -m 64
2015-09-02 18:43:31 +03:00
i f d e f C U D A _ P A T H
ifndef GDK_PATH
$( info defaulting GDK_PATH to /usr)
GDK_PATH = /usr
2015-10-13 02:36:40 +03:00
endif
ifndef CUB_PATH
$( info defaulting CUB_PATH to /usr/local/cub-1.4.1)
CUB_PATH = /usr/local/cub-1.4.1
endif
2015-09-02 18:43:31 +03:00
DEVICE = gpu
NVCC = $( CUDA_PATH) /bin/nvcc
# This is a suggested/default location for NVML
INCLUDEPATH += $( GDK_PATH) /include/nvidia/gdk
2015-10-13 02:36:40 +03:00
INCLUDEPATH += $( CUB_PATH)
2015-09-02 18:43:31 +03:00
NVMLPATH = $( GDK_PATH) /src/gdk/nvml/lib
# Set up CUDA includes and libraries
INCLUDEPATH += $( CUDA_PATH) /include
LIBPATH += $( CUDA_PATH) /lib64
LIBS += -lcublas -lcudart -lcuda -lcurand -lcusparse -lnvidia-ml
2015-11-17 23:58:19 +03:00
# Set up cuDNN if needed
ifdef CUDNN_PATH
INCLUDEPATH += $( CUDNN_PATH) /cuda/include
LIBPATH += $( CUDNN_PATH) /cuda/lib64
LIBS += -lcudnn
2016-02-11 04:50:53 +03:00
COMMON_FLAGS += -DUSE_CUDNN
2015-11-17 23:58:19 +03:00
endif
2015-09-02 18:43:31 +03:00
e l s e
DEVICE = cpu
2016-02-11 04:50:53 +03:00
COMMON_FLAGS += -DCPUONLY
2015-09-02 18:43:31 +03:00
e n d i f
i f e q ( "$(MATHLIB)" , "acml" )
INCLUDEPATH += $( ACML_PATH) /include
LIBPATH += $( ACML_PATH) /lib
2015-11-04 18:23:02 +03:00
LIBS += -lacml_mp -liomp5 -lm -lpthread
2016-02-11 04:50:53 +03:00
COMMON_FLAGS += -DUSE_ACML
2015-09-02 18:43:31 +03:00
e n d i f
i f e q ( "$(MATHLIB)" , "mkl" )
INCLUDEPATH += $( MKL_PATH) /mkl/include
LIBPATH += $( MKL_PATH) /compiler/lib/intel64 $( MKL_PATH) /mkl/lib/intel64 $( MKL_PATH) /compiler/lib/mic $( MKL_PATH) /mkl/lib/mic
LIBS += -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lm -liomp5 -lpthread
2016-02-11 04:50:53 +03:00
COMMON_FLAGS += -DUSE_MKL
2015-09-02 18:43:31 +03:00
e n d i f
2016-01-30 02:44:37 +03:00
i f e q ( "$(MATHLIB)" , "openblas" )
INCLUDEPATH += $( OPENBLAS_PATH) /include
LIBPATH += $( OPENBLAS_PATH) /lib
LIBS += -lopenblas -lm -lpthread
CPPFLAGS += -DUSE_OPENBLAS
e n d i f
2015-09-02 18:43:31 +03:00
i f d e f K A L D I _ P A T H
########## Copy includes and defines from $(KALDI_PATH)/src/kaldi.mk ##########
FSTROOT = $( KALDI_PATH) /tools/openfst
ATLASINC = $( KALDI_PATH) /tools/ATLAS/include
INCLUDEPATH += $( KALDI_PATH) /src $( ATLASINC) $( FSTROOT) /include
CPPFLAGS += -DKALDI_DOUBLEPRECISION= 0 -DHAVE_POSIX_MEMALIGN -DHAVE_EXECINFO_H= 1 -DHAVE_CXXABI_H -DHAVE_ATLAS -DHAVE_OPENFST_GE_10400
KALDI_LIBPATH += $( KALDI_PATH) /src/lib
KALDI_LIBS += -lkaldi-util -lkaldi-matrix -lkaldi-base -lkaldi-hmm -lkaldi-cudamatrix -lkaldi-nnet -lkaldi-lat
e n d i f
2015-09-03 22:17:17 +03:00
# Set up nvcc target architectures (will generate code to support them all, i.e. fat-binary, in release mode)
# In debug mode we will rely on JIT to create code "on the fly" for the underlying architecture
GENCODE_SM20 := -gencode arch = compute_20,code= \" sm_20,compute_20\"
GENCODE_SM30 := -gencode arch = compute_30,code= \" sm_30,compute_30\"
GENCODE_SM35 := -gencode arch = compute_35,code= \" sm_35,compute_35\"
GENCODE_SM50 := -gencode arch = compute_50,code= \" sm_50,compute_50\"
2015-09-02 18:43:31 +03:00
i f e q ( "$(BUILDTYPE)" , "debug" )
2015-09-18 02:57:26 +03:00
ifdef CNTK_CUDA_CODEGEN_DEBUG
GENCODE_FLAGS := $( CNTK_CUDA_CODEGEN_DEBUG)
else
2016-02-16 23:11:51 +03:00
GENCODE_FLAGS := -gencode arch = compute_20,code= \" compute_20\" $( GENCODE_SM30)
2015-09-18 02:57:26 +03:00
endif
2015-09-02 18:43:31 +03:00
CXXFLAGS += -g
2015-11-26 04:20:56 +03:00
LDFLAGS += -rdynamic
2016-03-01 22:02:18 +03:00
COMMON_FLAGS += -D_DEBUG -DNO_SYNC
2016-01-09 03:41:45 +03:00
CUFLAGS += -O0 -g -use_fast_math -lineinfo $( GENCODE_FLAGS)
2015-09-02 18:43:31 +03:00
e n d i f
i f e q ( "$(BUILDTYPE)" , "release" )
2015-09-18 02:57:26 +03:00
ifdef CNTK_CUDA_CODEGEN_RELEASE
GENCODE_FLAGS := $( CNTK_CUDA_CODEGEN_RELEASE)
else
GENCODE_FLAGS := $( GENCODE_SM20) $( GENCODE_SM30) $( GENCODE_SM35) $( GENCODE_SM50)
endif
2016-01-26 08:55:48 +03:00
CXXFLAGS += -g -O4
LDFLAGS += -rdynamic
2016-03-01 21:35:21 +03:00
COMMON_FLAGS += -DNDEBUG -DNO_SYNC
2016-01-26 08:56:18 +03:00
CUFLAGS += -O3 -g -use_fast_math -lineinfo $( GENCODE_FLAGS)
2015-09-02 18:43:31 +03:00
e n d i f
2015-10-25 00:31:34 +03:00
i f d e f C N T K _ C U D A _ D E V I C E _ D E B U G I N F O
CUFLAGS += -G
e n d i f
2015-09-02 18:43:31 +03:00
#######
OBJDIR := $( BUILD_TOP) /.build
BINDIR := $( BUILD_TOP) /bin
LIBDIR := $( BUILD_TOP) /lib
ORIGINLIBDIR := '$$ORIGIN/../lib'
ORIGINDIR := '$$ORIGIN'
CNTKMATH := cntkmath
2015-11-25 03:38:37 +03:00
########################################
2015-12-15 11:58:24 +03:00
# Build info
2015-11-25 03:38:37 +03:00
########################################
2015-12-15 11:58:24 +03:00
BUILDINFO := $( SOURCEDIR) /CNTK/buildinfo.h
2015-12-16 17:24:49 +03:00
GENBUILD := Tools/generate_build_info
2015-11-25 03:38:37 +03:00
2016-03-11 21:22:21 +03:00
BUILDINFO_OUTPUT := $( shell $( GENBUILD) $( BUILD_TOP) /Config.make && echo Success)
i f n e q ( "$(BUILDINFO_OUTPUT)" , "Success" )
$( error Could not generate $( BUILDINFO) )
e n d i f
2015-11-25 03:38:37 +03:00
2015-09-02 18:43:31 +03:00
########################################
# Math library
########################################
# Define all sources that need to be built
2016-01-25 18:49:09 +03:00
READER_SRC = \
2016-02-02 15:31:59 +03:00
$( SOURCEDIR) /Readers/ReaderLib/BlockRandomizer.cpp \
2016-02-19 18:38:42 +03:00
$( SOURCEDIR) /Readers/ReaderLib/Bundler.cpp \
2016-02-02 15:31:59 +03:00
$( SOURCEDIR) /Readers/ReaderLib/NoRandomizer.cpp \
$( SOURCEDIR) /Readers/ReaderLib/ReaderShim.cpp \
2016-03-07 18:06:40 +03:00
$( SOURCEDIR) /Readers/ReaderLib/ChunkRandomizer.cpp \
$( SOURCEDIR) /Readers/ReaderLib/SequenceRandomizer.cpp \
2016-03-16 19:21:38 +03:00
$( SOURCEDIR) /Readers/ReaderLib/SequencePacker.cpp \
2016-03-30 14:06:08 +03:00
$( SOURCEDIR) /Readers/ReaderLib/BpttPacker.cpp \
$( SOURCEDIR) /Readers/ReaderLib/PackerBase.cpp \
2016-04-07 15:34:42 +03:00
$( SOURCEDIR) /Readers/ReaderLib/FramePacker.cpp \
2016-01-25 18:49:09 +03:00
2015-09-02 18:43:31 +03:00
COMMON_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Common/Config.cpp \
$( SOURCEDIR) /Common/DataReader.cpp \
$( SOURCEDIR) /Common/DataWriter.cpp \
2016-02-18 18:35:10 +03:00
$( SOURCEDIR) /Common/ExceptionWithCallStack.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Common/Eval.cpp \
$( SOURCEDIR) /Common/File.cpp \
$( SOURCEDIR) /Common/TimerUtility.cpp \
$( SOURCEDIR) /Common/fileutil.cpp \
2015-09-02 18:43:31 +03:00
MATH_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/CPUMatrix.cpp \
$( SOURCEDIR) /Math/CPUSparseMatrix.cpp \
2016-01-05 21:42:38 +03:00
$( SOURCEDIR) /Math/MatrixQuantizerImpl.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/MatrixQuantizerCPU.cpp \
$( SOURCEDIR) /Math/QuantizedMatrix.cpp \
$( SOURCEDIR) /Math/Matrix.cpp \
$( SOURCEDIR) /Math/TensorView.cpp \
$( SOURCEDIR) /Math/CUDAPageLockedMemAllocator.cpp \
$( SOURCEDIR) /Math/ConvolutionEngine.cpp \
2016-03-26 01:59:41 +03:00
$( SOURCEDIR) /Math/BatchNormalizationEngine.cpp \
2015-09-02 18:43:31 +03:00
i f d e f C U D A _ P A T H
MATH_SRC += \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/GPUMatrix.cu \
2015-12-29 07:03:50 +03:00
$( SOURCEDIR) /Math/GPUTensor.cu \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/GPUSparseMatrix.cu \
$( SOURCEDIR) /Math/GPUWatcher.cu \
$( SOURCEDIR) /Math/MatrixQuantizerGPU.cu \
2016-03-26 01:59:41 +03:00
$( SOURCEDIR) /Math/CuDnnCommon.cu \
2016-02-11 04:50:53 +03:00
$( SOURCEDIR) /Math/CuDnnConvolutionEngine.cu \
2016-03-26 01:59:41 +03:00
$( SOURCEDIR) /Math/CuDnnBatchNormalization.cu \
2016-01-07 06:00:13 +03:00
$( SOURCEDIR) /Math/GPUDataTransferer.cpp \
2015-09-02 18:43:31 +03:00
e l s e
MATH_SRC += \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/NoGPU.cpp
2015-09-02 18:43:31 +03:00
e n d i f
MATH_SRC += $( COMMON_SRC)
2016-01-25 18:49:09 +03:00
MATH_SRC += $( READER_SRC)
2015-09-02 18:43:31 +03:00
MATH_OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( MATH_SRC) ) )
CNTKMATH_LIB := $( LIBDIR) /lib$( CNTKMATH) .so
ALL += $( CNTKMATH_LIB)
SRC += $( MATH_SRC)
RPATH = -Wl,-rpath,
$(CNTKMATH_LIB) : $( MATH_OBJ )
@echo $( SEPARATOR)
2015-12-15 11:58:24 +03:00
@echo creating $@ for $( ARCH) with build type $( BUILDTYPE)
2015-09-02 18:43:31 +03:00
@mkdir -p $( dir $@ )
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBPATH) $( NVMLPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ $( LIBS) -fopenmp
########################################
# BinaryReader plugin
########################################
BINARYREADER_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/BinaryReader/BinaryFile.cpp \
$( SOURCEDIR) /Readers/BinaryReader/BinaryReader.cpp \
$( SOURCEDIR) /Readers/BinaryReader/BinaryWriter.cpp \
2015-09-02 18:43:31 +03:00
BINARYREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( BINARYREADER_SRC) )
BINARY_READER := $( LIBDIR) /BinaryReader.so
#ALL += $(BINARY_READER)
#SRC+=$(BINARYREADER_SRC)
$(BINARY_READER) : $( BINARYREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
########################################
# HTKMLFReader plugin
########################################
HTKMLFREADER_SRC = \
2016-02-29 06:01:07 +03:00
$( SOURCEDIR) /Readers/HTKMLFReader/Exports.cpp \
$( SOURCEDIR) /Readers/HTKMLFReader/DataWriterLocal.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/HTKMLFReader/HTKMLFReader.cpp \
$( SOURCEDIR) /Readers/HTKMLFReader/HTKMLFWriter.cpp \
2015-09-02 18:43:31 +03:00
2015-12-15 11:58:24 +03:00
HTKMLFREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( HTKMLFREADER_SRC) )
2015-09-02 18:43:31 +03:00
2015-12-15 11:58:24 +03:00
HTKMLFREADER := $( LIBDIR) /HTKMLFReader.so
ALL += $( HTKMLFREADER)
SRC += $( HTKMLFREADER_SRC)
2015-09-02 18:43:31 +03:00
2015-12-15 11:58:24 +03:00
$(LIBDIR)/HTKMLFReader.so : $( HTKMLFREADER_OBJ ) | $( CNTKMATH_LIB )
2015-09-02 18:43:31 +03:00
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2016-02-19 18:38:42 +03:00
########################################
# ExperimentalHTKMLFReader plugin
########################################
EXPERIMENTALHTKMLFREADER_SRC = \
2016-03-01 08:27:49 +03:00
$( SOURCEDIR) /Readers/HTKMLFReader/DataWriterLocal.cpp \
2016-02-19 18:38:42 +03:00
$( SOURCEDIR) /Readers/HTKMLFReader/HTKMLFWriter.cpp \
$( SOURCEDIR) /Readers/ExperimentalHTKMLFReader/ConfigHelper.cpp \
2016-03-01 08:27:49 +03:00
$( SOURCEDIR) /Readers/ExperimentalHTKMLFReader/Exports.cpp \
2016-02-19 18:38:42 +03:00
$( SOURCEDIR) /Readers/ExperimentalHTKMLFReader/HTKDataDeserializer.cpp \
$( SOURCEDIR) /Readers/ExperimentalHTKMLFReader/HTKMLFReader.cpp \
$( SOURCEDIR) /Readers/ExperimentalHTKMLFReader/MLFDataDeserializer.cpp \
EXPERIMENTALHTKMLFREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( EXPERIMENTALHTKMLFREADER_SRC) )
EXPERIMENTALHTKMLFREADER := $( LIBDIR) /ExperimentalHTKMLFReader.so
ALL += $( EXPERIMENTALHTKMLFREADER)
SRC += $( EXPERIMENTALHTKMLFREADER_SRC)
$(LIBDIR)/ExperimentalHTKMLFReader.so : $( EXPERIMENTALHTKMLFREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2015-09-02 18:43:31 +03:00
########################################
# LMSequenceReader plugin
########################################
LMSEQUENCEREADER_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/LMSequenceReader/Exports.cpp \
$( SOURCEDIR) /Readers/LMSequenceReader/SequenceParser.cpp \
$( SOURCEDIR) /Readers/LMSequenceReader/SequenceReader.cpp \
2015-12-15 15:39:43 +03:00
$( SOURCEDIR) /Readers/LMSequenceReader/SequenceWriter.cpp \
2015-09-02 18:43:31 +03:00
LMSEQUENCEREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( LMSEQUENCEREADER_SRC) )
LMSEQUENCEREADER := $( LIBDIR) /LMSequenceReader.so
ALL += $( LMSEQUENCEREADER)
SRC += $( LMSEQUENCEREADER_SRC)
$(LMSEQUENCEREADER) : $( LMSEQUENCEREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
########################################
# LUSequenceReader plugin
########################################
LUSEQUENCEREADER_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/LUSequenceReader/Exports.cpp \
2016-02-29 06:01:07 +03:00
$( SOURCEDIR) /Readers/LUSequenceReader/DataWriterLocal.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/LUSequenceReader/LUSequenceParser.cpp \
$( SOURCEDIR) /Readers/LUSequenceReader/LUSequenceReader.cpp \
2016-03-24 21:33:14 +03:00
$( SOURCEDIR) /Readers/LUSequenceReader/LUSequenceWriter.cpp \
2015-09-02 18:43:31 +03:00
LUSEQUENCEREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( LUSEQUENCEREADER_SRC) )
LUSEQUENCEREADER := $( LIBDIR) /LUSequenceReader.so
ALL += $( LUSEQUENCEREADER)
SRC += $( LUSEQUENCEREADER_SRC)
$(LUSEQUENCEREADER) : $( LUSEQUENCEREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
########################################
# UCIFastReader plugin
########################################
UCIFASTREADER_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/UCIFastReader/Exports.cpp \
$( SOURCEDIR) /Readers/UCIFastReader/UCIFastReader.cpp \
$( SOURCEDIR) /Readers/UCIFastReader/UCIParser.cpp \
2015-09-02 18:43:31 +03:00
UCIFASTREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( UCIFASTREADER_SRC) )
UCIFASTREADER := $( LIBDIR) /UCIFastReader.so
ALL += $( UCIFASTREADER)
SRC += $( UCIFASTREADER_SRC)
$(UCIFASTREADER) : $( UCIFASTREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2015-12-16 20:53:10 +03:00
########################################
# LibSVMBinaryReader plugin
########################################
LIBSVMBINARYREADER_SRC = \
$( SOURCEDIR) /Readers/LibSVMBinaryReader/Exports.cpp \
$( SOURCEDIR) /Readers/LibSVMBinaryReader/LibSVMBinaryReader.cpp \
LIBSVMBINARYREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( LIBSVMBINARYREADER_SRC) )
LIBSVMBINARYREADER := $( LIBDIR) /LibSVMBinaryReader.so
ALL += $( LIBSVMBINARYREADER)
SRC += $( LIBSVMBINARYREADER_SRC)
$(LIBSVMBINARYREADER) : $( LIBSVMBINARYREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2016-01-29 18:58:34 +03:00
########################################
# SparsePCReader plugin
########################################
SPARSEPCREADER_SRC = \
$( SOURCEDIR) /Readers/SparsePCReader/Exports.cpp \
$( SOURCEDIR) /Readers/SparsePCReader/SparsePCReader.cpp \
2016-02-02 17:45:50 +03:00
SPARSEPCREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( SPARSEPCREADER_SRC) )
2016-01-29 18:58:34 +03:00
2016-02-02 17:45:50 +03:00
SPARSEPCREADER := $( LIBDIR) /SparsePCReader.so
ALL += $( SPARSEPCREADER)
SRC += $( SPARSEPCREADER_SRC)
2016-01-29 18:58:34 +03:00
2016-02-02 17:45:50 +03:00
$(SPARSEPCREADER) : $( SPARSEPCREADER_OBJ ) | $( CNTKMATH_LIB )
2016-01-29 18:58:34 +03:00
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2016-03-17 17:11:44 +03:00
########################################
# CNTKTextFormatReader plugin
########################################
CNTKTEXTFORMATREADER_SRC = \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/Exports.cpp \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/Indexer.cpp \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/TextParser.cpp \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/CNTKTextFormatReader.cpp \
$( SOURCEDIR) /Readers/CNTKTextFormatReader/TextConfigHelper.cpp \
CNTKTEXTFORMATREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( CNTKTEXTFORMATREADER_SRC) )
CNTKTEXTFORMATREADER := $( LIBDIR) /CNTKTextFormatReader.so
ALL += $( CNTKTEXTFORMATREADER)
SRC += $( CNTKTEXTFORMATREADER_SRC)
$(CNTKTEXTFORMATREADER) : $( CNTKTEXTFORMATREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH)
2015-09-02 18:43:31 +03:00
########################################
# Kaldi plugins
########################################
i f d e f K A L D I _ P A T H
KALDI2READER_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Readers/Kaldi2Reader/DataReader.cpp \
$( SOURCEDIR) /Readers/Kaldi2Reader/DataWriter.cpp \
$( SOURCEDIR) /Readers/Kaldi2Reader/HTKMLFReader.cpp \
$( SOURCEDIR) /Readers/Kaldi2Reader/HTKMLFWriter.cpp \
$( SOURCEDIR) /Readers/Kaldi2Reader/KaldiSequenceTrainingDerivative.cpp \
$( SOURCEDIR) /Readers/Kaldi2Reader/UtteranceDerivativeBuffer.cpp \
2015-09-02 18:43:31 +03:00
KALDI2READER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( KALDI2READER_SRC) )
KALDI2READER := $( LIBDIR) /Kaldi2Reader.so
ALL += $( KALDI2READER)
SRC += $( KALDI2READER_SRC)
2015-08-11 23:58:18 +03:00
$(KALDI2READER) : $( KALDI 2READER_OBJ ) | $( CNTKMATH_LIB )
2015-09-02 18:43:31 +03:00
@echo $( SEPARATOR)
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( KALDI_LIBPATH) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( KALDI_LIBPATH) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH) $( KALDI_LIBS)
e n d i f
2015-10-13 22:02:35 +03:00
########################################
# ImageReader plugin
########################################
i f d e f O P E N C V _ P A T H
2016-02-20 04:41:40 +03:00
2016-02-23 05:21:10 +03:00
IMAGE_READER_LIBS += -lopencv_core -lopencv_imgproc -lopencv_imgcodecs
2016-02-20 04:41:40 +03:00
i f d e f L I B Z I P _ P A T H
CPPFLAGS += -DUSE_ZIP
INCLUDEPATH += $( LIBZIP_PATH) /lib/libzip/include
2016-02-23 05:21:10 +03:00
IMAGE_READER_LIBS += -lzip
2016-02-20 04:41:40 +03:00
e n d i f
2015-10-13 22:02:35 +03:00
IMAGEREADER_SRC = \
2016-02-25 21:48:13 +03:00
$( SOURCEDIR) /Readers/ImageReader/Exports.cpp \
$( SOURCEDIR) /Readers/ImageReader/ImageConfigHelper.cpp \
$( SOURCEDIR) /Readers/ImageReader/ImageDataDeserializer.cpp \
$( SOURCEDIR) /Readers/ImageReader/ImageTransformers.cpp \
$( SOURCEDIR) /Readers/ImageReader/ImageReader.cpp \
$( SOURCEDIR) /Readers/ImageReader/ZipByteReader.cpp \
2015-12-15 11:58:24 +03:00
2015-10-13 22:02:35 +03:00
IMAGEREADER_OBJ := $( patsubst %.cpp, $( OBJDIR) /%.o, $( IMAGEREADER_SRC) )
IMAGEREADER := $( LIBDIR) /ImageReader.so
ALL += $( IMAGEREADER)
SRC += $( IMAGEREADER_SRC)
2015-12-03 21:52:05 +03:00
INCLUDEPATH += $( OPENCV_PATH) /include
2016-02-01 15:10:43 +03:00
LIBPATH += $( OPENCV_PATH) /lib $( OPENCV_PATH) /release/lib
2015-12-03 21:52:05 +03:00
2015-10-13 22:02:35 +03:00
$(IMAGEREADER) : $( IMAGEREADER_OBJ ) | $( CNTKMATH_LIB )
@echo $( SEPARATOR)
2016-02-23 05:21:10 +03:00
$( CXX) $( LDFLAGS) -shared $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINDIR) $( LIBPATH) ) -o $@ $^ -l$( CNTKMATH) $( IMAGE_READER_LIBS)
2015-10-13 22:02:35 +03:00
e n d i f
2016-01-14 01:29:19 +03:00
########################################
# 1bit SGD setup
########################################
i f e q ( "$(CNTK_ENABLE_1BitSGD)" , "true" )
2016-01-29 15:05:12 +03:00
i f e q ( , $( wildcard Source /1BitSGD /*.h ) )
$( error Build with 1bit-SGD was requested but cannot find the code. Please check https://github.com/Microsoft/CNTK/wiki/Enabling-1bit-SGD for instructions)
e n d i f
2016-01-14 01:29:19 +03:00
INCLUDEPATH += $( SOURCEDIR) /1BitSGD
2016-02-11 04:50:53 +03:00
COMMON_FLAGS += -DQUANTIZED_GRADIENT_AGGREGATION
2016-01-14 01:29:19 +03:00
e n d i f
2015-09-02 18:43:31 +03:00
########################################
# cntk
########################################
CNTK_SRC = \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /CNTK/CNTK.cpp \
$( SOURCEDIR) /CNTK/ModelEditLanguage.cpp \
$( SOURCEDIR) /CNTK/tests.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNode.cpp \
2016-03-22 07:34:41 +03:00
$( SOURCEDIR) /ComputationNetworkLib/ComputationNodeScripting.cpp \
2016-04-04 03:03:35 +03:00
$( SOURCEDIR) /ComputationNetworkLib/InputAndParamNodes.cpp \
2016-03-12 03:57:14 +03:00
$( SOURCEDIR) /ComputationNetworkLib/ReshapingNodes.cpp \
2016-04-03 09:29:40 +03:00
$( SOURCEDIR) /ComputationNetworkLib/SpecialPurposeNodes.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetwork.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetworkEvaluation.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetworkAnalysis.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetworkEditing.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetworkBuilder.cpp \
$( SOURCEDIR) /ComputationNetworkLib/ComputationNetworkScripting.cpp \
$( SOURCEDIR) /SGDLib/Profiler.cpp \
$( SOURCEDIR) /SGDLib/SGD.cpp \
$( SOURCEDIR) /ActionsLib/TrainActions.cpp \
$( SOURCEDIR) /ActionsLib/EvalActions.cpp \
$( SOURCEDIR) /ActionsLib/OtherActions.cpp \
2016-01-22 20:42:57 +03:00
$( SOURCEDIR) /ActionsLib/SpecialPurposeActions.cpp \
2016-03-22 07:34:41 +03:00
$( SOURCEDIR) /ActionsLib/NetworkFactory.cpp \
2016-03-10 11:19:54 +03:00
$( SOURCEDIR) /ActionsLib/NetworkDescriptionLanguage.cpp \
$( SOURCEDIR) /ActionsLib/SimpleNetworkBuilder.cpp \
2016-03-11 16:31:27 +03:00
$( SOURCEDIR) /ActionsLib/NDLNetworkBuilder.cpp \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /SequenceTrainingLib/latticeforwardbackward.cpp \
$( SOURCEDIR) /SequenceTrainingLib/parallelforwardbackward.cpp \
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptEvaluator.cpp \
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptParser.cpp \
$( SOURCEDIR) /CNTK/BrainScript/BrainScriptTest.cpp \
$( SOURCEDIR) /CNTK/BrainScript/ExperimentalNetworkBuilder.cpp \
$( SOURCEDIR) /Common/BestGpu.cpp \
$( SOURCEDIR) /Common/MPIWrapper.cpp \
2015-09-02 18:43:31 +03:00
2015-09-26 03:22:58 +03:00
i f d e f C U D A _ P A T H
CNTK_SRC += \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /Math/cudalatticeops.cu \
$( SOURCEDIR) /Math/cudalattice.cpp \
$( SOURCEDIR) /Math/cudalib.cpp \
2015-09-26 03:22:58 +03:00
e l s e
CNTK_SRC += \
2015-12-15 11:58:24 +03:00
$( SOURCEDIR) /SequenceTrainingLib/latticeNoGPU.cpp \
2015-09-26 03:22:58 +03:00
e n d i f
CNTK_OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( CNTK_SRC) ) )
2015-09-02 18:43:31 +03:00
CNTK := $( BINDIR) /cntk
ALL += $( CNTK)
2016-03-29 10:19:00 +03:00
SRC += $( CNTK_SRC)
2015-09-02 18:43:31 +03:00
2016-03-29 10:19:00 +03:00
$(CNTK) : $( CNTK_OBJ ) | $( CNTKMATH_LIB )
2015-09-02 18:43:31 +03:00
@echo $( SEPARATOR)
@mkdir -p $( dir $@ )
@echo building output for $( ARCH) with build type $( BUILDTYPE)
2015-11-26 15:34:37 +03:00
$( CXX) $( LDFLAGS) $( patsubst %,-L%, $( LIBDIR) $( LIBPATH) $( NVMLPATH) ) $( patsubst %,$( RPATH) %, $( ORIGINLIBDIR) $( LIBPATH) ) -o $@ $^ $( LIBS) -l$( CNTKMATH) -fopenmp
2015-09-02 18:43:31 +03:00
2016-03-07 04:40:58 +03:00
# deployable resources: standard library of BS
2016-03-06 11:25:39 +03:00
CNTK_CORE_BS := $( BINDIR) /cntk.core.bs
ALL += $( CNTK_CORE_BS)
$(CNTK_CORE_BS) : $( SOURCEDIR ) /CNTK /BrainScript /CNTKCoreLib /CNTK .core .bs
2016-03-07 04:40:58 +03:00
@mkdir -p $( dir $@ )
@echo bin-placing deployable resource files
2016-03-06 08:27:04 +03:00
cp -f $^ $@
2015-09-02 18:43:31 +03:00
########################################
# General compile and dependency rules
########################################
VPATH := $( sort $( dir $( SRC) ) )
# Define object files
OBJ := $( patsubst %.cu, $( OBJDIR) /%.o, $( patsubst %.cpp, $( OBJDIR) /%.o, $( SRC) ) )
# C++ include dependencies generated by -MF compiler option
DEP := $( patsubst %.o, %.d, $( OBJ) )
# Include all C++ dependencies, like header files, to ensure that a change in those
# will result in the rebuild.
- i n c l u d e $ { D E P }
2016-04-11 11:19:45 +03:00
$(OBJDIR)/%.o : %.cu Makefile $( BUILD_TOP ) /Config .make
2015-09-02 18:43:31 +03:00
@echo $( SEPARATOR)
2015-12-15 11:58:24 +03:00
@echo creating $@ for $( ARCH) with build type $( BUILDTYPE)
2015-09-02 18:43:31 +03:00
@mkdir -p $( dir $@ )
2016-02-11 04:50:53 +03:00
$( NVCC) -c $< -o $@ $( COMMON_FLAGS) $( CUFLAGS) $( INCLUDEPATH:%= -I%) -Xcompiler "-fPIC -Werror"
2015-09-02 18:43:31 +03:00
2016-04-11 11:19:45 +03:00
$(OBJDIR)/%.o : %.cpp Makefile $( BUILD_TOP ) /Config .make
2015-09-02 18:43:31 +03:00
@echo $( SEPARATOR)
2015-12-15 11:58:24 +03:00
@echo creating $@ for $( ARCH) with build type $( BUILDTYPE)
2015-09-02 18:43:31 +03:00
@mkdir -p $( dir $@ )
2016-02-11 04:50:53 +03:00
$( CXX) -c $< -o $@ $( COMMON_FLAGS) $( CPPFLAGS) $( CXXFLAGS) $( INCLUDEPATH:%= -I%) -MD -MP -MF ${ @ : .o=.d }
2015-09-02 18:43:31 +03:00
2016-03-11 21:22:21 +03:00
.PHONY : clean buildall all
2015-09-02 18:43:31 +03:00
clean :
@echo $( SEPARATOR)
@rm -rf $( OBJDIR)
@rm -rf $( ALL)
2016-02-01 22:16:08 +03:00
@rm -rf $( BUILDINFO)
2015-12-15 11:58:24 +03:00
@echo finished cleaning up the project
2015-09-02 18:43:31 +03:00
buildall : $( ALL )
@echo $( SEPARATOR)
@echo finished building for $( ARCH) with build type $( BUILDTYPE)