IcBench: Benchmark App

This commit is contained in:
x
2017-03-19 13:20:20 +01:00
parent 52a8a9708e
commit 05f92ce701

214
icbench.c
View File

@ -63,152 +63,10 @@
#include "plugins.h" #include "plugins.h"
#include "vint.h" #include "vint.h"
#include "vp4.h" #include "vp4.h"
//#define RDTSC_ON //#define RDTSC_ON
//--------------------------------------- Time ------------------------------------------------------------------------ #define TM_F 4
#include <time.h> #include "time_.h"
typedef unsigned long long tm_t;
#if defined (__i386__) || defined( __x86_64__ )
#ifdef _MSC_VER // __rdtsc
#include <intrin.h>
#else
#include <x86intrin.h>
#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 <windows.h>
#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;
}
int strpref(char **str, int n, char sep1, char sep2) { int strpref(char **str, int n, char sep1, char sep2) {
int i, j=0; int i, j=0;
@ -221,8 +79,6 @@ int strpref(char **str, int n, char sep1, char sep2) {
return 0; 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) { int memcheck(unsigned char *_in, unsigned _n, unsigned char *_cpy, int cmp) {
unsigned *in = _in,*cpy=_cpy,n = (_n+3)/4; unsigned *in = _in,*cpy=_cpy,n = (_n+3)/4;
int i; int i;
@ -494,8 +350,8 @@ struct bandw {
unsigned long long bw; unsigned long long bw;
unsigned rtt; unsigned rtt;
char *s; char *s;
}; };
static struct bandw bw[] = { static struct bandw bw[] = {
{ 7*KB, 500, "GPRS 56" },//56kbps { 7*KB, 500, "GPRS 56" },//56kbps
{ 57*KB, 150, "2G 456" }, { 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) { void plugprt(struct plug *plug, long long totinlen, char *finame, int fmt, FILE *f) {
double ratio = RATIOF(plug->len,totinlen, be_factor), double ratio = RATIOF(plug->len,totinlen, be_factor),
ratioi = RATIOI(plug->len,totinlen), 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]; char name[65];
if(plug->lev >= 0) if(plug->lev >= 0)
sprintf(name, "%s%s %d%s", plug->err?"?":"", plug->name, plug->lev, plug->prm); 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) { 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); 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;} //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); strcat(txt, ts);
} }
double t = (speedup&1)?g->tc:g->td; double t = (speedup&1)?g->tc:g->td;
fprintf(f, "%.2f", TMIS(totinlen,t)); fprintf(f, "%.2f", TMBS(totinlen,t));
} }
fprintf(f, "],\ny: ["); fprintf(f, "],\ny: [");
for(p = gs; p < g; p++) 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 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; unsigned char *op,*oe = _out + outsize; if(!_inlen) return 0;
TMBEG(tm_repc,tm_Repc); TMBEG(tm_rep,tm_Rep);
unsigned char *in,*ip; unsigned char *in,*ip;
for(op = _out, in = _in; in < _in+_inlen; ) { for(op = _out, in = _in; in < _in+_inlen; ) {
unsigned inlen = _inlen,bs; 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) { 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; unsigned char *ip;
TMBEG(tm_repd,tm_Repd); TMBEG(tm_rep2,tm_Rep2);
unsigned char *out,*op; unsigned char *out,*op;
for(ip = _in, out = _out; out < _out+_outlen;) { for(ip = _in, out = _out; out < _out+_outlen;) {
unsigned outlen=_outlen,bs; unsigned outlen=_outlen,bs;
@ -1114,12 +970,12 @@ unsigned long long plugbench(struct plug *plug, unsigned char *in, unsigned inle
plug->len += outlen; plug->len += outlen;
plug->tc += (tc += (double)tm_tm/(double)tm_rm); plug->tc += (tc += (double)tm_tm/(double)tm_rm);
if(!outlen) plug->tc = 0; 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) { if(cmp && outlen) {
unsigned char *cpy = _cpy; unsigned char *cpy = _cpy;
if(_cpy != in) memrcpy(cpy, in, inlen); 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); 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); int e = memcheck(in, inlen, cpy, cmp);
plug->err = plug->err?plug->err:e; plug->err = plug->err?plug->err:e;
plug->td += td; 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); 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); in = malloc(n*isize+OVD); if(!in) die("malloc err=%u", nmax);
//zipfgen((unsigned *)in, n, a, rm, rx); zipfgen((unsigned *)in, n, a, rm, rx); //{ int i; for(i = 0; i < n; i++) in[i] = i; }
{ 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))]++; int i;for(i = 1; i <= n; i++) xbits[bsr32(ctou32(in+i*4))]++;
if(be_mindelta == 0 || be_mindelta == 1) { stprint("delta"); if(be_mindelta == 0 || be_mindelta == 1) { stprint("delta");
unsigned *ip = (unsigned *)in, v; 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); s[0] = 0; printf("bittest: %u-%u, n=%u\n", rm, rx, n); fflush(stdout);
for(b = rm; b <= min(rx,64); b++) { for(b = rm; b <= min(rx,64); b++) {
srand(time(NULL)); sprintf(s,"b=%d", 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); in[n-1] = ((1ull << b)-1);
if(be_mindelta == 0 || be_mindelta == 1) if(be_mindelta == 0 || be_mindelta == 1)
for(in[0]=0,i = 1; i < n; i++) { 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 #define TEST64
#ifdef TEST64 #ifdef TEST64
#define R64 ((unsigned long long)rand()) #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 #else
#define vstest64(id,rm,rx,n) #define vstest64(id,rm,rx,n)
#endif #endif
//extern unsigned xbits[];
char *sifmt[] = {"","s","i","z"}; char *sifmt[] = {"","s","i","z"};
#ifdef __MINGW32__ #ifdef __MINGW32__
extern int _CRT_glob=1; extern int _CRT_glob=1;
@ -1484,16 +1329,16 @@ int main(int argc, char* argv[]) {
case 'F': fac = strtod(optarg, NULL); break; case 'F': fac = strtod(optarg, NULL); break;
// case 'f': fuzz = atoi(optarg); break; // case 'f': fuzz = atoi(optarg); break;
case 'g': merge++; break; case 'g': merge++; break;
case 'G': plotmcpy++; break; case 'G': plotmcpy++; break;
case 'H': be_factor++; break; case 'H': be_factor++; break;
case 'i': if((tm_repc = atoi(optarg))<=0) case 'i': if((tm_rep = atoi(optarg))<=0)
tm_repc=tm_Repc=1; break; tm_rep=tm_Rep=1; break;
case 'I': tm_Repc = atoi(optarg); break; case 'I': tm_Rep = atoi(optarg); break;
case 'j': if((tm_repd = atoi(optarg))<=0) case 'j': if((tm_rep2 = atoi(optarg))<=0)
tm_repd=tm_Repd=1; break; tm_rep2=tm_Rep2=1; break;
case 'J': tm_Repd = atoi(optarg); break; case 'J': tm_Rep2 = atoi(optarg); break;
case 'k': if((tm_Repk = atoi(optarg))<=0) tm_repc=tm_Repc=tm_repd=tm_Repd=tm_Repk=1; 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 'L': tm_slp = atoi(optarg); break;
case 't': tm_tx = atoi(optarg)*TM_T; break; case 't': tm_tx = atoi(optarg)*TM_T; 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 'r': be_nblocks++; break;
case 'o': xstdout++; break; case 'o': xstdout++; break;
case 'p': fmt = atoi(optarg); break; case 'p': fmt = atoi(optarg); break;
case 'P': be_mcpy++; break; case 'P': be_mcpy++; break;
case 'Q': divxy = atoi(optarg); case 'Q': divxy = atoi(optarg);
if(divxy>3) divxy=3; break; if(divxy>3) divxy=3; break;
case 'D': rprio=0; break; case 'D': rprio=0; break;
@ -1583,7 +1428,8 @@ int main(int argc, char* argv[]) {
} }
unsigned k = plugreg(plug, s, 0, bsize, bsizex); 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); } 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; BEINI;
if(!filenmax) filenmax = Gb; if(!filenmax) filenmax = Gb;
int krep=1; int krep=1;
@ -1644,7 +1490,7 @@ int main(int argc, char* argv[]) {
long long ftotinlen=0; long long ftotinlen=0;
struct plug *p; struct plug *p;
int checks = 0; 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) if(p->lev >= 0)
sprintf(name, "%s %d%s", p->name, p->lev, p->prm); sprintf(name, "%s %d%s", p->name, p->lev, p->prm);
else else
@ -1655,7 +1501,8 @@ int main(int argc, char* argv[]) {
if(be_mindelta >= 0) if(be_mindelta >= 0)
pbsize += 4; // start stored w. variable byte for delta coding pbsize += 4; // start stored w. variable byte for delta coding
//printf("bsize=%d, ", pbsize); //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; long long outlen = 0;
if(dfmt) { if(dfmt) {
ftotinlen = inlen; memrcpy(out, _in, inlen); if(!checks) checksort(_in,inlen/4),checks++; 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); 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; totinlen += ftotinlen;
if(fi) fclose(fi); if(fi) fclose(fi);
@ -1704,7 +1552,7 @@ int main(int argc, char* argv[]) {
_vfree(_cpy, insizem); _vfree(_cpy, insizem);
} }
BENCHSTA; BENCHSTA;
if(argc - optind > 1) { if(argc - optind > 1) {
unsigned clen = strpref(&argvx[optind], argc-optind, '\\', '/'); unsigned clen = strpref(&argvx[optind], argc-optind, '\\', '/');
strncpy(s, argvx[optind], clen); strncpy(s, argvx[optind], clen);