aboutsummaryrefslogtreecommitdiffhomepage
path: root/bench
diff options
context:
space:
mode:
authorGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-10-28 19:06:45 -0400
committerGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-10-28 19:06:45 -0400
commite8dd552257f0e886ee281aa84b7094fc489608d0 (patch)
tree596633c4d3e721b6d4fad31520423b9c0e03bf8a /bench
parent2840ac7e948ecb3c7b19ba8f581f829a4a4e1fea (diff)
parent6219f9acfa61e54baf266f816b7eaf9ffbd9841e (diff)
sync with mainline
Diffstat (limited to 'bench')
-rw-r--r--bench/BenchTimer.h34
-rw-r--r--bench/benchFFT.cpp115
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;
+}