From cd94cd1ed0b16b4ba17b498a1950ecdc6e9aca71 Mon Sep 17 00:00:00 2001 From: Mark Borgerding Date: Mon, 29 Dec 2003 16:38:03 +0000 Subject: [PATCH] testing kfc (kiss fft cache) --- test/Makefile | 6 +++- test/kf1s.c | 60 --------------------------------- tools/Makefile | 6 +++- tools/kfc.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 62 deletions(-) delete mode 100644 test/kf1s.c create mode 100644 tools/kfc.c diff --git a/test/Makefile b/test/Makefile index c0d8ed1..c4087f3 100644 --- a/test/Makefile +++ b/test/Makefile @@ -13,6 +13,7 @@ BENCHKISS=bm_kiss_$(DATATYPE) BENCHFFTW=bm_fftw_$(DATATYPE) SELFTEST=st_$(DATATYPE) TESTREAL=tr_$(DATATYPE) +TESTKFC=tc_$(DATATYPE) FFTUTIL=kf_$(DATATYPE) ifeq "$(DATATYPE)" "short" @@ -31,7 +32,7 @@ else endif -all: $(BENCHKISS) $(SELFTEST) $(BENCHFFTW) $(TESTREAL) $(FFTUTIL) +all: $(BENCHKISS) $(SELFTEST) $(BENCHFFTW) $(TESTREAL) $(FFTUTIL) $(TESTKFC) #CFLAGS=-Wall -O3 -ansi -pedantic -march=pentiumpro -ffast-math -fomit-frame-pointer # If the above flags do not work, try the following @@ -43,6 +44,8 @@ $(FFTUTIL): ../kiss_fft.c fftutil.c kiss_fft2d.c kiss_fftr.c $(SELFTEST): ../kiss_fft.c $(SELFTESTSRC) $(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ +$(TESTKFC): ../kiss_fft.c kiss_fftr.c test_real.c + $(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ $(TESTREAL): ../kiss_fft.c kiss_fftr.c test_real.c $(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ @@ -53,6 +56,7 @@ $(BENCHFFTW): benchfftw.c pstats.c @$(CC) -o $@ $(CFLAGS) -DDATATYPE$(DATATYPE) benchfftw.c pstats.c -lm -l$(FFTWLIB) -L/usr/local/lib/ || echo "FFTW not available for comparison" test: all + @./$(TESTKFC) @echo "======SELF TEST $(DATATYPE)" @./$(SELFTEST) @echo "======REAL FFT TEST $(DATATYPE)" diff --git a/test/kf1s.c b/test/kf1s.c deleted file mode 100644 index 75fbd4a..0000000 --- a/test/kf1s.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "kiss_fft.h" - -typedef struct -{ - int nfft; - int inverse; - const void * cfg; - void * next; -} cached_fft; - -static cached_fft *cache_root=NULL; - -static const void * find_cached_fft(int nfft,int inverse) -{ - size_t len; - cached_fft * cur=cache_root; - cached_fft * prev=NULL; - while ( cur ) { - if ( cur->nfft == nfft && inverse == cur->inverse ) - return cur->cfg; - prev = cur; - cur = (cached_fft*)prev->next; - } - - // no cached node found, need to create a new one - kiss_fft_alloc(nfft,inverse,0,&len); - cur = (cached_fft*)malloc(sizeof(cached_fft) + len ); - if (cur == NULL) - return NULL; - cur->cfg = kiss_fft_alloc(nfft,inverse,cur+1,&len); - cur->nfft=nfft; - cur->inverse=inverse; - if ( prev ) - prev->next = cur; - else - cache_root = cur; - return cur->cfg; -} - -void kfc_fft(int nfft, const kiss_fft_cpx * fin,kiss_fft_cpx * fout) -{ - kiss_fft( find_cached_fft(nfft,0),fin,fout ); -} - -void kfc_ifft(int nfft, const kiss_fft_cpx * fin,kiss_fft_cpx * fout) -{ - kiss_fft( find_cached_fft(nfft,1),fin,fout ); -} - -void kfc_cleanup() -{ - cached_fft * cur=cache_root; - cached_fft * next=NULL; - while (cur){ - next = (cached_fft*)cur->next; - free(cur); - cur=(cached_fft*)next; - } - cache_root = NULL; -} diff --git a/tools/Makefile b/tools/Makefile index c0d8ed1..c4087f3 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -13,6 +13,7 @@ BENCHKISS=bm_kiss_$(DATATYPE) BENCHFFTW=bm_fftw_$(DATATYPE) SELFTEST=st_$(DATATYPE) TESTREAL=tr_$(DATATYPE) +TESTKFC=tc_$(DATATYPE) FFTUTIL=kf_$(DATATYPE) ifeq "$(DATATYPE)" "short" @@ -31,7 +32,7 @@ else endif -all: $(BENCHKISS) $(SELFTEST) $(BENCHFFTW) $(TESTREAL) $(FFTUTIL) +all: $(BENCHKISS) $(SELFTEST) $(BENCHFFTW) $(TESTREAL) $(FFTUTIL) $(TESTKFC) #CFLAGS=-Wall -O3 -ansi -pedantic -march=pentiumpro -ffast-math -fomit-frame-pointer # If the above flags do not work, try the following @@ -43,6 +44,8 @@ $(FFTUTIL): ../kiss_fft.c fftutil.c kiss_fft2d.c kiss_fftr.c $(SELFTEST): ../kiss_fft.c $(SELFTESTSRC) $(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ +$(TESTKFC): ../kiss_fft.c kiss_fftr.c test_real.c + $(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ $(TESTREAL): ../kiss_fft.c kiss_fftr.c test_real.c $(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ @@ -53,6 +56,7 @@ $(BENCHFFTW): benchfftw.c pstats.c @$(CC) -o $@ $(CFLAGS) -DDATATYPE$(DATATYPE) benchfftw.c pstats.c -lm -l$(FFTWLIB) -L/usr/local/lib/ || echo "FFTW not available for comparison" test: all + @./$(TESTKFC) @echo "======SELF TEST $(DATATYPE)" @./$(SELFTEST) @echo "======REAL FFT TEST $(DATATYPE)" diff --git a/tools/kfc.c b/tools/kfc.c new file mode 100644 index 0000000..a044efd --- /dev/null +++ b/tools/kfc.c @@ -0,0 +1,91 @@ +#include "kiss_fft.h" + +typedef struct +{ + int nfft; + int inverse; + const void * cfg; + void * next; +} cached_fft; + +static cached_fft *cache_root=NULL; +static int ncached=0; + +static const void * find_cached_fft(int nfft,int inverse) +{ + size_t len; + cached_fft * cur=cache_root; + cached_fft * prev=NULL; + while ( cur ) { + if ( cur->nfft == nfft && inverse == cur->inverse ) + break;//found the right node + prev = cur; + cur = (cached_fft*)prev->next; + } + if (cur== NULL) { + // no cached node found, need to create a new one + kiss_fft_alloc(nfft,inverse,0,&len); + cur = (cached_fft*)malloc(sizeof(cached_fft) + len ); + if (cur == NULL) + return NULL; + cur->cfg = cur+1; + kiss_fft_alloc(nfft,inverse,cur->cfg,&len); + cur->nfft=nfft; + cur->inverse=inverse; + cur->next = NULL; + if ( prev ) + prev->next = cur; + else + cache_root = cur; + ++ncached; + } + return cur->cfg; +} + +void kfc_cleanup() +{ + cached_fft * cur=cache_root; + cached_fft * next=NULL; + while (cur){ + next = (cached_fft*)cur->next; + free(cur); + cur=(cached_fft*)next; + } + ncached=0; + cache_root = NULL; +} +void kfc_fft(int nfft, const kiss_fft_cpx * fin,kiss_fft_cpx * fout) +{ + kiss_fft( find_cached_fft(nfft,0),fin,fout ); +} + +void kfc_ifft(int nfft, const kiss_fft_cpx * fin,kiss_fft_cpx * fout) +{ + kiss_fft( find_cached_fft(nfft,1),fin,fout ); +} + +#ifdef KFC_TEST +static void check(int nc) +{ + if (ncached != nc) { + fprintf(stderr,"ncached should be %d,but it is %d\n",nc,ncached); + exit(1); + } +} + +int main(int argc,char ** argv) +{ + kiss_fft_cpx buf1[1024],buf2[1024]; + memset(buf1,0,sizeof(buf1)); + check(0); + kfc_fft(512,buf1,buf2); + check(1); + kfc_fft(512,buf1,buf2); + check(1); + kfc_ifft(512,buf1,buf2); + check(2); + kfc_cleanup(); + check(0); + return 0; +} +#endif