Doxygen Source Code Documentation
fftest.c File Reference
#include "mrilib.h"
#include <stdlib.h>
Go to the source code of this file.
Functions | |
int | main (int argc, char *argv[]) |
Function Documentation
|
\** File : SUMA.c
Input paramters :
Definition at line 12 of file fftest.c. References argc, COX_clock_time(), COX_cpu_time(), csfft_cox(), csfft_many(), csfft_nextup(), csfft_use_fftw(), complex::i, malloc, my_getenv(), and complex::r.
00013 { 00014 int num , len , ii , type_ux=0 , kk , iv , nvec , nvec_in ; 00015 complex * cx ; 00016 float fac ; 00017 double tcpu , tclock ; 00018 int narg=1 , quiet=0 ; 00019 float kbytes ; 00020 00021 if( argc < 4 ){printf("Usage: fftest [-q] len num nvec\n");exit(0);} 00022 00023 if( strcmp(argv[narg],"-q") == 0 ){ quiet++ ; narg++ ; } 00024 if( strcmp(argv[narg],"-q") == 0 ){ quiet++ ; narg++ ; } 00025 if( strcmp(argv[narg],"-q") == 0 ){ quiet++ ; narg++ ; } 00026 if( strcmp(argv[narg],"-q") == 0 ){ quiet++ ; narg++ ; } 00027 00028 (void) my_getenv("TMPDIR") ; 00029 00030 len = strtol( argv[narg++] , NULL , 10 ) ; 00031 num = strtol( argv[narg++] , NULL , 10 ) ; 00032 nvec_in = strtol( argv[narg++] , NULL , 10 ) ; 00033 00034 if( len > 0 && len != csfft_nextup(len) ){ 00035 fprintf(stderr,"Can't do FFT of length %d; try %d\n",len,csfft_nextup(len)); 00036 exit(1) ; 00037 } else if ( len < 0 ){ 00038 len = -len ; 00039 } 00040 00041 #ifdef USE_FFTW 00042 { int use_fftw = (nvec_in < 1) ; 00043 if( use_fftw ) nvec_in = 1 ; 00044 else csfft_use_fftw(0) ; 00045 } 00046 #else 00047 if( nvec_in < 1 ){fprintf(stderr,"Illegal nvec value!\n"); exit(1) ;} 00048 #endif 00049 00050 cx = (complex *) malloc( sizeof(complex) * len * nvec_in) ; 00051 00052 kbytes = sizeof(complex) * len * nvec_in / 1024.0 ; 00053 00054 for( ii=0 ; ii < len*nvec_in ; ii++ ){ cx[ii].r = ii ; cx[ii].i = -0.3*ii ; } 00055 00056 fac = sqrt(1.0/len) ; 00057 if( ! quiet ) printf("starting %d FFTs of length %d -- %d at a time\n", 00058 num,len,nvec_in ) ; 00059 tcpu = COX_cpu_time() ; 00060 tclock = COX_clock_time() ; 00061 if( nvec_in == 1 ){ 00062 if( ! quiet ) fprintf(stderr,"Using csfft\n") ; 00063 for( kk=0 ; kk < num ; kk++ ){ 00064 csfft_cox( -1 , len , cx ) ; 00065 for( ii=0 ; ii < len ; ii++ ){ cx[ii].r *= fac ; cx[ii].i *= fac ; } 00066 } 00067 } else { 00068 if( ! quiet ) fprintf(stderr,"Using csfft_many\n") ; 00069 for( kk=0 ; kk < num ; kk+=nvec_in ){ 00070 nvec = num - kk ; if( nvec > nvec_in ) nvec = nvec_in ; 00071 csfft_many( -1 , len , nvec , cx ) ; 00072 for( ii=0 ; ii < len*nvec ; ii++ ){ cx[ii].r *= fac ; cx[ii].i *= fac ; } 00073 } 00074 } 00075 tcpu = COX_cpu_time() - tcpu ; 00076 tclock = COX_clock_time() - tclock ; 00077 00078 { double flops , m ; 00079 m = log( (double)len ) / log( (double)2.0 ) ; 00080 flops = (5.0 * m - 1.0 ) * len * num / tcpu / 1.e6; 00081 00082 if(quiet == 1) 00083 printf("%8f %8f\n",kbytes,flops) ; 00084 else if(quiet == 2) 00085 printf("%8f\n",flops) ; 00086 else if(quiet == 3) 00087 printf("%8d %8f\n",len,flops) ; 00088 else 00089 printf(" CPU = %f ELAPSED = %f Kbytes = %f Megaflops = %f\n", 00090 tcpu,tclock,kbytes,flops); 00091 fflush(stdout) ; 00092 } 00093 exit(0) ; 00094 } |