Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/stat.h>
- #include <sys/time.h>
- #include <sys/types.h>
- #include <iostream>
- using namespace std;
- //g++ -O2 -o sillybenchmark sillybenchmark.cpp
- typedef unsigned long long uint64;
- class ZTimer
- {
- public:
- struct timeval t1, t2;
- public:
- ZTimer() { gettimeofday(&t1,0); t2 = t1; }
- void reset() {gettimeofday(&t1,0); t2 = t1;}
- int elapsed() { return ((t2.tv_sec - t1.tv_sec) * 1000) + ((t2.tv_usec - t1.
- tv_usec) / 1000); }
- int split() { gettimeofday(&t2,0); return elapsed(); }
- };
- uint64 test1() {// standard scalar product
- const int N =1024*32;
- uint64 vector1[N];
- uint64 vector2[N];
- uint64 answer;
- for(int k =0; k<N;++k)
- answer += vector1[k] * vector2[k];
- return answer;
- }
- uint64 test2() {// scalar product 2x2
- const int N = 1024*32;
- uint64 vector1[N];
- uint64 vector2[N];
- uint64 answer;
- for(int k =0; k+1<N;k+=2)
- answer += vector1[k] * vector2[k]+vector1[k+1] * vector2[k+1];
- return answer;
- }
- uint64 test3() {// not a scalar product (fewer multiplications)
- const int N = 1024*32;
- uint64 vector1[N];
- uint64 vector2[N];
- uint64 answer;
- for(int k =0; k+1<N;k+=2)
- answer += ( vector1[k] + vector2[k] ) * ( vector1[k+1] + vector2[k+1] );
- return answer;
- }
- uint64 test4() {// standard scalar product with squares
- const int N =1024*32;
- uint64 vector1[N];
- uint64 vector2[N];
- uint64 answer;
- for(int k =0; k<N;++k) {
- answer += (vector1[k] + vector2[k])* (vector1[k] + vector2[k]);
- }
- return answer;
- }
- uint64 test5() {// scalar product 4x4
- const int N = 1024*32;
- uint64 vector1[N];
- uint64 vector2[N];
- uint64 answer;
- for(int k =0; k+1<N;k+=4)
- answer += vector1[k] * vector2[k]+vector1[k+1] * vector2[k+1]+vector1[k+2] * vector2[k+2]+vector1[k+3] * vector2[k+3];
- return answer;
- }
- uint64 test6() {// just additions
- const int N = 1024*32;
- uint64 vector1[N];
- uint64 vector2[N];
- uint64 answer;
- for(int k =0; k+1<N;k+=4)
- answer += vector1[k] + vector2[k];
- return answer;
- }
- int main(int params, char ** args) {
- ZTimer t;
- uint64 fakesum;
- double timeelapsed;
- t.reset();
- for(int loop = 1; loop<10000;++loop) fakesum += test1();
- timeelapsed = t.split()/(1000.0);
- cout<<timeelapsed<<endl;
- t.reset();
- for(int loop = 1; loop<10000;++loop) fakesum += test2();
- timeelapsed = t.split()/(1000.0);
- cout<<timeelapsed<<endl;
- t.reset();
- for(int loop = 1; loop<10000;++loop) fakesum += test3();
- timeelapsed = t.split()/(1000.0);
- cout<<timeelapsed<<endl;
- t.reset();
- for(int loop = 1; loop<10000;++loop) fakesum += test4();
- timeelapsed = t.split()/(1000.0);
- cout<<timeelapsed<<endl;
- t.reset();
- for(int loop = 1; loop<10000;++loop) fakesum += test5();
- timeelapsed = t.split()/(1000.0);
- cout<<timeelapsed<<endl;
- t.reset();
- for(int loop = 1; loop<10000;++loop) fakesum += test6();
- timeelapsed = t.split()/(1000.0);
- cout<<timeelapsed<<endl;
- cout<<endl;
- cout<<fakesum<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement