blob: dc6d7cc05b413aab933964d0c68287a5933099d8 [file] [log] [blame]
tanjent@gmail.comad4b3632010-11-05 01:20:58 +00001#include "SpeedTest.h"
2
3#include "Random.h"
4
aappleby@google.com7f20a312011-03-21 20:55:06 +00005#include <stdio.h> // for printf
6#include <memory.h> // for memset
tanjent@gmail.comad4b3632010-11-05 01:20:58 +00007
8//-----------------------------------------------------------------------------
9// 256k blocks seem to give the best results.
10
aappleby@google.com7f20a312011-03-21 20:55:06 +000011void BulkSpeedTest ( pfHash hash, uint32_t seed )
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000012{
aappleby@google.com7f20a312011-03-21 20:55:06 +000013 Rand r(seed);
14
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000015 const int trials = 9999;
16 const int blocksize = 256 * 1024;
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000017
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000018 printf("Bulk speed test - %d-byte keys\n",blocksize);
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000019
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000020 char * block = new char[blocksize + 16];
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000021
aappleby@google.com7f20a312011-03-21 20:55:06 +000022 r.rand_p(block,blocksize+16);
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000023
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000024 uint32_t temp[16];
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000025
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000026 for(int align = 0; align < 8; align++)
27 {
28 double bestbpc = 0;
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000029
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000030 for(int itrial = 0; itrial < trials; itrial++)
31 {
32 int64_t begin,end;
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000033
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000034 begin = rdtsc();
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000035
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000036 hash(block + align,blocksize,itrial,temp);
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000037
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000038 end = rdtsc();
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000039
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000040 blackhole(temp[0]);
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000041
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000042 double cycles = double(end-begin);
tanjent@gmail.comb379f342011-03-20 03:18:20 +000043 if(cycles > 0)
44 {
45 double bpc = double(blocksize) / cycles;
46 if(bpc > bestbpc) bestbpc = bpc;
47 }
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000048 }
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000049
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000050 double bestbps = (bestbpc * 3000000000.0 / 1048576.0);
51 printf("Alignment %2d - %6.3f bytes/cycle - %7.2f MiB/sec @ 3 ghz\n",align,bestbpc,bestbps);
52 }
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000053
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000054 delete [] block;
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000055}
tanjent@gmail.combabb5532011-02-28 06:03:12 +000056
57//-----------------------------------------------------------------------------
58
aappleby@google.com7f20a312011-03-21 20:55:06 +000059void TinySpeedTest ( pfHash hash, int hashsize, int keysize, uint32_t seed, bool verbose, double & outCycles )
tanjent@gmail.combabb5532011-02-28 06:03:12 +000060{
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000061 const int trials = 100000;
tanjent@gmail.combabb5532011-02-28 06:03:12 +000062
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000063 if(verbose) printf("Small key speed test - %4d-byte keys - ",keysize);
aappleby@google.com7f20a312011-03-21 20:55:06 +000064
65 Rand r(seed);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000066
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000067 uint8_t * h = new uint8_t[hashsize];
68 uint8_t * k = new uint8_t[keysize];
aappleby@google.com7f20a312011-03-21 20:55:06 +000069
70 memset(h,0,hashsize);
71 memset(k,0,keysize);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000072
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000073 double bestcycles = 1e9;
tanjent@gmail.combabb5532011-02-28 06:03:12 +000074
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000075 for(int itrial = 0; itrial < trials; itrial++)
76 {
aappleby@google.com7f20a312011-03-21 20:55:06 +000077 volatile int64_t begin,end;
tanjent@gmail.combabb5532011-02-28 06:03:12 +000078
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000079 rand_p(k,keysize);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000080
aappleby@google.com7f20a312011-03-21 20:55:06 +000081 MixVCode(h,4);
82
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000083 begin = rdtsc();
84
85 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
86 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
87 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
88 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000089
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000090 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
91 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
92 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
93 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000094
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000095 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
96 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
97 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
98 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000099
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +0000100 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
101 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
102 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
103 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
tanjent@gmail.combabb5532011-02-28 06:03:12 +0000104
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +0000105 end = rdtsc();
tanjent@gmail.combabb5532011-02-28 06:03:12 +0000106
aappleby@google.com7f20a312011-03-21 20:55:06 +0000107 MixVCode(h,4);
108 //printf("0x%08x\n",g_verify);
tanjent@gmail.combabb5532011-02-28 06:03:12 +0000109
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +0000110 double cycles = double(end-begin) / 64;
tanjent@gmail.comb379f342011-03-20 03:18:20 +0000111 if((cycles > 0) && (cycles < bestcycles)) bestcycles = cycles;
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +0000112 }
tanjent@gmail.combabb5532011-02-28 06:03:12 +0000113
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +0000114 double bestbpc = double(keysize) / bestcycles;
115 if(verbose) printf("%8.2f cycles/hash, %8.4f bytes/cycle\n",bestcycles,bestbpc);
tanjent@gmail.combabb5532011-02-28 06:03:12 +0000116
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +0000117 outCycles = bestcycles;
tanjent@gmail.combabb5532011-02-28 06:03:12 +0000118}
119
120//-----------------------------------------------------------------------------