The output is
speed of twiddling: 1482 speed of a lookup table: 874
The test code was:
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
// ********************* BIT TWIDDLER ********************* //
#define SUM_MASK1 0x55555555
#define SUM_MASK2 0x33333333
#define SUM_MASK3 0x07070707
#define SUM_MASK4 0x000f000f
#define SUM_MASK5 0x0000001f
unsigned int SumOfOnesTwiddle(unsigned int x)
{
x = (SUM_MASK1 & (x >> 1)) + (SUM_MASK1 & x);
x = (SUM_MASK2 & (x >> 2)) + (SUM_MASK2 & x);
x = (SUM_MASK3 & (x >> 4)) + (SUM_MASK3 & x);
x = (SUM_MASK4 & (x >> 8)) + (SUM_MASK4 & x);
x = (SUM_MASK5 & (x >> 16)) + (SUM_MASK5 & x);
return x;
}
void SumOfOnesTwiddleArray(unsigned int* in, unsigned int* out, unsigned int size)
{
for(int i=0;i<size;i++)
out[i] = SumOfOnesTwiddle(in[i]);
}
// ********************* LOOKUP TABLE ********************* //
#define TABLE_SIZE 256
unsigned int table[TABLE_SIZE];
void computeTable()
{
for(int i=0; i<TABLE_SIZE; i++)
table[i] = SumOfOnesTwiddle(i);
}
unsigned int SumOfOnesTable(unsigned int x)
{
return table[(x ) & 0xff] +
table[(x>>8 ) & 0xff] +
table[(x>>16) & 0xff] +
table[(x>>24) & 0xff];
}
void SumOfOnesTableArray(unsigned int* in, unsigned int* out, unsigned int size)
{
for(int i=0;i<size;i++)
out[i] = SumOfOnesTable(in[i]);
}
//testing
template<class itor>
void printOut(itor start, itor end)
{
cout << hex << "0x";
copy (start, end, ostream_iterator<int>(cout, " 0x"));
cout << endl << endl;
}
#define SIZE 5000
int main()
{
unsigned int indata[SIZE];
unsigned int outdata[SIZE];
unsigned int outdata2[SIZE];
clock_t start_time, end_time;
computeTable();
srand(time(NULL));
for(int i=0;i < SIZE; i++)
indata[i] = rand();
printOut(indata, indata+SIZE);
SumOfOnesTwiddleArray(indata, outdata, SIZE);
SumOfOnesTableArray (indata, outdata2, SIZE);
printOut(outdata, outdata+SIZE);
printOut(outdata2, outdata2+SIZE);
for(int i=0;i < SIZE; i++)
if(outdata[i] != outdata2[i])
cout << "BUG!" << endl;
start_time = clock();
for(int i=0;i < SIZE; i++)
SumOfOnesTwiddleArray(indata, outdata, SIZE);
end_time = clock();
cout << dec << "speed of bit twiddling: " << (end_time - start_time) << endl;
start_time = clock();
for(int i=0;i < SIZE; i++)
SumOfOnesTableArray(indata, outdata, SIZE);
end_time = clock();
cout << dec << "speed of a lookup table: " << (end_time - start_time) << endl;
}
No comments:
Post a Comment