From 491c533ff0fc81ad6a257eab386d34c7355865bb Mon Sep 17 00:00:00 2001 From: andreas <andreas@5a81b35b-ba03-0410-adc8-b2c5c5119f08> Date: Mon, 19 Apr 2010 19:16:09 +0000 Subject: [PATCH] enabled multithreaded fft git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2054 5a81b35b-ba03-0410-adc8-b2c5c5119f08 --- cmake_support/FindFFTW.cmake | 10 ++++++++++ modules/config/CMakeLists.txt | 5 +++++ modules/config/config.hh.in | 1 + modules/img/alg/src/CMakeLists.txt | 4 ++-- modules/img/alg/src/fft.cc | 16 +++++++++++++--- modules/img/alg/src/fftw_helper.hh | 15 +++++++++++++++ modules/img/alg/src/line_iterator.cc | 2 +- 7 files changed, 47 insertions(+), 6 deletions(-) diff --git a/cmake_support/FindFFTW.cmake b/cmake_support/FindFFTW.cmake index 008ba3d93..b1be94c3e 100644 --- a/cmake_support/FindFFTW.cmake +++ b/cmake_support/FindFFTW.cmake @@ -15,11 +15,21 @@ else (FFTW_INCLUDE_PATH) find_path (FFTW_INCLUDE_PATH fftw3.h) if (_DOUBLE_PREC) find_library (FFTW_LIBRARIES NAMES fftw3) + find_library (FFTW_THREADS_LIB NAMES fftw3_threads) elseif(NOT _DOUBLE_PREC) find_library (FFTW_LIBRARIES NAMES fftw3f) + find_library (FFTW_THREADS_LIB NAMES fftw3f_threads) endif() + if(FFTW_THREADS_LIB) + SET(FFTW_USE_THREADS TRUE) + SET(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_THREADS_LIB} ) + else(FFTW_THREADS_LIB) + endif(FFTW_THREADS_LIB) endif (FFTW_INCLUDE_PATH) + + + # handle the QUIETLY and REQUIRED arguments and set FFTW_FOUND to TRUE if # all listed variables are TRUE include (FindPackageHandleStandardArgs) diff --git a/modules/config/CMakeLists.txt b/modules/config/CMakeLists.txt index 12abad743..e8f153cff 100644 --- a/modules/config/CMakeLists.txt +++ b/modules/config/CMakeLists.txt @@ -43,6 +43,11 @@ if (ENABLE_SPNAV) else() set(spnav_enabled 0) endif() +if (FFTW_USE_THREADS) + set(fftw_use_threads 1) +else() + set(fftw_use_threads 0) +endif() set(config_hh_generator "CMake") set(CONFIG_HH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/config.hh") diff --git a/modules/config/config.hh.in b/modules/config/config.hh.in index 4d6fc6ff1..20ac7eab4 100644 --- a/modules/config/config.hh.in +++ b/modules/config/config.hh.in @@ -30,4 +30,5 @@ #define OST_DOUBLE_PRECISION @double_prec@ #define OST_STATIC_PROPERTY_WORKAROUND @static_props@ #define OST_SPNAV_ENABLED @spnav_enabled@ +#define OST_FFT_USE_THREADS @fftw_use_threads@ #endif diff --git a/modules/img/alg/src/CMakeLists.txt b/modules/img/alg/src/CMakeLists.txt index da982b40c..804cd683e 100644 --- a/modules/img/alg/src/CMakeLists.txt +++ b/modules/img/alg/src/CMakeLists.txt @@ -93,9 +93,9 @@ line_average.hh rscrosscorr.hh ) - +include(${QT_USE_FILE}) module(NAME img_alg SOURCES "${OST_IMG_ALG_SOURCES}" HEADERS "${OST_IMG_ALG_HEADERS}" HEADER_OUTPUT_DIR ost/img/alg DEPENDS_ON img - LINK ${FFTW_LIBRARIES}) + LINK ${FFTW_LIBRARIES} ${QT_QTCORE_LIBRARY}) diff --git a/modules/img/alg/src/fft.cc b/modules/img/alg/src/fft.cc index f38bd69f0..de8480e55 100644 --- a/modules/img/alg/src/fft.cc +++ b/modules/img/alg/src/fft.cc @@ -25,6 +25,7 @@ #include <boost/shared_ptr.hpp> #include <fftw3.h> +#include <QThread> #include <ost/message.hh> #include <ost/img/value_util.hh> @@ -54,8 +55,14 @@ int half_plus_one(int n) { } // anon ns -FFTFnc::FFTFnc(): ori_flag_(false) {} -FFTFnc::FFTFnc(bool f): ori_flag_(f) {} +FFTFnc::FFTFnc(): ori_flag_(false) +{ + OST_FFTW_fftw_init_threads(); +} +FFTFnc::FFTFnc(bool f): ori_flag_(f) +{ + OST_FFTW_fftw_init_threads(); +} // real spatial -> complex half-frequency @@ -119,7 +126,7 @@ reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData()); for(size_t i=0;i<block_count;i++) { std::copy(&in_ptr[i*src_size],&in_ptr[(i+1)*src_size],&fftw_in[i*2*dst_size]); } - + OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount())); OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft_r2c(rank,n, fftw_in,fftw_out, FFTW_ESTIMATE); @@ -202,6 +209,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,HalfFrequencyDomain>(const ComplexH Real* fftw_out = reinterpret_cast<Real*>(out_ptr); assert(sizeof(OST_FFTW_fftw_complex)==sizeof(Complex)); + OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount())); OST_FFTW_fftw_complex* fftw_in = reinterpret_cast<OST_FFTW_fftw_complex*>(out_ptr); @@ -247,6 +255,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,SpatialDomain>(const ComplexSpatial reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData()); // in place transform + OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount())); OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft(rank,n, fftw_out, fftw_out, dir, @@ -284,6 +293,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,FrequencyDomain>(const ComplexFrequ reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData()); // in place transform + OST_FFTW_fftw_plan_with_nthreads(std::max<int>(1,QThread::idealThreadCount())); OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft(rank,n, fftw_out, fftw_out, dir, diff --git a/modules/img/alg/src/fftw_helper.hh b/modules/img/alg/src/fftw_helper.hh index ab130188b..081ff7278 100644 --- a/modules/img/alg/src/fftw_helper.hh +++ b/modules/img/alg/src/fftw_helper.hh @@ -68,4 +68,19 @@ Author: Juergen Haas #define OST_FFTW_fftw_plan_dft_c2r fftwf_plan_dft_c2r #define OST_FFTW_fftw_plan_many_dft fftwf_plan_many_dft #endif + +#if OST_FFT_USE_THREADS + #if OST_DOUBLE_PRECISION + #define OST_FFTW_fftw_init_threads fftw_init_threads + #define OST_FFTW_fftw_plan_with_nthreads fftw_plan_with_nthreads + #else + #define OST_FFTW_fftw_init_threads fftwf_init_threads + #define OST_FFTW_fftw_plan_with_nthreads fftwf_plan_with_nthreads + #endif +#else + void fftw_noop(unsigned int i=0){} + #define OST_FFTW_fftw_init_threads fftw_noop + #define OST_FFTW_fftw_plan_with_nthreads fftw_noop +#endif + #endif diff --git a/modules/img/alg/src/line_iterator.cc b/modules/img/alg/src/line_iterator.cc index f303f4b28..2cd81e5a8 100644 --- a/modules/img/alg/src/line_iterator.cc +++ b/modules/img/alg/src/line_iterator.cc @@ -155,7 +155,7 @@ LineIterator LineIterator::operator++(int) { LineIterator tmp(*this); this->operator++(); - return tmp;; + return tmp; } ExtentIterator LineIterator::GetNextLine() -- GitLab