diff options
Diffstat (limited to 'graphics/asymptote/fftw++.cc')
-rw-r--r-- | graphics/asymptote/fftw++.cc | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/graphics/asymptote/fftw++.cc b/graphics/asymptote/fftw++.cc index 18071492e3..69a54934bb 100644 --- a/graphics/asymptote/fftw++.cc +++ b/graphics/asymptote/fftw++.cc @@ -1,18 +1,21 @@ #include <cstring> #include <sstream> + #include "fftw++.h" using namespace std; +using namespace utils; namespace fftwpp { const double fftw::twopi=2.0*acos(-1.0); +bool fftw::wiser=false; // User settings: -unsigned int fftw::effort=FFTW_MEASURE; -const char *fftw::WisdomName=".wisdom"; -unsigned int fftw::maxthreads=1; -double fftw::testseconds=0.2; // Time limit for threading efficiency tests +size_t fftw::effort=FFTW_MEASURE; +string wisdomName="wisdom3.txt"; +ostringstream wisdomTemp; +size_t fftw::maxthreads=1; fftw_plan (*fftw::planner)(fftw *f, Complex *in, Complex *out)=Planner; @@ -20,20 +23,17 @@ const char *fftw::oddshift="Shift is not implemented for odd nx"; const char *inout= "constructor and call must be both in place or both out of place"; -fft1d::Table fft1d::threadtable; -mfft1d::Table mfft1d::threadtable; -rcfft1d::Table rcfft1d::threadtable; -crfft1d::Table crfft1d::threadtable; -mrcfft1d::Table mrcfft1d::threadtable; -mcrfft1d::Table mcrfft1d::threadtable; -fft2d::Table fft2d::threadtable; +Mfft1d::Table Mfft1d::threadtable; +Mrcfft1d::Table Mrcfft1d::threadtable; +Mcrfft1d::Table Mcrfft1d::threadtable; -void LoadWisdom() +void loadWisdom() { static bool Wise=false; if(!Wise) { + wisdomTemp << wisdomName << "_" << getpid(); ifstream ifWisdom; - ifWisdom.open(fftw::WisdomName); + ifWisdom.open(wisdomName); ostringstream wisdom; wisdom << ifWisdom.rdbuf(); ifWisdom.close(); @@ -43,25 +43,34 @@ void LoadWisdom() } } -void SaveWisdom() +void saveWisdom() { - ofstream ofWisdom; - ofWisdom.open(fftw::WisdomName); - char *wisdom=fftw_export_wisdom_to_string(); - ofWisdom << wisdom; - fftw_free(wisdom); - ofWisdom.close(); + if(fftw::wiser) { + char *wisdom=fftw_export_wisdom_to_string(); + ofstream ofWisdom; + ofWisdom.open(wisdomTemp.str().c_str()); + ofWisdom << wisdom; + fftw_free(wisdom); + ofWisdom.close(); + rename(wisdomTemp.str().c_str(),wisdomName.c_str()); + fftw::wiser=false; + } } fftw_plan Planner(fftw *F, Complex *in, Complex *out) { - LoadWisdom(); + loadWisdom(); fftw::effort |= FFTW_WISDOM_ONLY; fftw_plan plan=F->Plan(in,out); fftw::effort &= ~FFTW_WISDOM_ONLY; if(!plan) { plan=F->Plan(in,out); - SaveWisdom(); + static bool first=true; + if(first) { + atexit(saveWisdom); + first=false; + } + fftw::wiser=true; } return plan; } @@ -71,5 +80,5 @@ ThreadBase::ThreadBase() {threads=fftw::maxthreads;} } namespace utils { -unsigned int defaultmpithreads=1; +size_t defaultmpithreads=1; } |