diff --git a/icbench.c b/icbench.c index 786827c..2c4f9f0 100644 --- a/icbench.c +++ b/icbench.c @@ -63,152 +63,10 @@ #include "plugins.h" #include "vint.h" #include "vp4.h" + //#define RDTSC_ON -//--------------------------------------- Time ------------------------------------------------------------------------ -#include -typedef unsigned long long tm_t; - -#if defined (__i386__) || defined( __x86_64__ ) - #ifdef _MSC_VER // __rdtsc -#include - #else -#include - #endif - - #ifdef __corei7__ -#define RDTSC_INI(_c_) do { unsigned _cl, _ch; \ - __asm volatile ("couid\n\t" \ - "rdtsc\n\t" \ - "mov %%edx, %0\n" \ - "mov %%eax, %1\n": "=r" (_ch), "=r" (_cl):: \ - "%rax", "%rbx", "%rcx", "%rdx"); \ - _c_ = (unsigned long long)_ch << 32 | _cl; \ -} while(0) - -#define RDTSC(_c_) do { unsigned _cl, _ch; \ - __asm volatile("rdtscp\n" \ - "mov %%edx, %0\n" \ - "mov %%eax, %1\n" \ - "cpuid\n\t": "=r" (_ch), "=r" (_cl):: "%rax",\ - "%rbx", "%rcx", "%rdx");\ - _c_ = (unsigned long long)_ch << 32 | _cl;\ -} while(0) - - #else -#define RDTSC(_c_) do { unsigned _cl, _ch;\ - __asm volatile ("cpuid \n"\ - "rdtsc"\ - : "=a"(_cl), "=d"(_ch)\ - : "a"(0)\ - : "%ebx", "%ecx");\ - _c_ = (unsigned long long)_ch << 32 | _cl;\ -} while(0) -#define RDTSC_INI(_c_) RDTSC(_c_) - #endif - -#else -#define RDTSC_INI(_c_) -#define RDTSC(_c_) -#endif - -//static inline tm_t tmrdtscini(void) { tm_t c; RDTSC_INI(c); return c; } -//static inline tm_t tmrdtsc(void) { tm_t c; RDTSC(c); return c; } -#define tmrdtscini() ({ tm_t _c; __asm volatile("" ::: "memory"); RDTSC_INI(_c); _c; }) -#define tmrdtsc() ({ tm_t _c; RDTSC(_c); _c; }) - -#define TMIS(__l,__t) ((__t)>=0.000001?((double)(__l)/4000000.0)/((__t)/TM_T):0.0) -#define TMBS(__l,__t) ((__t)>=0.000001?((double)(__l)/1000000.0)/((__t)/TM_T):0.0) - #ifdef _WIN32 -#include - #endif -#define TM_T 1000000.0 - - #ifdef RDTSC_ON -#define tminit tmrdtscini -#define tmtime tmrdtsc -#define TM_T (CLOCKS_PER_SEC*4000ull) -#define TM_TX TM_T -#define TMBS(__l,__t) (double)(__t)/((double)__l) -#define TMIS(__l,__t) ((double)(__t)/(double)(__l)) - #else - #ifdef _WIN32 -static LARGE_INTEGER tps; -static tm_t tmtime(void) { LARGE_INTEGER tm; QueryPerformanceCounter(&tm); return (tm_t)((double)tm.QuadPart*1000000.0/tps.QuadPart); } -static tm_t tminit() { QueryPerformanceFrequency(&tps); tm_t t0=tmtime(),ts; while((ts = tmtime())==t0); return ts; } - #else -static tm_t tmtime(void) { struct timespec tm; clock_gettime(CLOCK_MONOTONIC, &tm); return (tm_t)tm.tv_sec*1000000ull + tm.tv_nsec/1000; } -static tm_t tminit() { tm_t t0=tmtime(),ts; while((ts = tmtime())==t0); return ts; } - #endif -#endif -//---------------------------------------- bench ---------------------------------------------------------------------- -#define TMSLEEP do { tm_T = tmtime(); if(!tm_0) tm_0 = tm_T; else if(tm_T - tm_0 > tm_TX) { if(tm_verbose) { printf("S \b\b");fflush(stdout);} sleep(tm_slp); tm_0=tmtime();} } while(0) - -#define TMBEG(_tm_reps_, _tm_Reps_) { tm_rm = _tm_reps_; unsigned _first = 1,tm_c=0,tm_R; tm_t _t0,_tc,_ts,tm_r; double _tmbs=0.0;\ - for(tm_tm = 1ull<<63,tm_R = 0,_ts=tmtime(); tm_R < _tm_Reps_; tm_R++) { if(tm_verbose) { printf("%8.2f %.2d_%d\b\b\b\b\b\b\b\b\b\b\b\b\b",_tmbs,tm_R+1,tm_c);fflush(stdout);}\ - for(_t0 = tminit(), tm_r=0; tm_r < tm_rm;) { - -#define TMEND(_len_) _tc = tmtime() - _t0; tm_r++; if(_tc > tm_tx && _first) { tm_rm = tm_r; _first = 0; break; } }\ - if(_tc < tm_tm) { tm_tm = _tc; tm_c++; double _d = (double)tm_tm/(double)tm_rm; _tmbs=TMIS(_len_, _d); } else if(_tc>tm_tm*1.2) TMSLEEP; if(tmtime()-_ts > tm_TX) break;\ - if((tm_R & 7)==7) { sleep(tm_slp); _ts=tmtime(); } } } - -static unsigned tm_repc = 1<<20, tm_Repc = 3, tm_repd = 1<<20, tm_Repd = 4, tm_slp = 25, tm_rm; -static tm_t tm_tx = TM_T, tm_TX = 10*TM_T, tm_0, tm_T, tm_verbose=1, tm_tm; - -#define TMBENCH(_func_, _len_) printf("%-48s: ",#_func_); TMBEG(tm_repc, tm_Repc); _func_; TMEND(_len_); printf("%.3f \n", ((double)tm_tm/(double)tm_rm)/(double)_len_ ) - -//: b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024 - -#define Kb (1u<<10) -#define Mb (1u<<20) -#define Gb (1u<<30) -#define KB 1000 -#define MB 1000000 -#define GB 1000000000 - -unsigned argtoi(char *s, unsigned def) { - char *p; - unsigned n = strtol(s, &p, 10),f = 1; - switch(*p) { - case 'K': f = KB; break; - case 'M': f = MB; break; - case 'G': f = GB; break; - case 'k': f = Kb; break; - case 'm': f = Mb; break; - case 'g': f = Gb; break; - case 'b': return 1u << n; - default: f = def; - } - return n*f; -} - -unsigned long long argtol(char *s) { - char *p; - unsigned long long n = strtol(s, &p, 10),f=1; - switch(*p) { - case 'K': f = KB; break; - case 'M': f = MB; break; - case 'G': f = GB; break; - case 'k': f = Kb; break; - case 'm': f = Mb; break; - case 'g': f = Gb; break; - case 'b': return 1u << n; - default: f = MB; - } - return n*f; -} - -unsigned long long argtot(char *s) { - char *p; - unsigned long long n = strtol(s, &p, 10),f=1; - switch(*p) { - case 'h': f = 3600000; break; - case 'm': f = 60000; break; - case 's': f = 1000; break; - case 'M': f = 1; break; - default: f = 1000; - } - return n*f; -} +#define TM_F 4 +#include "time_.h" int strpref(char **str, int n, char sep1, char sep2) { int i, j=0; @@ -221,8 +79,6 @@ int strpref(char **str, int n, char sep1, char sep2) { return 0; } -void memrcpy(unsigned char *out, unsigned char *in, unsigned n) { int i; for(i = 0; i < n; i++) out[i] = ~in[i]; } - int memcheck(unsigned char *_in, unsigned _n, unsigned char *_cpy, int cmp) { unsigned *in = _in,*cpy=_cpy,n = (_n+3)/4; int i; @@ -494,8 +350,8 @@ struct bandw { unsigned long long bw; unsigned rtt; char *s; -}; - +}; + static struct bandw bw[] = { { 7*KB, 500, "GPRS 56" },//56kbps { 57*KB, 150, "2G 456" }, @@ -609,7 +465,7 @@ int be_factor=0; void plugprt(struct plug *plug, long long totinlen, char *finame, int fmt, FILE *f) { double ratio = RATIOF(plug->len,totinlen, be_factor), ratioi = RATIOI(plug->len,totinlen), - tc = TMIS(totinlen,plug->tc), td = TMIS(totinlen,plug->td); + tc = TMBS(totinlen,plug->tc), td = TMBS(totinlen,plug->td); char name[65]; if(plug->lev >= 0) sprintf(name, "%s%s %d%s", plug->err?"?":"", plug->name, plug->lev, plug->prm); @@ -703,7 +559,7 @@ void plugprtph(FILE *f, int fmt) { static inline double spmbs(double td, long long len, int i, long long totinlen) { double t = td + len*TM_T/(double)bw[i].bw + blknum*(bw[i].rtt*1000.0); - return TMIS(totinlen,t); + return TMBS(totinlen,t); } //static inline double spdup(double td, long long len, int i, long long totinlen) { double t = td + len*TM_T/(double)bw[i].bw + blknum*(bw[i].rtt*1000.0); return ((double)totinlen*TM_T*100.0/t)/(double)bw[i].bw;} @@ -882,7 +738,7 @@ void plugplotc(struct plug *plug, int k, long long totinlen, int fmt, int speedu strcat(txt, ts); } double t = (speedup&1)?g->tc:g->td; - fprintf(f, "%.2f", TMIS(totinlen,t)); + fprintf(f, "%.2f", TMBS(totinlen,t)); } fprintf(f, "],\ny: ["); for(p = gs; p < g; p++) @@ -1023,7 +879,7 @@ int checksort(unsigned *in, unsigned n) { } unsigned becomp(unsigned char *_in, unsigned _inlen, unsigned char *_out, unsigned outsize, unsigned bsize, int id, int lev, char *prm, int be_mindelta, CODCOMP codcomp) { unsigned char *op,*oe = _out + outsize; if(!_inlen) return 0; - TMBEG(tm_repc,tm_Repc); + TMBEG(tm_rep,tm_Rep); unsigned char *in,*ip; for(op = _out, in = _in; in < _in+_inlen; ) { unsigned inlen = _inlen,bs; @@ -1048,7 +904,7 @@ unsigned becomp(unsigned char *_in, unsigned _inlen, unsigned char *_out, unsign int bedecomp(unsigned char *_in, int _inlen, unsigned char *_out, unsigned _outlen, unsigned bsize, int id, int lev, char *prm, int be_mindelta, CODDECOMP coddecomp) { unsigned char *ip; - TMBEG(tm_repd,tm_Repd); + TMBEG(tm_rep2,tm_Rep2); unsigned char *out,*op; for(ip = _in, out = _out; out < _out+_outlen;) { unsigned outlen=_outlen,bs; @@ -1114,12 +970,12 @@ unsigned long long plugbench(struct plug *plug, unsigned char *in, unsigned inle plug->len += outlen; plug->tc += (tc += (double)tm_tm/(double)tm_rm); if(!outlen) plug->tc = 0; - if(outlen && verbose /*&& inlen == filen*/) { printf("%12u %5.1f %5.2f %8.2f ", outlen, RATIOF(outlen,inlen, be_factor), RATIOI(outlen,inlen), TMIS(inlen,tc)); fflush(stdout); } + if(outlen && verbose /*&& inlen == filen*/) { printf("%12u %5.1f %5.2f %8.2f ", outlen, RATIOF(outlen,inlen, be_factor), RATIOI(outlen,inlen), TMBS(inlen,tc)); fflush(stdout); } if(cmp && outlen) { unsigned char *cpy = _cpy; if(_cpy != in) memrcpy(cpy, in, inlen); unsigned cpylen = bedecomp(out, outlen, cpy, inlen, bsize, plug->id, plug->lev, plug->prm, be_mindelta, cods[be_mode].decomp); - td = (double)tm_tm/(double)tm_rm; if(verbose /*&& inlen == filen*/) { printf("%8.2f %c%-16s%s\n", TMIS(inlen,td), outlen?' ':'?',name, finame); } + td = (double)tm_tm/(double)tm_rm; if(verbose /*&& inlen == filen*/) { printf("%8.2f %c%-16s%s\n", TMBS(inlen,td), outlen?' ':'?',name, finame); } int e = memcheck(in, inlen, cpy, cmp); plug->err = plug->err?plug->err:e; plug->td += td; @@ -1190,8 +1046,7 @@ unsigned befgen(unsigned char **_in, unsigned n, int fmt, unsigned isize, FILE * if(!fi) { printf("zipf alpha=%.2f range[%u..%u].n=%u\n ", a, rm, rx, n); in = malloc(n*isize+OVD); if(!in) die("malloc err=%u", nmax); - //zipfgen((unsigned *)in, n, a, rm, rx); - { int i; for(i = 0; i < n; i++) in[i] = i; } + zipfgen((unsigned *)in, n, a, rm, rx); //{ int i; for(i = 0; i < n; i++) in[i] = i; } int i;for(i = 1; i <= n; i++) xbits[bsr32(ctou32(in+i*4))]++; if(be_mindelta == 0 || be_mindelta == 1) { stprint("delta"); unsigned *ip = (unsigned *)in, v; @@ -1354,7 +1209,7 @@ void ftest(struct plug *plug, unsigned k,unsigned n, unsigned bsize) { s[0] = 0; printf("bittest: %u-%u, n=%u\n", rm, rx, n); fflush(stdout); for(b = rm; b <= min(rx,64); b++) { srand(time(NULL)); sprintf(s,"b=%d", b); - for(i = 0; i < n; i++) in[i] = be_rand?rand():((1ull << b)-1); + for(i = 0; i < n; i++) in[i] = be_rand?(rand()&((1ull << b)-1)):((1ull << b)-1); in[n-1] = ((1ull << b)-1); if(be_mindelta == 0 || be_mindelta == 1) for(in[0]=0,i = 1; i < n; i++) { @@ -1379,16 +1234,6 @@ void ftest(struct plug *plug, unsigned k,unsigned n, unsigned bsize) { } } -/*void fp() { - int i; - for(i=-127; i <= 127; i++) { if(!i) printf("\n"); - double d = i; - uint64_t u = ctou64(&d); int e = (int)FPEXPO64(u); - //printf("%d:%c,%d,%x,%lld ", i, (u>>63)?'-':'+', e, zigzagenc32(e), bswap64(FPMANT(u, FPMANT_BITS64, 1ull)) ); - printf("%d:%lld,%llx ", i,FPEXPO64(u), FPMANT64(u) ); - } -}*/ - #define TEST64 #ifdef TEST64 #define R64 ((unsigned long long)rand()) @@ -1436,7 +1281,7 @@ void vstest64(int id, int rm,int rx, unsigned n) { fprintf(stderr,"64 bits test. #else #define vstest64(id,rm,rx,n) #endif - +//extern unsigned xbits[]; char *sifmt[] = {"","s","i","z"}; #ifdef __MINGW32__ extern int _CRT_glob=1; @@ -1484,16 +1329,16 @@ int main(int argc, char* argv[]) { case 'F': fac = strtod(optarg, NULL); break; // case 'f': fuzz = atoi(optarg); break; case 'g': merge++; break; - case 'G': plotmcpy++; break; + case 'G': plotmcpy++; break; case 'H': be_factor++; break; - case 'i': if((tm_repc = atoi(optarg))<=0) - tm_repc=tm_Repc=1; break; - case 'I': tm_Repc = atoi(optarg); break; - case 'j': if((tm_repd = atoi(optarg))<=0) - tm_repd=tm_Repd=1; break; - case 'J': tm_Repd = atoi(optarg); break; - case 'k': if((tm_Repk = atoi(optarg))<=0) tm_repc=tm_Repc=tm_repd=tm_Repd=tm_Repk=1; break; + case 'i': if((tm_rep = atoi(optarg))<=0) + tm_rep=tm_Rep=1; break; + case 'I': tm_Rep = atoi(optarg); break; + case 'j': if((tm_rep2 = atoi(optarg))<=0) + tm_rep2=tm_Rep2=1; break; + case 'J': tm_Rep2 = atoi(optarg); break; + case 'k': if((tm_Repk = atoi(optarg))<=0) tm_rep=tm_Rep=tm_rep2=tm_Rep2=tm_Repk=1; break; case 'L': tm_slp = atoi(optarg); break; case 't': tm_tx = atoi(optarg)*TM_T; break; case 'T': tm_TX = atoi(optarg)*TM_T; break; @@ -1503,7 +1348,7 @@ int main(int argc, char* argv[]) { case 'r': be_nblocks++; break; case 'o': xstdout++; break; case 'p': fmt = atoi(optarg); break; - case 'P': be_mcpy++; break; + case 'P': be_mcpy++; break; case 'Q': divxy = atoi(optarg); if(divxy>3) divxy=3; break; case 'D': rprio=0; break; @@ -1583,7 +1428,8 @@ int main(int argc, char* argv[]) { } unsigned k = plugreg(plug, s, 0, bsize, bsizex); if(k > 1 && argc == 1 && !strcmp(argvx[0],"stdin")) { printf("multiple codecs not allowed when reading from stdin"); exit(0); } - + + //tm_init(15,1); BEINI; if(!filenmax) filenmax = Gb; int krep=1; @@ -1644,7 +1490,7 @@ int main(int argc, char* argv[]) { long long ftotinlen=0; struct plug *p; int checks = 0; - for(p = plug; p < plug+k; p++) { + for(p = plug; p < plug+k; p++) { //{ int i; for(i=0;i<=64;i++) xbits[i]=0;} if(p->lev >= 0) sprintf(name, "%s %d%s", p->name, p->lev, p->prm); else @@ -1655,7 +1501,8 @@ int main(int argc, char* argv[]) { if(be_mindelta >= 0) pbsize += 4; // start stored w. variable byte for delta coding //printf("bsize=%d, ", pbsize); - p->len = p->tc = p->td = p->err = 0; blknum = 0; + //p->len = p->tc = p->td = p->err = 0; + blknum = 0; long long outlen = 0; if(dfmt) { ftotinlen = inlen; memrcpy(out, _in, inlen); if(!checks) checksort(_in,inlen/4),checks++; @@ -1695,6 +1542,7 @@ int main(int argc, char* argv[]) { } } codexit(p->id); //if(verbose && filen > insize) plugprt(p, ftotinlen, finame, FMT_TEXT,stdout); + //{ int i; for(i=0;i<=64;i++) if(xbits[i]) printf("%d:%d ", i, xbits[i]);printf("\n");} } totinlen += ftotinlen; if(fi) fclose(fi); @@ -1704,7 +1552,7 @@ int main(int argc, char* argv[]) { _vfree(_cpy, insizem); } BENCHSTA; - + if(argc - optind > 1) { unsigned clen = strpref(&argvx[optind], argc-optind, '\\', '/'); strncpy(s, argvx[optind], clen);