From 8ac63adc77a3b6c3b3dd88f36ffd9f50b780a885 Mon Sep 17 00:00:00 2001 From: Mark Borgerding Date: Sat, 1 Nov 2003 04:44:50 +0000 Subject: [PATCH] modified time benchmark to repeat same buffer over and over to avoid IO bottlenecks and get more consistent numbers. --- kiss_fft.c | 39 ++++++++++++++++++++++++++++++++- test/Makefile | 11 +++++----- test/speedtest.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ tools/Makefile | 11 +++++----- tools/fftutil.c | 17 ++++++++++----- 5 files changed, 118 insertions(+), 16 deletions(-) create mode 100755 test/speedtest.c diff --git a/kiss_fft.c b/kiss_fft.c index f54b176..e852b9b 100644 --- a/kiss_fft.c +++ b/kiss_fft.c @@ -206,6 +206,43 @@ void bfly3( }while(--m); } +void bfly5( + kiss_fft_cpx * Fout, + int fstride, + const kiss_fft_state * st, + int m + ) +{ + int u,k,q1,q; + const int p=5; + kiss_fft_cpx * scratch = st->scratch; + kiss_fft_cpx * twiddles = st->twiddles; + kiss_fft_cpx t; + int Norig = st->nfft; + + for ( u=0; u=Norig) twidx-=Norig; + C_MUL(t,scratch[q] , twiddles[twidx] ); + C_ADDTO( Fout[ k ] ,t); + } + k += m; + } + } +} + /* perform the butterfly for one stage of a mixed radix FFT */ void bfly_generic( kiss_fft_cpx * Fout, @@ -268,6 +305,7 @@ void fft_work( case 2: bfly2(Fout,fstride,st,m); break; case 3: bfly3(Fout,fstride,st,m); break; case 4: bfly4(Fout,fstride,st,m); break; + case 5: bfly5(Fout,fstride,st,m); break; default: bfly_generic(Fout,fstride,st,m,p); break; } } @@ -304,7 +342,6 @@ void * kiss_fft_alloc(int nfft,int inverse_fft) st->scratch = (kiss_fft_cpx*)(st->tmpbuf + nfft); st->factors = (int*)(st->scratch + nfft); /* just after tmpbuf*/ - for (i=0;i $(RANDDAT) + ./rand_fft_data.py -n 1 -N $(NFFT) -t $(DATATYPE) > $(RANDDAT) time: all $(RANDDAT) @echo @echo -n "#### timing $(NUMFFTS) x $(NFFT) point FFTs. "; factor $(NFFT) @if [ -x ~/fftw/st ] && [ $(DATATYPE) == "double" ]; then \ echo "#### FFTW FFT $(DATATYPE)"; \ - time ~/fftw/st -n $(NFFT) < $(RANDDAT) > /dev/null;\ + time ~/fftw/st -x $(NUMFFTS) -n $(NFFT) < $(RANDDAT) > /dev/null;\ fi @echo "#### KISS FFT $(DATATYPE)" - @time ./$(UTIL) -n $(NFFT) < $(RANDDAT) > /dev/null + @time ./$(UTIL) -x $(NUMFFTS) -n $(NFFT) < $(RANDDAT) > /dev/null @rm $(RANDDAT) POW2=256 512 1024 2048 POW3=243 729 2187 +POW5=25 125 625 mtime: all - @for n in $(POW2) ;do \ + @for n in $(POW5) ;do \ export NFFT=$$n;make time; \ done diff --git a/test/speedtest.c b/test/speedtest.c new file mode 100755 index 0000000..a7af70f --- /dev/null +++ b/test/speedtest.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include + + +int main(int argc,char ** argv) +{ + int nfft=1024; + int isinverse=0; + FILE *fin=stdin; + FILE *fout=stdout; + int times=1,i; + + fftw_complex * in=NULL; + fftw_complex * out=NULL; + fftw_plan p; + + while (1) { + int c = getopt (argc, argv, "n:ix:"); + if (c == -1) + break; + switch (c) { + case 'n': + nfft = atoi (optarg); + break; + case 'x': + times = atoi (optarg); + break; + case 'i': + isinverse = 1; + break; + } + } + //fprintf(stderr,"sizeof(fftw_complex) = %d \n" , sizeof(fftw_complex) ); + fprintf(stderr,"sizeof(fftw_complex[0]) = %d \n" , sizeof((*in)[0]) ); + + in=fftw_malloc(sizeof(fftw_complex) * nfft); + out=fftw_malloc(sizeof(fftw_complex) * nfft); + if ( isinverse ) + p = fftw_plan_dft_1d(nfft, in, out, FFTW_BACKWARD, FFTW_ESTIMATE); + else + p = fftw_plan_dft_1d(nfft, in, out, FFTW_FORWARD, FFTW_ESTIMATE); + + while ( fread( in , sizeof(fftw_complex) , nfft , fin ) > 0 ) { + for (i=0;i $(RANDDAT) + ./rand_fft_data.py -n 1 -N $(NFFT) -t $(DATATYPE) > $(RANDDAT) time: all $(RANDDAT) @echo @echo -n "#### timing $(NUMFFTS) x $(NFFT) point FFTs. "; factor $(NFFT) @if [ -x ~/fftw/st ] && [ $(DATATYPE) == "double" ]; then \ echo "#### FFTW FFT $(DATATYPE)"; \ - time ~/fftw/st -n $(NFFT) < $(RANDDAT) > /dev/null;\ + time ~/fftw/st -x $(NUMFFTS) -n $(NFFT) < $(RANDDAT) > /dev/null;\ fi @echo "#### KISS FFT $(DATATYPE)" - @time ./$(UTIL) -n $(NFFT) < $(RANDDAT) > /dev/null + @time ./$(UTIL) -x $(NUMFFTS) -n $(NFFT) < $(RANDDAT) > /dev/null @rm $(RANDDAT) POW2=256 512 1024 2048 POW3=243 729 2187 +POW5=25 125 625 mtime: all - @for n in $(POW2) ;do \ + @for n in $(POW5) ;do \ export NFFT=$$n;make time; \ done diff --git a/tools/fftutil.c b/tools/fftutil.c index a6184be..304401e 100644 --- a/tools/fftutil.c +++ b/tools/fftutil.c @@ -26,16 +26,20 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -void fft_file(FILE * fin,FILE * fout,int nfft,int isinverse,int useascii) +void fft_file(FILE * fin,FILE * fout,int nfft,int isinverse,int useascii,int times) { + int i; void *st; kiss_fft_cpx * buf; + kiss_fft_cpx * bufout; buf = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * nfft ); + bufout = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * nfft ); st = kiss_fft_alloc( nfft ,isinverse ); while ( fread( buf , sizeof(kiss_fft_cpx) * nfft ,1, fin ) > 0 ) { - kiss_fft( st , buf ); + for (i=0;i