Doxygen Source Code Documentation
csfft_cache.c File Reference
#include <sys/types.h>#include <sys/time.h>#include <sys/errno.h>#include <sys/times.h>#include <limits.h>#include "mrilib.h"Go to the source code of this file.
Defines | |
| #define | FFT_LEN 128 |
| #define | FFT_POW 7 |
| #define | FFT_NUM 100000 |
| #define | MAX_NVEC 256 |
Functions | |
| double | COX_cpu_time (void) |
| int | main (int argc, char *argv[]) |
Define Documentation
|
|
Definition at line 12 of file csfft_cache.c. Referenced by main(). |
|
|
Definition at line 14 of file csfft_cache.c. Referenced by main(). |
|
|
Definition at line 13 of file csfft_cache.c. Referenced by main(). |
|
|
Definition at line 15 of file csfft_cache.c. Referenced by main(). |
Function Documentation
|
|
Definition at line 104 of file csfft_cache.c. Referenced by main(), swaptest(), and VOLREG_main().
00105 {
00106 struct tms ttt ;
00107 (void) times( &ttt ) ;
00108 return ( (double) (ttt.tms_utime) / (double) CLK_TCK ) ;
00109 }
|
|
||||||||||||
|
convert DTIStudio fiber format data to SUMA segment data Definition at line 19 of file csfft_cache.c. References argc, COX_cpu_time(), csfft_cox(), csfft_many(), FFT_LEN, FFT_NUM, FFT_POW, complex::i, malloc, MAX_NVEC, and complex::r.
00020 {
00021 int nvec , kk , ii , nvec_now , itop , iarg , fft_len,fft_pow,fft_ops,fft_num,max_nvec ;
00022 complex * cx ;
00023 float fac ;
00024 double cptime , mflops ;
00025
00026 if( argc > 1 && strncmp(argv[1],"-help",5) == 0 ){
00027 printf("Usage: csfft_cache [-len #] [-num #] [-maxvec #]\n"
00028 "* Does lots of FFTs and determines how many at once are efficient.\n"
00029 "Options:\n"
00030 " -len # sets FFT length to '#' (power of 2); default = 128\n"
00031 " -num # number of FFTs to do for timing; default = 100000\n"
00032 " -maxvec # maximum number of FFTs to do at once; default = 256\n"
00033 ) ;
00034 exit(0) ;
00035 }
00036
00037 fft_len = FFT_LEN ;
00038 fft_pow = FFT_POW ;
00039 fft_num = FFT_NUM ;
00040 max_nvec = MAX_NVEC ;
00041 iarg = 1 ;
00042 while( iarg < argc && argv[iarg][0] == '-' ){
00043 if( strncmp(argv[iarg],"-len",4) == 0 ){
00044 fft_len = strtol( argv[++iarg] , NULL , 10 ) ;
00045 if( fft_len < 4 ){fprintf(stderr,"illegal -len\a\n");exit(1);}
00046 for( ii=2,kk=4 ; kk < fft_len ; kk *= 2,ii++ ) ; /* nada */
00047 if( kk != fft_len ){fprintf(stderr,"illegal -len\a\n");exit(1);}
00048 fft_pow = ii ;
00049 iarg++ ; continue ;
00050 }
00051
00052 if( strncmp(argv[iarg],"-num",4) == 0 ){
00053 fft_num = strtol( argv[++iarg] , NULL , 10 ) ;
00054 if( fft_num < 1 ){fprintf(stderr,"illegal -num\a\n");exit(1);}
00055 iarg++ ; continue ;
00056 }
00057
00058 if( strncmp(argv[iarg],"-maxvec",5) == 0 ){
00059 max_nvec = strtol( argv[++iarg] , NULL , 10 ) ;
00060 if( max_nvec < 2 ){fprintf(stderr,"illegal -maxvec\a\n");exit(1);}
00061 iarg++ ; continue ;
00062 }
00063 }
00064 fft_ops = (5*fft_pow+2)*fft_len ;
00065 fac = sqrt(1.0/fft_len) ;
00066
00067 cx = (complex *) malloc( sizeof(complex) * fft_len * max_nvec ) ;
00068 for( ii=0 ; ii < fft_len ; ii++ ){ cx[ii].r = ii ; cx[ii].i = -0.3*ii ; }
00069
00070 csfft_cox( -1 , fft_len , cx ) ; /* to initialize trig constants */
00071
00072 for( nvec=1 ; nvec <= max_nvec ; nvec = (nvec<4) ? (nvec+1) : (1.414*nvec+0.5) ){
00073 for( ii=0 ; ii < fft_len*nvec ; ii++ ){ cx[ii].r = ii ; cx[ii].i = -0.3*ii ; }
00074
00075 cptime = COX_cpu_time() ;
00076 #if 0
00077 if( nvec == 1 ){
00078 #else
00079 if( nvec == 0 ){
00080 #endif
00081 for( kk=0 ; kk < fft_num ; kk++ ){
00082 csfft_cox( -1 , fft_len , cx ) ;
00083 for( ii=0 ; ii < fft_len ; ii++ ){ cx[ii].r *= fac ; cx[ii].i *= fac ; }
00084 }
00085 } else {
00086 int nvec_now ;
00087 for( kk=0 ; kk < fft_num ; kk+=nvec ){
00088 nvec_now = fft_num - kk ; if( nvec_now > nvec ) nvec_now = nvec ;
00089 csfft_many( -1 , fft_len , nvec_now , cx ) ;
00090 itop = fft_len*nvec_now ;
00091 for( ii=0 ; ii < itop ; ii++ ){ cx[ii].r *= fac ; cx[ii].i *= fac ; }
00092 }
00093 }
00094 cptime = COX_cpu_time() - cptime ;
00095 mflops = fft_num * fft_ops / ( 1.e6 * cptime ) ;
00096 printf("FFT cache size %6d bytes gives %10.2f Mflops"
00097 " (%d FFTs, size %d, %d at a time, in %g sec)\n",
00098 sizeof(complex)*fft_len*nvec , mflops , fft_num,fft_len,nvec,cptime) ;
00099 }
00100
00101 exit(0) ;
00102 }
|