Adding new QUDA features - lattice/quda GitHub Wiki
Whenever a significant new feature is added to QUDA, e.g., a new fermion type, that adds a significant overhead to the compilation and library size, the policy is to make this a configurable option so as to not affect the compilation and link time for all users of QUDA.
Updating configure / make
To make a feature user enabled through configure, i.e., ./configure --enable-feature
, where feature
is shorthand for the feature that is to be enabled, the configure.ac
file must be updated.
First the argument option has to be added to the command line:
AC_ARG_ENABLE(feature,
AC_HELP_STRING([--enable-feature], [ Build fancy new feature (default: disabled)]),
[ build_feature=${enableval} ],
[ build_feature="no" ]
)
Here we're adding the option for enabling "feature", with the default that it is disabled.
Second, we add a check to ensure that a valid value is passed to this option.
dnl Build Feature
case ${build_feature} in
yes|no);;
*)
AC_MSG_ERROR([ invalid value for --enable-feature ])
;;
esac
Third, we need to tell configure to do something if this option is enabled
AC_MSG_NOTICE([Setting BUILD_FEATURE = ${build_feature} ] )
AC_SUBST( BUILD_FEATURE, [${build_feature}])
Here, what this means is that if --enable-feature
is set, then the variable BUILD_FEATURE
will be defined to equal yes
, else it will be no
.
Now in make.inc.in
, which is the makefile input to configure we need to use this variable and act accordingly:
BUILD_FEATURE = @BUILD_FEATURE@ # build code for fancy new feature?
ifeq ($(strip $(BUILD_FEATURE)), yes)
NVCCOPT += -DGPU_FEATURE
COPT += -DGPU_FEATURE
FEATURE_TEST=feature_test
endif
So this is saying that if BUILD_FEATURE=yes
then the macro GPU_FEATURE
and the feature_test
program will be built. For the latter we also need to add FEATURE_TEST
to the list of tests to build in tests/Makefile
.
After all these changes have been made, all that remains is to run autoconf
to create the new configure
and make.inc
files.
Conditional compilation
In the source code for the algorithms that are to be built conditionally, we use the C-preprocessor macro defined by the makefile. We do so in such a way such that if the routine is called without being built, e.g., through use of a stale makefile, then a sensible run-time error message will be thrown.
#ifdef GPU_FEATURE
// GPU kernel code and Tunable derived class go here
#endif
void newFeature(...) {
#ifdef GPU_FEATURE
// call above code
#else
errorQuda("GPU feature has not been built");
#endif
}