testing kfc (kiss fft cache)

This commit is contained in:
Mark Borgerding 2003-12-29 16:38:03 +00:00
parent 0bd304429d
commit cd94cd1ed0
4 changed files with 101 additions and 62 deletions

View File

@ -13,6 +13,7 @@ BENCHKISS=bm_kiss_$(DATATYPE)
BENCHFFTW=bm_fftw_$(DATATYPE) BENCHFFTW=bm_fftw_$(DATATYPE)
SELFTEST=st_$(DATATYPE) SELFTEST=st_$(DATATYPE)
TESTREAL=tr_$(DATATYPE) TESTREAL=tr_$(DATATYPE)
TESTKFC=tc_$(DATATYPE)
FFTUTIL=kf_$(DATATYPE) FFTUTIL=kf_$(DATATYPE)
ifeq "$(DATATYPE)" "short" ifeq "$(DATATYPE)" "short"
@ -31,7 +32,7 @@ else
endif 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 #CFLAGS=-Wall -O3 -ansi -pedantic -march=pentiumpro -ffast-math -fomit-frame-pointer
# If the above flags do not work, try the following # 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) $(SELFTEST): ../kiss_fft.c $(SELFTESTSRC)
$(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ $(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 $(TESTREAL): ../kiss_fft.c kiss_fftr.c test_real.c
$(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ $(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" @$(CC) -o $@ $(CFLAGS) -DDATATYPE$(DATATYPE) benchfftw.c pstats.c -lm -l$(FFTWLIB) -L/usr/local/lib/ || echo "FFTW not available for comparison"
test: all test: all
@./$(TESTKFC)
@echo "======SELF TEST $(DATATYPE)" @echo "======SELF TEST $(DATATYPE)"
@./$(SELFTEST) @./$(SELFTEST)
@echo "======REAL FFT TEST $(DATATYPE)" @echo "======REAL FFT TEST $(DATATYPE)"

View File

@ -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;
}

View File

@ -13,6 +13,7 @@ BENCHKISS=bm_kiss_$(DATATYPE)
BENCHFFTW=bm_fftw_$(DATATYPE) BENCHFFTW=bm_fftw_$(DATATYPE)
SELFTEST=st_$(DATATYPE) SELFTEST=st_$(DATATYPE)
TESTREAL=tr_$(DATATYPE) TESTREAL=tr_$(DATATYPE)
TESTKFC=tc_$(DATATYPE)
FFTUTIL=kf_$(DATATYPE) FFTUTIL=kf_$(DATATYPE)
ifeq "$(DATATYPE)" "short" ifeq "$(DATATYPE)" "short"
@ -31,7 +32,7 @@ else
endif 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 #CFLAGS=-Wall -O3 -ansi -pedantic -march=pentiumpro -ffast-math -fomit-frame-pointer
# If the above flags do not work, try the following # 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) $(SELFTEST): ../kiss_fft.c $(SELFTESTSRC)
$(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ $(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 $(TESTREAL): ../kiss_fft.c kiss_fftr.c test_real.c
$(CC) -o $@ $(CFLAGS) -I.. $(TYPEFLAGS) -lm $+ $(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" @$(CC) -o $@ $(CFLAGS) -DDATATYPE$(DATATYPE) benchfftw.c pstats.c -lm -l$(FFTWLIB) -L/usr/local/lib/ || echo "FFTW not available for comparison"
test: all test: all
@./$(TESTKFC)
@echo "======SELF TEST $(DATATYPE)" @echo "======SELF TEST $(DATATYPE)"
@./$(SELFTEST) @./$(SELFTEST)
@echo "======REAL FFT TEST $(DATATYPE)" @echo "======REAL FFT TEST $(DATATYPE)"

91
tools/kfc.c Normal file
View File

@ -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