From 1922ba0d4e5753d9c7878cc5550cb61e6e55dcf8 Mon Sep 17 00:00:00 2001 From: Mark Borgerding Date: Tue, 14 Nov 2006 19:40:58 +0000 Subject: [PATCH] update benchmark tool to allow multi-dimensional and/or real FFTs --- test/Makefile | 2 +- test/benchkiss.c | 127 ++++++++++++++++++++++++++++++-------------- tools/kiss_fftndr.c | 28 ++++------ 3 files changed, 98 insertions(+), 59 deletions(-) diff --git a/test/Makefile b/test/Makefile index ffebccb..da2dd59 100644 --- a/test/Makefile +++ b/test/Makefile @@ -48,7 +48,7 @@ endif FFTWLIBDIR=-L/usr/local/lib/ -SRCFILES=../kiss_fft.c ../tools/kiss_fftnd.c ../tools/kiss_fftr.c pstats.c ../tools/kfc.c +SRCFILES=../kiss_fft.c ../tools/kiss_fftnd.c ../tools/kiss_fftr.c pstats.c ../tools/kfc.c ../tools/kiss_fftndr.c all: tools $(BENCHKISS) $(SELFTEST) $(BENCHFFTW) $(TESTREAL) $(TESTKFC) diff --git a/test/benchkiss.c b/test/benchkiss.c index 378eef5..e7b9cfe 100644 --- a/test/benchkiss.c +++ b/test/benchkiss.c @@ -3,72 +3,117 @@ #include #include #include "kiss_fft.h" +#include "kiss_fftr.h" +#include "kiss_fftnd.h" +#include "kiss_fftndr.h" #include "pstats.h" +static +int getdims(int * dims, char * arg) +{ + char *s; + int ndims=0; + while ( (s=strtok( arg , ",") ) ) { + dims[ndims++] = atoi(s); + //printf("%s=%d\n",s,dims[ndims-1]); + arg=NULL; + } + return ndims; +} int main(int argc,char ** argv) { - int nfft=1024; + int k; + int nfft[32]; + int ndims = 1; int isinverse=0; int numffts=1000,i; kiss_fft_cpx * buf; kiss_fft_cpx * bufout; - kiss_fft_cfg st; + int real = 0; + + nfft[0] = 1024;// default while (1) { - int c = getopt (argc, argv, "n:ix:"); - if (c == -1) - break; - switch (c) { - case 'n': - nfft = atoi (optarg); - if (nfft != kiss_fft_next_fast_size(nfft) ) { - int ng = kiss_fft_next_fast_size(nfft); - fprintf(stderr,"warning: %d might be a better choice for speed than %d\n",ng,nfft); + int c = getopt (argc, argv, "n:ix:r"); + if (c == -1) + break; + switch (c) { + case 'r': + real = 1; + break; + case 'n': + ndims = getdims(nfft, optarg ); + if (nfft[0] != kiss_fft_next_fast_size(nfft[0]) ) { + int ng = kiss_fft_next_fast_size(nfft[0]); + fprintf(stderr,"warning: %d might be a better choice for speed than %d\n",ng,nfft[0]); + } + break; + case 'x': + numffts = atoi (optarg); + break; + case 'i': + isinverse = 1; + break; } - break; - case 'x': - numffts = atoi (optarg); - break; - case 'i': - isinverse = 1; - break; - } } -#ifdef USE_SIMD - buf=(kiss_fft_cpx*)memalign(sizeof(kiss_fft_cpx),sizeof(kiss_fft_cpx) * nfft); - bufout=(kiss_fft_cpx*)memalign(sizeof(kiss_fft_cpx),sizeof(kiss_fft_cpx) * nfft); + int nbytes = sizeof(kiss_fft_cpx); + for (k=0;kdimReal; int dimOther = st->dimOther; + int nrbins = dimReal/2+1; kiss_fft_cpx * tmp1 = (kiss_fft_cpx*)st->tmpbuf; - kiss_fft_cpx * tmp2; - if (dimReal/2+1 > dimOther) - tmp2 = tmp1+dimReal/2+1; - else - tmp2 = tmp1+dimOther; + kiss_fft_cpx * tmp2 = tmp1 + MAX(nrbins,dimOther); // timedata is N0 x N1 x ... x Nk real // take a real chunk of data, fft it and place the output at correct intervals for (k1=0;k1cfg_r, timedata + k1*dimReal , tmp1 ); // tmp1 now holds dimReal/2+1 complex points - for (k2=0;k2cfg_r, timedata + k1*dimReal , tmp1 ); // tmp1 now holds nrbins complex points + for (k2=0;k2cfg_nd, tmp2+k2*dimOther, tmp1); // tmp1 now holds dimOther complex points for (k1=0;k1dimReal; int dimOther = st->dimOther; + int nrbins = dimReal/2+1; kiss_fft_cpx * tmp1 = (kiss_fft_cpx*)st->tmpbuf; - kiss_fft_cpx * tmp2; - if (dimReal/2+1 > dimOther) - tmp2 = tmp1+dimReal/2+1; - else - tmp2 = tmp1+dimOther; + kiss_fft_cpx * tmp2 = tmp1 + MAX(nrbins,dimOther); - for (k2=0;k2cfg_nd, tmp1, tmp2+k2*dimOther); } for (k1=0;k1cfg_r,tmp1,timedata + k1*dimReal); }