diff options
author | Benoit Jacob <jacob.benoit.1@gmail.com> | 2009-10-28 19:06:45 -0400 |
---|---|---|
committer | Benoit Jacob <jacob.benoit.1@gmail.com> | 2009-10-28 19:06:45 -0400 |
commit | e8dd552257f0e886ee281aa84b7094fc489608d0 (patch) | |
tree | 596633c4d3e721b6d4fad31520423b9c0e03bf8a /bench | |
parent | 2840ac7e948ecb3c7b19ba8f581f829a4a4e1fea (diff) | |
parent | 6219f9acfa61e54baf266f816b7eaf9ffbd9841e (diff) |
sync with mainline
Diffstat (limited to 'bench')
-rw-r--r-- | bench/BenchTimer.h | 34 | ||||
-rw-r--r-- | bench/benchFFT.cpp | 115 |
2 files changed, 145 insertions, 4 deletions
diff --git a/bench/BenchTimer.h b/bench/BenchTimer.h index bfc3a99b3..c1f473597 100644 --- a/bench/BenchTimer.h +++ b/bench/BenchTimer.h @@ -26,8 +26,14 @@ #ifndef EIGEN_BENCH_TIMER_H #define EIGEN_BENCH_TIMER_H +#ifndef WIN32 #include <sys/time.h> #include <unistd.h> +#else +#define NOMINMAX +#include <windows.h> +#endif + #include <cstdlib> #include <numeric> @@ -40,7 +46,15 @@ class BenchTimer { public: - BenchTimer() { reset(); } + BenchTimer() + { +#ifdef WIN32 + LARGE_INTEGER freq; + QueryPerformanceFrequency(&freq); + m_frequency = (double)freq.QuadPart; +#endif + reset(); + } ~BenchTimer() {} @@ -51,23 +65,35 @@ public: m_best = std::min(m_best, getTime() - m_start); } - /** Return the best elapsed time. + /** Return the best elapsed time in seconds. */ inline double value(void) { - return m_best; + return m_best; } +#ifdef WIN32 + inline double getTime(void) +#else static inline double getTime(void) +#endif { +#ifdef WIN32 + LARGE_INTEGER query_ticks; + QueryPerformanceCounter(&query_ticks); + return query_ticks.QuadPart/m_frequency; +#else struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); return (double)tv.tv_sec + 1.e-6 * (double)tv.tv_usec; +#endif } protected: - +#ifdef WIN32 + double m_frequency; +#endif double m_best, m_start; }; diff --git a/bench/benchFFT.cpp b/bench/benchFFT.cpp new file mode 100644 index 000000000..4b6cabb55 --- /dev/null +++ b/bench/benchFFT.cpp @@ -0,0 +1,115 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. Eigen itself is part of the KDE project. +// +// Copyright (C) 2009 Mark Borgerding mark a borgerding net +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see <http://www.gnu.org/licenses/>. + +#include <complex> +#include <vector> +#include <Eigen/Core> +#include <bench/BenchTimer.h> +#ifdef USE_FFTW +#include <fftw3.h> +#endif + +#include <unsupported/Eigen/FFT> + +using namespace Eigen; +using namespace std; + + +template <typename T> +string nameof(); + +template <> string nameof<float>() {return "float";} +template <> string nameof<double>() {return "double";} +template <> string nameof<long double>() {return "long double";} + +#ifndef TYPE +#define TYPE float +#endif + +#ifndef NFFT +#define NFFT 1024 +#endif +#ifndef NDATA +#define NDATA 1000000 +#endif + +using namespace Eigen; + +template <typename T> +void bench(int nfft,bool fwd) +{ + typedef typename NumTraits<T>::Real Scalar; + typedef typename std::complex<Scalar> Complex; + int nits = NDATA/nfft; + vector<T> inbuf(nfft); + vector<Complex > outbuf(nfft); + FFT< Scalar > fft; + + fft.fwd( outbuf , inbuf); + + BenchTimer timer; + timer.reset(); + for (int k=0;k<8;++k) { + timer.start(); + for(int i = 0; i < nits; i++) + if (fwd) + fft.fwd( outbuf , inbuf); + else + fft.inv(inbuf,outbuf); + timer.stop(); + } + + cout << nameof<Scalar>() << " "; + double mflops = 5.*nfft*log2((double)nfft) / (1e6 * timer.value() / (double)nits ); + if ( NumTraits<T>::IsComplex ) { + cout << "complex"; + }else{ + cout << "real "; + mflops /= 2; + } + + if (fwd) + cout << " fwd"; + else + cout << " inv"; + + cout << " NFFT=" << nfft << " " << (double(1e-6*nfft*nits)/timer.value()) << " MS/s " << mflops << "MFLOPS\n"; +} + +int main(int argc,char ** argv) +{ + bench<complex<float> >(NFFT,true); + bench<complex<float> >(NFFT,false); + bench<float>(NFFT,true); + bench<float>(NFFT,false); + bench<complex<double> >(NFFT,true); + bench<complex<double> >(NFFT,false); + bench<double>(NFFT,true); + bench<double>(NFFT,false); + bench<complex<long double> >(NFFT,true); + bench<complex<long double> >(NFFT,false); + bench<long double>(NFFT,true); + bench<long double>(NFFT,false); + return 0; +} |