Skip to content
Snippets Groups Projects
Commit 491c533f authored by andreas's avatar andreas
Browse files

enabled multithreaded fft

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2054 5a81b35b-ba03-0410-adc8-b2c5c5119f08
parent dca83932
No related branches found
No related tags found
No related merge requests found
...@@ -15,11 +15,21 @@ else (FFTW_INCLUDE_PATH) ...@@ -15,11 +15,21 @@ else (FFTW_INCLUDE_PATH)
find_path (FFTW_INCLUDE_PATH fftw3.h) find_path (FFTW_INCLUDE_PATH fftw3.h)
if (_DOUBLE_PREC) if (_DOUBLE_PREC)
find_library (FFTW_LIBRARIES NAMES fftw3) find_library (FFTW_LIBRARIES NAMES fftw3)
find_library (FFTW_THREADS_LIB NAMES fftw3_threads)
elseif(NOT _DOUBLE_PREC) elseif(NOT _DOUBLE_PREC)
find_library (FFTW_LIBRARIES NAMES fftw3f) find_library (FFTW_LIBRARIES NAMES fftw3f)
find_library (FFTW_THREADS_LIB NAMES fftw3f_threads)
endif() 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) endif (FFTW_INCLUDE_PATH)
# handle the QUIETLY and REQUIRED arguments and set FFTW_FOUND to TRUE if # handle the QUIETLY and REQUIRED arguments and set FFTW_FOUND to TRUE if
# all listed variables are TRUE # all listed variables are TRUE
include (FindPackageHandleStandardArgs) include (FindPackageHandleStandardArgs)
......
...@@ -43,6 +43,11 @@ if (ENABLE_SPNAV) ...@@ -43,6 +43,11 @@ if (ENABLE_SPNAV)
else() else()
set(spnav_enabled 0) set(spnav_enabled 0)
endif() 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_generator "CMake")
set(CONFIG_HH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/config.hh") set(CONFIG_HH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/config.hh")
......
...@@ -30,4 +30,5 @@ ...@@ -30,4 +30,5 @@
#define OST_DOUBLE_PRECISION @double_prec@ #define OST_DOUBLE_PRECISION @double_prec@
#define OST_STATIC_PROPERTY_WORKAROUND @static_props@ #define OST_STATIC_PROPERTY_WORKAROUND @static_props@
#define OST_SPNAV_ENABLED @spnav_enabled@ #define OST_SPNAV_ENABLED @spnav_enabled@
#define OST_FFT_USE_THREADS @fftw_use_threads@
#endif #endif
...@@ -93,9 +93,9 @@ line_average.hh ...@@ -93,9 +93,9 @@ line_average.hh
rscrosscorr.hh rscrosscorr.hh
) )
include(${QT_USE_FILE})
module(NAME img_alg SOURCES "${OST_IMG_ALG_SOURCES}" module(NAME img_alg SOURCES "${OST_IMG_ALG_SOURCES}"
HEADERS "${OST_IMG_ALG_HEADERS}" HEADERS "${OST_IMG_ALG_HEADERS}"
HEADER_OUTPUT_DIR ost/img/alg HEADER_OUTPUT_DIR ost/img/alg
DEPENDS_ON img DEPENDS_ON img
LINK ${FFTW_LIBRARIES}) LINK ${FFTW_LIBRARIES} ${QT_QTCORE_LIBRARY})
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <fftw3.h> #include <fftw3.h>
#include <QThread>
#include <ost/message.hh> #include <ost/message.hh>
#include <ost/img/value_util.hh> #include <ost/img/value_util.hh>
...@@ -54,8 +55,14 @@ int half_plus_one(int n) { ...@@ -54,8 +55,14 @@ int half_plus_one(int n) {
} // anon ns } // anon ns
FFTFnc::FFTFnc(): ori_flag_(false) {} FFTFnc::FFTFnc(): ori_flag_(false)
FFTFnc::FFTFnc(bool f): ori_flag_(f) {} {
OST_FFTW_fftw_init_threads();
}
FFTFnc::FFTFnc(bool f): ori_flag_(f)
{
OST_FFTW_fftw_init_threads();
}
// real spatial -> complex half-frequency // real spatial -> complex half-frequency
...@@ -119,7 +126,7 @@ reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData()); ...@@ -119,7 +126,7 @@ reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData());
for(size_t i=0;i<block_count;i++) { 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]); 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, OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft_r2c(rank,n,
fftw_in,fftw_out, fftw_in,fftw_out,
FFTW_ESTIMATE); FFTW_ESTIMATE);
...@@ -202,6 +209,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,HalfFrequencyDomain>(const ComplexH ...@@ -202,6 +209,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,HalfFrequencyDomain>(const ComplexH
Real* fftw_out = reinterpret_cast<Real*>(out_ptr); Real* fftw_out = reinterpret_cast<Real*>(out_ptr);
assert(sizeof(OST_FFTW_fftw_complex)==sizeof(Complex)); 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 = OST_FFTW_fftw_complex* fftw_in =
reinterpret_cast<OST_FFTW_fftw_complex*>(out_ptr); reinterpret_cast<OST_FFTW_fftw_complex*>(out_ptr);
...@@ -247,6 +255,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,SpatialDomain>(const ComplexSpatial ...@@ -247,6 +255,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,SpatialDomain>(const ComplexSpatial
reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData()); reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData());
// in place transform // 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, OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft(rank,n,
fftw_out, fftw_out, fftw_out, fftw_out,
dir, dir,
...@@ -284,6 +293,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,FrequencyDomain>(const ComplexFrequ ...@@ -284,6 +293,7 @@ ImageStateBasePtr FFTFnc::VisitState<Complex,FrequencyDomain>(const ComplexFrequ
reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData()); reinterpret_cast<OST_FFTW_fftw_complex*>(out_state->Data().GetData());
// in place transform // 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, OST_FFTW_fftw_plan plan = OST_FFTW_fftw_plan_dft(rank,n,
fftw_out, fftw_out, fftw_out, fftw_out,
dir, dir,
......
...@@ -68,4 +68,19 @@ Author: Juergen Haas ...@@ -68,4 +68,19 @@ Author: Juergen Haas
#define OST_FFTW_fftw_plan_dft_c2r fftwf_plan_dft_c2r #define OST_FFTW_fftw_plan_dft_c2r fftwf_plan_dft_c2r
#define OST_FFTW_fftw_plan_many_dft fftwf_plan_many_dft #define OST_FFTW_fftw_plan_many_dft fftwf_plan_many_dft
#endif #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 #endif
...@@ -155,7 +155,7 @@ LineIterator LineIterator::operator++(int) ...@@ -155,7 +155,7 @@ LineIterator LineIterator::operator++(int)
{ {
LineIterator tmp(*this); LineIterator tmp(*this);
this->operator++(); this->operator++();
return tmp;; return tmp;
} }
ExtentIterator LineIterator::GetNextLine() ExtentIterator LineIterator::GetNextLine()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment