702 строки
18 KiB
Bash
Executable File
702 строки
18 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
configure=$0
|
|
build_top=$PWD
|
|
|
|
have_cuda=no
|
|
cuda_path=
|
|
cuda_check=include/cuda.h
|
|
enable_cuda=
|
|
|
|
have_acml=no
|
|
acml_path=
|
|
acml_check=include/acml.h
|
|
|
|
have_mkl=no
|
|
mkl_path=
|
|
mkl_check=mkl/include/mkl.h
|
|
|
|
# Experimental OpenBLAS support.
|
|
have_openblas=no
|
|
openblas_path=
|
|
openblas_check=include/openblas_config.h
|
|
|
|
have_kaldi=no
|
|
kaldi_path=
|
|
kaldi_check=src/kaldi.mk
|
|
|
|
have_buildtype=no
|
|
buildtype=
|
|
default_buildtype=release
|
|
|
|
have_gdk=no
|
|
gdk_path=
|
|
gdk_check=include/nvidia/gdk/nvml.h
|
|
|
|
have_cub=no
|
|
cub_path=
|
|
cub_check=cub/cub.cuh
|
|
|
|
have_cudnn=no
|
|
cudnn_path=
|
|
cudnn_check=cuda/include/cudnn.h
|
|
|
|
have_opencv=no
|
|
opencv_path=
|
|
opencv_check=include/opencv2/opencv.hpp
|
|
|
|
have_libzip=no
|
|
libzip_path=
|
|
libzip_check=include/zip.h
|
|
|
|
mathlib=
|
|
|
|
default_use_1bitsgd=no
|
|
enable_1bitsgd=$default_use_1bitsgd
|
|
|
|
default_use_code_coverage=no
|
|
enable_code_coverage=$default_use_code_coverage
|
|
|
|
default_use_asgd=yes
|
|
enable_asgd=$default_use_asgd
|
|
|
|
# List from best to worst choice
|
|
default_path_list="/usr /usr/local /opt /opt/local /opt/intel"
|
|
|
|
# List from best to worst choice
|
|
default_acmls="acml5.3.1/ifort64_mp"
|
|
default_mkls=""
|
|
default_openblas=""
|
|
|
|
# NOTE: Will get compilation errors with cuda-6.0
|
|
default_cudas="cuda-7.5 cuda-7.0 cuda-6.5"
|
|
default_kaldis="kaldi-trunk kaldi-c024e8aa"
|
|
default_gdks=". gdk/usr"
|
|
default_cubs="cub-1.4.1"
|
|
default_cudnns="cudnn-4.0"
|
|
default_opencvs="opencv-3.0.0"
|
|
default_libzips="libzip-1.1.2"
|
|
|
|
function default_paths ()
|
|
{
|
|
echo $build_top $HOME $default_path_list
|
|
}
|
|
|
|
# $1 is directory
|
|
# $2 is file that must be present
|
|
function check_dir ()
|
|
{
|
|
if test -e $1/$2
|
|
then
|
|
echo yes
|
|
else
|
|
echo no
|
|
fi
|
|
}
|
|
|
|
# $1 is the list of tails to search, ordered by preference
|
|
# $2 is some file that must exist in $1
|
|
function find_dir ()
|
|
{
|
|
# Loop over list of tails to search, including empty (just default_path + search file)
|
|
for tail in $1 ''
|
|
do
|
|
for head in $(default_paths)
|
|
do
|
|
[ -n "$tail" ] && search_path="$head/$tail" || search_path=$head
|
|
if test x$(check_dir "$search_path" $2) = xyes
|
|
then
|
|
echo $search_path
|
|
return 0
|
|
fi
|
|
done
|
|
done
|
|
}
|
|
|
|
function find_acml ()
|
|
{
|
|
find_dir "$default_acmls" "$acml_check"
|
|
}
|
|
|
|
function find_mkl ()
|
|
{
|
|
find_dir "$default_mkls" "$mkl_check"
|
|
}
|
|
|
|
function find_openblas ()
|
|
{
|
|
find_dir "$default_openblas" "$openblas_check"
|
|
}
|
|
|
|
function find_cuda ()
|
|
{
|
|
find_dir "$default_cudas" "$cuda_check"
|
|
}
|
|
|
|
function find_kaldi ()
|
|
{
|
|
find_dir "$default_kaldis" "$kaldi_check"
|
|
}
|
|
|
|
function find_gdk ()
|
|
{
|
|
find_dir "$default_gdks" "$gdk_check"
|
|
}
|
|
|
|
function find_cub ()
|
|
{
|
|
find_dir "$default_cubs" "$cub_check"
|
|
}
|
|
|
|
function find_cudnn ()
|
|
{
|
|
find_dir "$default_cudnns" "$cudnn_check"
|
|
}
|
|
|
|
function find_opencv ()
|
|
{
|
|
find_dir "$default_opencvs" "$opencv_check"
|
|
}
|
|
|
|
function find_libzip ()
|
|
{
|
|
find_dir "$default_libzips" "$libzip_check"
|
|
}
|
|
|
|
function is_hardlinked ()
|
|
{
|
|
r=no
|
|
if test -e $1 && test -e $2
|
|
then
|
|
r=yes
|
|
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
|
|
fi
|
|
echo $r
|
|
}
|
|
|
|
function default_use_cuda ()
|
|
{
|
|
if test x$(find_cuda) = x || test x$(find_gdk) = x
|
|
then
|
|
echo no
|
|
else
|
|
echo yes
|
|
fi
|
|
}
|
|
enable_cuda=$(default_use_cuda)
|
|
|
|
function show_default ()
|
|
{
|
|
if test x$1 = x
|
|
then
|
|
echo "(no default)"
|
|
else
|
|
echo "(default $1)"
|
|
fi
|
|
}
|
|
|
|
function show_help ()
|
|
{
|
|
echo "Usage: configure [options]"
|
|
echo "Options:"
|
|
echo " -h|--help this help"
|
|
echo " --with-build-top=directory build directory $(show_default $build_top)"
|
|
echo " --add directory add directory to library search path"
|
|
echo " --1bitsgd[=(yes|no)] use 1Bit SGD $(show_default $(default_use_1bitsgd))"
|
|
echo " --asgd[=(yes|no)] use asgd powered by Multiverso $(show_default $(default_use_asgd))"
|
|
echo " --cuda[=(yes|no)] use cuda GPU $(show_default $(default_use_cuda))"
|
|
echo " --with-cuda[=directory] $(show_default $(find_cuda))"
|
|
echo " --with-cub[=directory] $(show_default $(find_cub))"
|
|
echo " --with-gdk[=directory] $(show_default $(find_gdk))"
|
|
echo " --with-cudnn[=directory] $(show_default $(find_cudnn))"
|
|
echo " --with-acml[=directory] $(show_default $(find_acml))"
|
|
echo " --with-mkl[=directory] $(show_default $(find_mkl))"
|
|
echo " --with-openblas[=directory] (experimental) $(show_default $(find_openblas))"
|
|
echo " --with-buildtype=(debug|release) $(show_default $default_buildtype)"
|
|
echo " --with-kaldi[=directory] $(show_default $(find_kaldi))"
|
|
echo " --with-opencv[=directory] $(show_default $(find_opencv))"
|
|
echo " --with-libzip[=directory] $(show_default $(find_libzip))"
|
|
echo " --with-code-coverage[=(yes|no)] $(show_default ${default_use_code_coverage})"
|
|
echo "Libraries search path:"
|
|
for head in $(default_paths)
|
|
do
|
|
echo " $head"
|
|
done
|
|
}
|
|
|
|
while [[ $# > 0 ]]
|
|
do
|
|
key="$1"
|
|
case $key in
|
|
*=?*) optarg=`expr "X$key" : '[^=]*=\(.*\)'` ;;
|
|
*=) optarg= ;;
|
|
*) optarg= ;;
|
|
esac
|
|
|
|
case $key in
|
|
-h|--help)
|
|
show_help
|
|
exit 1
|
|
;;
|
|
--with-build-top*)
|
|
if test x$optarg != x
|
|
then
|
|
build_top=$optarg
|
|
mkdir -p $build_top
|
|
fi
|
|
;;
|
|
--add*)
|
|
if test x$optarg = x
|
|
then
|
|
shift ; optarg=$1
|
|
fi
|
|
default_path_list="$optarg $default_path_list"
|
|
;;
|
|
--1bitsgd*)
|
|
if test x$optarg = xyes || test x$optarg = xno
|
|
then
|
|
enable_1bitsgd=$optarg
|
|
else
|
|
echo "Invalid value for --1bitsgd $optarg"
|
|
show_help
|
|
exit
|
|
fi
|
|
;;
|
|
|
|
--with-code-coverage*)
|
|
if test x$optarg = xyes || test x$optarg = xno
|
|
then
|
|
enable_code_coverage=$optarg
|
|
else
|
|
echo "Invalid value for --with-code-coverage $optarg"
|
|
show_help
|
|
exit
|
|
fi
|
|
;;
|
|
|
|
--asgd*)
|
|
if test x$optarg = xyes || test x$optarg = xno
|
|
then
|
|
enable_asgd=$optarg
|
|
else
|
|
echo "Invalid value for --asgd $optarg"
|
|
show_help
|
|
exit
|
|
fi
|
|
;;
|
|
|
|
--cuda*)
|
|
if test x$optarg = xyes || test x$optarg = xno
|
|
then
|
|
enable_cuda=$optarg
|
|
else
|
|
echo "Invalid value for --cuda $optarg"
|
|
show_help
|
|
exit
|
|
fi
|
|
;;
|
|
|
|
--with-cuda*)
|
|
have_cuda=yes
|
|
enable_cuda=yes
|
|
if test x$optarg = x
|
|
then
|
|
cuda_path=$(find_cuda)
|
|
if test x$cuda_path = x
|
|
then
|
|
echo "Cannot find cuda directory."
|
|
echo "Please specify a value for --with-cuda"
|
|
exit 1
|
|
fi
|
|
else
|
|
if test $(check_dir $optarg $cuda_check) = yes
|
|
then
|
|
cuda_path=$optarg
|
|
else
|
|
echo "Invalid cuda directory $optarg"
|
|
exit 1
|
|
fi
|
|
fi
|
|
;;
|
|
--with-cub*)
|
|
have_cub=yes
|
|
if test x$optarg = x
|
|
then
|
|
cub_path=$(find_cub)
|
|
if test x$cub_path = x
|
|
then
|
|
echo "Cannot find NVIDIA CUB directory."
|
|
echo "Please specify a value for --with-cub"
|
|
echo "NVIDIA CUB can be downloaded from https://github.com/NVlabs/cub/archive/1.4.1.zip, extract the archive to /usr/local"
|
|
exit 1
|
|
fi
|
|
else
|
|
if test $(check_dir $optarg $cub_check) = yes
|
|
then
|
|
cub_path=$optarg
|
|
else
|
|
echo "Invalid CUB directory $optarg"
|
|
exit 1
|
|
fi
|
|
fi
|
|
;;
|
|
--with-gdk*)
|
|
have_gdk=yes
|
|
if test x$optarg = x
|
|
then
|
|
gdk_path=$(find_gdk)
|
|
if test x$gdk_path = x
|
|
then
|
|
echo "Cannot find gdk directory."
|
|
echo "Please specify a value for --with-gdk"
|
|
exit 1
|
|
fi
|
|
else
|
|
if test $(check_dir $optarg $gdk_check) = yes
|
|
then
|
|
gdk_path=$optarg
|
|
else
|
|
echo "Invalid gdk directory $optarg"
|
|
exit 1
|
|
fi
|
|
fi
|
|
;;
|
|
--with-cudnn*)
|
|
have_cudnn=yes
|
|
if test x$optarg = x
|
|
then
|
|
cudnn_path=$(find_cudnn)
|
|
if test x$cudnn_path = x
|
|
then
|
|
echo "Cannot find NVIDIA cuDNN directory."
|
|
echo "Please specify a value for --with-cudnn"
|
|
exit 1
|
|
fi
|
|
else
|
|
if test $(check_dir $optarg $cudnn_check) = yes
|
|
then
|
|
cudnn_path=$optarg
|
|
else
|
|
echo "Invalid cuDNN directory $optarg"
|
|
exit 1
|
|
fi
|
|
fi
|
|
;;
|
|
--with-acml*)
|
|
have_acml=yes
|
|
mathlib=acml
|
|
if test x$optarg = x
|
|
then
|
|
acml_path=$(find_acml)
|
|
if test x$acml_path = x
|
|
then
|
|
echo "Cannot find acml directory"
|
|
echo "Please specify a value for --with-acml"
|
|
exit 1
|
|
fi
|
|
else
|
|
if test $(check_dir $optarg $acml_check) = yes
|
|
then
|
|
acml_path=$optarg
|
|
else
|
|
echo "Invalid acml directory $optarg"
|
|
exit 1
|
|
fi
|
|
fi
|
|
;;
|
|
--with-mkl*)
|
|
have_mkl=yes
|
|
mathlib=mkl
|
|
if test x$optarg = x
|
|
then
|
|
mkl_path=$(find_mkl)
|
|
if test x$mkl_path = x
|
|
then
|
|
echo "Cannot find mkl directory"
|
|
echo "Please specify a value for --with-mkl"
|
|
exit 1
|
|
fi
|
|
else
|
|
if test $(check_dir $optarg $mkl_check) = yes
|
|
then
|
|
mkl_path=$optarg
|
|
else
|
|
echo "Invalid mkl directory $optarg"
|
|
exit 1
|
|
fi
|
|
fi
|
|
;;
|
|
--with-openblas*)
|
|
have_openblas=yes
|
|
mathlib=openblas
|
|
if test x$optarg = x
|
|
then
|
|
openblas_path=$(find_openblas)
|
|
if test x$openblas_path = x
|
|
then
|
|
echo "Cannot find openblas directory"
|
|
echo "Please specify a value for --with-openblas"
|
|
exit 1
|
|
fi
|
|
else
|
|
if test $(check_dir $optarg $openblas_check) = yes
|
|
then
|
|
openblas_path=$optarg
|
|
else
|
|
echo "Invalid openblas directory $optarg"
|
|
exit 1
|
|
fi
|
|
fi
|
|
;;
|
|
--with-buildtype*)
|
|
have_buildtype=yes
|
|
case $optarg in
|
|
debug|release)
|
|
buildtype=$optarg
|
|
;;
|
|
*)
|
|
echo Invalid buildtype $optarg
|
|
echo Must be debug or release
|
|
exit 1
|
|
esac
|
|
;;
|
|
--with-kaldi*)
|
|
have_kaldi=yes
|
|
if test x$optarg = x
|
|
then
|
|
kaldi_path=$(find_kaldi)
|
|
if test x$kaldi_path = x
|
|
then
|
|
echo "Cannot find kaldi directory"
|
|
echo "Please specify a value for --with-kaldi"
|
|
exit 1
|
|
fi
|
|
else
|
|
if test $(check_dir $optarg $kaldi_check)
|
|
then
|
|
kaldi_path=$optarg
|
|
else
|
|
echo "Invalid kaldi directory $optarg"
|
|
exit 1
|
|
fi
|
|
fi
|
|
;;
|
|
--with-opencv*)
|
|
have_opencv=yes
|
|
if test x$optarg = x
|
|
then
|
|
opencv_path=$(find_opencv)
|
|
if test x$opencv_path = x
|
|
then
|
|
echo "Cannot find OpenCV directory."
|
|
echo "Please specify a value for --with-opencv"
|
|
echo "OpenCV can be downloaded from http://opencv.org/downloads.html, install instructions http://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html#linux-installation"
|
|
exit 1
|
|
fi
|
|
else
|
|
if test $(check_dir $optarg $opencv_check) = yes
|
|
then
|
|
opencv_path=$optarg
|
|
else
|
|
echo "Invalid OpenCV directory $optarg"
|
|
exit 1
|
|
fi
|
|
fi
|
|
;;
|
|
--with-libzip*)
|
|
have_libzip=yes
|
|
if test x$optarg = x
|
|
then
|
|
libzip_path=$(find_libzip)
|
|
if test x$libzip_path = x
|
|
then
|
|
echo "Cannot find libzip directory."
|
|
echo "Please specify a value for --with-libzip"
|
|
echo "libzip (v.1.1.2 or higher) can be downloaded from http://www.nih.at/libzip/"
|
|
exit 1
|
|
fi
|
|
else
|
|
if test $(check_dir $optarg $$libzip_check) = yes
|
|
then
|
|
libzip_path=$optarg
|
|
else
|
|
echo "Invalid libzip directory $optarg"
|
|
exit 1
|
|
fi
|
|
fi
|
|
;;
|
|
*)
|
|
echo Invalid option $key
|
|
show_help
|
|
exit 1
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if test x$buildtype = x
|
|
then
|
|
buildtype=$default_buildtype
|
|
echo Defaulting to --with-buildtype=release
|
|
fi
|
|
|
|
# If no math library was specified, search for acml and then mkl
|
|
if test x$have_acml = xno && test x$have_mkl = xno && test x$have_openblas = xno
|
|
then
|
|
acml_path=$(find_acml)
|
|
if test x$acml_path = x
|
|
then
|
|
mkl_path=$(find_mkl)
|
|
if test x$mkl_path = x
|
|
then
|
|
echo "Cannot find a CPU math library."
|
|
echo "Please specify --with-acml, --with-mkl, --with-openblas with a path."
|
|
exit 1
|
|
else
|
|
mathlib=mkl
|
|
fi
|
|
else
|
|
mathlib=acml
|
|
fi
|
|
fi
|
|
|
|
# If no cuda library specified, search for one
|
|
if test x$enable_cuda = xyes && test x$cuda_path = x
|
|
then
|
|
cuda_path=$(find_cuda)
|
|
if test x$cuda_path = x ; then
|
|
echo Cannot locate a cuda directory
|
|
echo GPU will be disabled
|
|
enable_cuda=no
|
|
else
|
|
echo Found cuda at $cuda_path
|
|
fi
|
|
fi
|
|
|
|
if test $enable_cuda = yes && test x$gdk_path = x
|
|
then
|
|
gdk_path=$(find_gdk)
|
|
if test x$gdk_path = x ; then
|
|
echo Cannot locate a gdk directory
|
|
echo GPU will be disabled
|
|
enable_cuda=no
|
|
else
|
|
echo Found gdk at $gdk_path
|
|
fi
|
|
fi
|
|
|
|
if test $enable_cuda = yes && test x$cub_path = x
|
|
then
|
|
cub_path=$(find_cub)
|
|
if test x$cub_path = x ; then
|
|
echo Cannot locate NVIDIA CUB directory
|
|
echo GPU will be disabled
|
|
echo NVIDIA CUB can be downloaded from https://github.com/NVlabs/cub/archive/1.4.1.zip, extract the archive to /usr/local
|
|
enable_cuda=no
|
|
else
|
|
echo Found CUB at $cub_path
|
|
fi
|
|
fi
|
|
|
|
if test $enable_cuda = yes && test x$cudnn_path = x
|
|
then
|
|
cudnn_path=$(find_cudnn)
|
|
if test x$cudnn_path = x ; then
|
|
echo Cannot locate NVIDIA cuDNN directory
|
|
echo CNTK will use default convolution engine.
|
|
else
|
|
echo Found cuDNN at $cudnn_path
|
|
fi
|
|
fi
|
|
|
|
if test x$opencv_path = x
|
|
then
|
|
opencv_path=$(find_opencv)
|
|
if test x$opencv_path = x ; then
|
|
echo Cannot locate OpenCV 3.0.0 directory
|
|
echo ImageReader will NOT be built.
|
|
else
|
|
echo Found OpenCV at $opencv_path
|
|
fi
|
|
fi
|
|
|
|
if test x$libzip_path = x
|
|
then
|
|
libzip_path=$(find_libzip)
|
|
if test x$libzip_path = x ; then
|
|
echo Cannot locate libzip files
|
|
echo ImageReader will be built without zip container support.
|
|
else
|
|
echo Found libzip at $libzip_path
|
|
fi
|
|
fi
|
|
|
|
if test x$kaldi_path = x
|
|
then
|
|
kaldi_path=$(find_kaldi)
|
|
if test x$kaldi_path = x ; then
|
|
echo Cannot locate Kaldi files
|
|
echo Kaldi2Reader will NOT be built.
|
|
else
|
|
echo Found Kaldi at $kaldi_path
|
|
fi
|
|
fi
|
|
|
|
config=$build_top/Config.make
|
|
echo Generating $config
|
|
echo "#Configuration file for cntk" > $config
|
|
echo BUILDTYPE=$buildtype >> $config
|
|
echo MATHLIB=$mathlib >> $config
|
|
case $mathlib in
|
|
acml)
|
|
echo ACML_PATH=$acml_path >> $config
|
|
;;
|
|
mkl)
|
|
echo MKL_PATH=$mkl_path >> $config
|
|
;;
|
|
openblas)
|
|
echo OPENBLAS_PATH=$openblas_path >> $config
|
|
;;
|
|
esac
|
|
if test $enable_cuda = yes ; then
|
|
echo CUDA_PATH=$cuda_path >> $config
|
|
echo GDK_PATH=$gdk_path >> $config
|
|
echo CUB_PATH=$cub_path >> $config
|
|
echo CUDNN_PATH=$cudnn_path >> $config
|
|
fi
|
|
if test x$kaldi_path != x ; then
|
|
echo KALDI_PATH=$kaldi_path >> $config
|
|
fi
|
|
if test x$opencv_path != x ; then
|
|
echo OPENCV_PATH=$opencv_path >> $config
|
|
fi
|
|
if test x$libzip_path != x ; then
|
|
echo LIBZIP_PATH=$libzip_path >> $config
|
|
fi
|
|
if test $enable_1bitsgd = yes ; then
|
|
echo CNTK_ENABLE_1BitSGD=true >> $config
|
|
fi
|
|
if test $enable_code_coverage = yes ; then
|
|
echo CNTK_CODE_COVERAGE=true >> $config
|
|
fi
|
|
if test $enable_asgd = yes ; then
|
|
echo CNTK_ENABLE_ASGD=true >> $config
|
|
fi
|
|
|
|
# If we are not in the configure directory, generate a trampoline Makefile
|
|
makefile=$build_top/Makefile
|
|
if test $(is_hardlinked "$configure" "$build_top/configure") = no
|
|
then
|
|
echo Generating $makefile
|
|
realconf=`readlink -f $configure`
|
|
dir=`dirname $realconf`
|
|
echo "#Generate Makefile" > $makefile
|
|
echo dir=$dir >> $makefile
|
|
echo BUILD_TOP=$build_top >> $makefile
|
|
echo >> $makefile
|
|
echo all clean : >> $makefile
|
|
printf '\t$(MAKE) -C $(dir) BUILD_TOP=$(BUILD_TOP) $@\n' >> $makefile
|
|
fi
|
|
echo run
|
|
echo '>make -j all'
|
|
echo to build
|