https://github.com/Microsoft/CNTK
Raw File
Tip revision: 60be167c8e7a7d531452fde8e242c2eff674850c authored by Alexey Kamenev on 16 February 2016, 20:11:51 UTC
Added SM3.0 to Linux Debug build. Added serialization of new fields to BN node.
Tip revision: 60be167
configure
#!/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
mathlib=

default_use_1bitsgd=no
enable_1bitsgd=$default_use_1bitsgd

# 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"
default_gdks=". gdk/usr"
default_cubs="cub-1.4.1"
default_cudnns="cudnn-4.0"
default_opencvs="opencv-3.0.0"

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 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 "  --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 "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
            ;;

        --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
            ;;
        *)
            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

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 $enable_1bitsgd = yes ; then
    echo CNTK_ENABLE_1BitSGD=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
back to top