dnl cuda3.m4 --- check for Cuda software.
dnl
dnl Copyright (C) 2013 Jesus Garrido based on a previous MATLAB version by Ralph Schleicher
dnl
dnl This program is free software; you can redistribute it and/or
dnl modify it under the terms of the GNU General Public License as
dnl published by the Free Software Foundation; either version 2,
dnl or (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; see the file COPYING. If not, write to
dnl the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
dnl Boston, MA 02111-1307, USA.
dnl
dnl As a special exception to the GNU General Public License, if
dnl you distribute this file as part of a program that contains a
dnl configuration script generated by GNU Autoconf, you may include
dnl it under the same distribution terms that you use for the rest
dnl of that program.
dnl
dnl Code:
# AX_CUDA
# ---------
# Check for Cuda.
AC_DEFUN([AX_CUDA],
[dnl
AC_PREREQ([2.50])
ax_enable_cuda=AC_ARG_WITH([cuda], AS_HELP_STRING([--with-cuda], [check for Cuda [[yes]]]),
[case $withval in
yes | no)
# Explicitly enable or disable Cuda but determine
# Cuda prefix automatically.
ax_enable_cuda=$withval
;;
*)
# Enable Cuda and use ARG as the Cuda prefix.
# ARG must be an existing directory.
ax_enable_cuda=yes
CUDA=`cd "${withval-/}" > /dev/null 2>&1 && pwd`
if test -z "$CUDA" ; then
AC_MSG_ERROR([invalid value '$withval' for --with-cuda])
fi
;;
esac])
if test x$ax_enable_cuda == xno ; then
AC_MSG_CHECKING([whether to enable Cuda support])
AC_MSG_RESULT([$ax_enable_cuda])
else
AC_CACHE_CHECK([for Cuda prefix], [ax_cv_cuda],
[if test "${CUDA+set}" = set ; then
ax_cv_cuda=`cd "${CUDA-/}" > /dev/null 2>&1 && pwd`
else
ax_cv_cuda=
IFS=${IFS= } ; ax_ifs=$IFS ; IFS=:
for ax_dir in ${PATH-/opt/bin:/usr/local/bin:/usr/bin:/bin} ; do
if test -z "$ax_dir" ; then
ax_dir=.
fi
if test -x "$ax_dir/nvcc" ; then
ax_dir=`echo "$ax_dir" | sed 's,/bin$,,'`
# Directory sanity check.
ax_cv_cuda=`cd "${ax_dir-/}" > /dev/null 2>&1 && pwd`
if test -n "$ax_cv_cuda" ; then
break
fi
fi
done
IFS=$ax_ifs
fi
if test -z "$ax_cv_cuda" ; then
ax_cv_cuda="not found"
fi])
if test "$ax_cv_cuda" = "not found" ; then
unset CUDA
else
# Strip trailing dashes.
CUDA=`echo "$ax_cv_cuda" | sed 's,/*$,,'`
fi
AC_MSG_CHECKING([whether to enable Cuda support])
if test x$ax_enable_cuda != xno ; then
if test "${CUDA+set}" = set && test -d "$CUDA/include" && test -d "$CUDA/lib" ; then
ax_enable_cuda=yes
elif test x$ax_enable_cuda = x ; then
ax_enable_cuda=no
else
# Fail if Cuda was explicitly enabled.
AC_MSG_RESULT([failure])
AC_MSG_ERROR([check your Cuda setup])
fi
fi
AC_MSG_RESULT([$ax_enable_cuda])
if test x$ax_enable_cuda = xyes ; then
# Check CUDA driver version
AC_CACHE_VAL(mx_cv_CXXFLAGS,mx_cv_CXXFLAGS="${CXXFLAGS}")
AC_CACHE_VAL(mx_cv_LDFLAGS,mx_cv_LDFLAGS="${LDFLAGS}")
AC_SUBST(CXXFLAGS,"${CXXFLAGS} -I${CUDA}/include")
AC_SUBST(LDFLAGS,"${LDFLAGS} -L${CUDA}/lib -lcudart")
AC_CACHE_VAL(mx_cv_cuda_driver_version,
if test "${CUDA_DRIVER_VERSION+set}" = set ; then
mx_cv_cuda_driver_version=$CUDA_DRIVER_VERSION
else
mx_cv_cuda_driver_version=
AC_MSG_CHECKING([whether to enable Cuda compiling])
AC_COMPILE_IFELSE([
AC_LANG_SOURCE([[
#include <iostream>
#include <cstdlib>
#include <cuda.h>
#include <cuda_runtime.h>
int main(){
int deviceCount=0, driverVersion = 0;
cudaGetDeviceCount(&deviceCount);
if (deviceCount == 0) {
fprintf(stderr,"error: no devices supporting CUDA.\n");
exit(EXIT_FAILURE);
}
int dev = 0;
cudaSetDevice(dev);
cudaDriverGetVersion(&driverVersion);
printf("%d.%d",driverVersion/1000, (driverVersion%100)/10);
}
]])],
[AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])
AC_MSG_FAILURE([CUDA compiling execution failed])]
)
AC_MSG_CHECKING([whether to enable Cuda linking])
AC_LINK_IFELSE([
AC_LANG_SOURCE([[
#include <iostream>
#include <cstdlib>
#include <cuda.h>
#include <cuda_runtime.h>
int main(){
int deviceCount=0, driverVersion = 0;
cudaGetDeviceCount(&deviceCount);
if (deviceCount == 0) {
fprintf(stderr,"error: no devices supporting CUDA.\n");
exit(EXIT_FAILURE);
}
int dev = 0;
cudaSetDevice(dev);
cudaDriverGetVersion(&driverVersion);
printf("%d.%d",driverVersion/1000, (driverVersion%100)/10);
}
]])],
[AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])
AC_MSG_FAILURE([CUDA linking execution failed])]
)
AC_MSG_CHECKING([whether to enable Cuda runing])
AC_RUN_IFELSE([
AC_LANG_SOURCE([[
#include <iostream>
#include <cstdlib>
#include <cuda.h>
#include <cuda_runtime.h>
int main(){
int deviceCount=0, driverVersion = 0;
cudaGetDeviceCount(&deviceCount);
if (deviceCount == 0) {
fprintf(stderr,"error: no devices supporting CUDA.\n");
exit(EXIT_FAILURE);
}
int dev = 0;
cudaSetDevice(dev);
cudaDriverGetVersion(&driverVersion);
printf("%d.%d",driverVersion/1000, (driverVersion%100)/10);
}
]])],
[AC_MSG_RESULT([yes])
AC_MSG_CHECKING([CUDA Driver version])
mx_cv_cuda_driver_version=`./conftest"${EXEEXT}" > /tmp/testfile.log`
mx_cv_cuda_driver_version=`cat /tmp/testfile.log`
`rm /tmp/testfile.log`
AC_MSG_RESULT([$mx_cv_cuda_driver_version])],
[AC_MSG_RESULT([no])
AC_MSG_FAILURE([CUDA code execution failed])]
)
AC_SUBST(CUDA_DRIVER_VERSION, $mx_cv_cuda_driver_version)
mx_cv_cuda_driver_major=`echo $mx_cv_cuda_driver_version | $AWK -F. '{print $ 1}'`
mx_cv_cuda_driver_minor=`echo $mx_cv_cuda_driver_version | $AWK -F. '{print $ 2}'`
AC_SUBST(CUDA_DRIVER_MAJOR, $mx_cv_cuda_driver_major)
AC_SUBST(CUDA_DRIVER_MINOR, $mx_cv_cuda_driver_minor)
fi
)
if test x$CUDA_DRIVER_VERSION = x ; then
AC_MSG_ERROR([can not determine CUDA driver version number])
fi
AC_MSG_CHECKING([if CUDA driver version is sufficient])
mx_version=5.0
case $mx_version in
@<:@1-9@:>@ | @<:@1-9@:>@@<:@0-9@:>@)
mx_major=$mx_version
mx_minor=''
;;
@<:@1-9@:>@.@<:@0-9@:>@ | @<:@1-9@:>@@<:@0-9@:>@.@<:@0-9@:>@)
mx_major=`echo $mx_version | sed 's/^\(@<:@0-9@:>@*\)\.@<:@0-9@:>@*.*/\1/'`
mx_minor=`echo $mx_version | sed 's/^@<:@0-9@:>@*\.\(@<:@0-9@:>@*\).*/\1/'`
;;
*)
AC_MSG_RESULT([failure])
AC_MSG_NOTICE([report this bug to the responsible package maintainer])
AC_MSG_ERROR([invalid CUDA Driver version number argument to AX_REQUIRE_CUDA_DRIVER_VERSION])
;;
esac
mx_ans=yes
if test $CUDA_DRIVER_MAJOR -eq $mx_major ; then
if test x$mx_minor != x && test $CUDA_DRIVER_MINOR -lt $mx_minor ; then
mx_ans=no
fi
elif test $CUDA_DRIVER_MAJOR -lt $mx_major ; then
mx_ans=no
fi
AC_MSG_RESULT([$mx_ans])
if test x$mx_ans = xno ; then
$ax_enable_cuda=no
$CUDA=
AC_MSG_NOTICE([require CUDA Driver version $mx_version or above])
fi
fi
if test x$ax_enable_cuda = xyes ; then
# Check CUDA architecture
AC_CACHE_VAL(mx_cv_cuda_version,
if test "${CUDA_VERSION+set}" = set ; then
mx_cv_cuda_version=$CUDA_VERSION
else
mx_cv_cuda_version=
AC_MSG_CHECKING([whether to enable Cuda runing])
AC_RUN_IFELSE([
AC_LANG_SOURCE([[
#include <iostream>
#include <cstdlib>
#include <cuda.h>
#include <cuda_runtime.h>
int main(){
int deviceCount;
cudaGetDeviceCount(&deviceCount);
if (deviceCount == 0) {
fprintf(stderr,"error: no devices supporting CUDA.\n");
exit(EXIT_FAILURE);
}
int dev = 0;
cudaSetDevice(dev);
cudaDeviceProp prop;
if (cudaGetDeviceProperties(&prop, dev) == cudaSuccess){
printf("%d.%d\n",(int)prop.major, (int)prop.minor);
} else {
fprintf(stderr, "error: no device properties.\n");
exit(EXIT_FAILURE);
}
}
]])],[
AC_MSG_RESULT([yes])
AC_MSG_CHECKING([CUDA architecture])
mx_cv_cuda_version=`./conftest"${EXEEXT}" > /tmp/testfile.log`
mx_cv_cuda_version=`cat /tmp/testfile.log`
`rm /tmp/testfile.log`
AC_MSG_RESULT([$mx_cv_cuda_version])
],[
AC_MSG_RESULT([no])
AC_MSG_FAILURE([CUDA code execution failed])
]
)
AC_SUBST(CUDA_VERSION, $mx_cv_cuda_version)
mx_cv_cuda_major=`echo $mx_cv_cuda_version | $AWK -F. '{print $ 1}'`
mx_cv_cuda_minor=`echo $mx_cv_cuda_version | $AWK -F. '{print $ 2}'`
AC_SUBST(CUDA_MAJOR, $mx_cv_cuda_major)
AC_SUBST(CUDA_MINOR, $mx_cv_cuda_minor)
AC_SUBST(CXXFLAGS,$mx_cv_CXXFLAGS)
AC_SUBST(LDFLAGS,$mx_cv_LDFLAGS)
fi
)
if test x$CUDA_VERSION = x ; then
AC_MSG_ERROR([can not determine CUDA version number])
fi
AC_MSG_CHECKING([if CUDA version is sufficient])
mx_version=2.0
case $mx_version in
@<:@1-9@:>@ | @<:@1-9@:>@@<:@0-9@:>@)
mx_major=$mx_version
mx_minor=''
;;
@<:@1-9@:>@.@<:@0-9@:>@ | @<:@1-9@:>@@<:@0-9@:>@.@<:@0-9@:>@)
mx_major=`echo $mx_version | sed 's/^\(@<:@0-9@:>@*\)\.@<:@0-9@:>@*.*/\1/'`
mx_minor=`echo $mx_version | sed 's/^@<:@0-9@:>@*\.\(@<:@0-9@:>@*\).*/\1/'`
;;
*)
AC_MSG_RESULT([failure])
AC_MSG_NOTICE([report this bug to the responsible package maintainer])
AC_MSG_ERROR([invalid CUDA version number argument to AX_REQUIRE_CUDA_VERSION])
;;
esac
mx_ans=yes
if test $CUDA_MAJOR -eq $mx_major ; then
if test x$mx_minor != x && test $CUDA_MINOR -lt $mx_minor ; then
mx_ans=no
fi
elif test $CUDA_MAJOR -lt $mx_major ; then
mx_ans=no
fi
AC_MSG_RESULT([$mx_ans])
if test x$mx_ans = xno ; then
$ax_enable_cuda=no
$CUDA=
AC_MSG_ERROR([require CUDA version $mx_version or above])
fi
fi
if test x$ax_enable_cuda = xyes ; then
AC_DEFINE([HAVE_CUDA], [1], [Define if you have Cuda.])
fi
fi
AC_SUBST([CUDA])
])
dnl cuda.m4 ends here