diff --git a/configure.ac b/configure.ac index 82fd3b156da771ee471448323565f4a0ecfeb8da..f5228ebc023d2168176f9ef5d029aeb1d53162e2 100644 --- a/configure.ac +++ b/configure.ac @@ -589,6 +589,7 @@ AH_VERBATIM([__STDC_FORMAT_MACROS], # Check for FFTW. We test for this in the standard directories by default, # and only disable if using --with-fftw=no or --without-fftw. When a value # is given FFTW must be found. +# If FFTW is found, we check whether this is the threaded version. have_fftw="no" AC_ARG_WITH([fftw], [AS_HELP_STRING([--with-fftw=PATH], @@ -598,29 +599,60 @@ AC_ARG_WITH([fftw], [with_fftw="test"] ) if test "x$with_fftw" != "xno"; then + + # Was FFTW's location specifically given? if test "x$with_fftw" != "xyes" -a "x$with_fftw" != "xtest" -a "x$with_fftw" != "x"; then - FFTW_LIBS="-L$with_fftw/lib -lfftw3_threads -lfftw3" + FFTW_LIBS="-L$with_fftw/lib -lfftw3" FFTW_INCS="-I$with_fftw/include" else - FFTW_LIBS="-lfftw3_threads -lfftw3" + FFTW_LIBS="-lfftw3" FFTW_INCS="" fi + # FFTW is not specified, so just check if we have it. if test "x$with_fftw" = "xtest"; then AC_CHECK_LIB([fftw3],[fftw_malloc],[have_fftw="yes"],[have_fftw="no"],$FFTW_LIBS) if test "x$have_fftw" != "xno"; then AC_DEFINE([HAVE_FFTW],1,[The FFTW library appears to be present.]) fi + # FFTW was specified, check that it was a valid location. else AC_CHECK_LIB([fftw3],[fftw_malloc], AC_DEFINE([HAVE_FFTW],1,[The FFTW library appears to be present.]), AC_MSG_ERROR(something is wrong with the FFTW library!), $FFTW_LIBS) have_fftw="yes" fi + + # FFTW was requested not to be used. if test "$have_fftw" = "no"; then FFTW_LIBS="" FFTW_INCS="" fi + + # Now, check whether we have the threaded version of FFTW + if test "x$have_fftw" = "xyes"; then + + # Was FFTW's location specifically given? + if test "x$with_fftw" != "xyes" -a "x$with_fftw" != "xtest" -a "x$with_fftw" != "x"; then + FFTW_THREADED_LIBS="-L$with_fftw/lib -lfftw3_threads -lfftw3" + FFTW_THREADED_INCS="-I$with_fftw/include" + else + FFTW_THREADED_LIBS="-lfftw3_threads -lfftw3" + FFTW_THREADED_INCS="" + fi + + # Verify that the library is threaded + AC_CHECK_LIB([fftw3],[fftw_init_threads],[have_threaded_fftw="yes"], + [have_threaded_fftw="no"], $FFTW_THREADED_LIBS) + + # If found, update things + if test "x$have_threaded_fftw" = "xyes"; then + AC_DEFINE([HAVE_THREADED_FFTW],1,[The threaded FFTW library appears to be present.]) + FFTW_LIBS=$FFTW_THREADED_LIBS + FFTW_INCS=$FFTW_THREADED_INCS + have_fftw="yes - threaded" + fi + fi fi AC_SUBST([FFTW_LIBS]) AC_SUBST([FFTW_INCS]) diff --git a/src/mesh_gravity.c b/src/mesh_gravity.c index ce3d15394ebb0e2418e491d9ef9f3a85687bb3ae..2f2f1628e7077ba301322c7af6b858e979b313ad 100644 --- a/src/mesh_gravity.c +++ b/src/mesh_gravity.c @@ -624,11 +624,13 @@ void pm_mesh_init(struct pm_mesh* mesh, const struct gravity_props* props, if (2. * mesh->r_cut_max > box_size) error("Mesh too small or r_cut_max too big for this box size"); +#ifdef HAVE_THREADED_FFTW /* Initialise the thread-parallel FFTW version */ if (N >= 64) { fftw_init_threads(); fftw_plan_with_nthreads(nr_threads); } +#endif /* Allocate the memory for the combined density and potential array */ mesh->potential = (double*)fftw_malloc(sizeof(double) * N * N * N); @@ -668,7 +670,9 @@ void pm_mesh_init_no_mesh(struct pm_mesh* mesh, double dim[3]) { */ void pm_mesh_clean(struct pm_mesh* mesh) { +#ifdef HAVE_THREADED_FFTW fftw_cleanup_threads(); +#endif if (mesh->potential) free(mesh->potential); mesh->potential = 0; @@ -702,11 +706,13 @@ void pm_mesh_struct_restore(struct pm_mesh* mesh, FILE* stream) { #ifdef HAVE_FFTW const int N = mesh->N; +#ifdef HAVE_THREADED_FFTW /* Initialise the thread-parallel FFTW version */ if (N >= 64) { fftw_init_threads(); fftw_plan_with_nthreads(mesh->nr_threads); } +#endif /* Allocate the memory for the combined density and potential array */ mesh->potential = (double*)fftw_malloc(sizeof(double) * N * N * N);