Author: Miguel A. Ballicora
Date: 08:48:09 01/15/02
Go up one level in this thread
On January 15, 2002 at 06:54:38, Koundinya Veluri wrote: >On my computer, bsf is faster if the 1-bit is less significant and bsr is faster >if the 1-bit is more significant, so the FirstBit() and LastBit() versions with >the jumps are running faster on average. How does this test on other processors? >I'm curious... I think that you should check with random numbers like this for (i = 0; i < ITERATIONS; ++i) { FB[i] = 1 << randomnumber(64); /* randomnumber returns random from 0-63*/ } Once you fill this array, you can replace in your testing FB by FB[a] The idea is that in your test you make things very predictable affecting the branches and also the amount of time the bsf/bsr might take. Regards, Miguel > >#include <iostream> >using namespace std; > >#include <windows.h> > >#define ITERATIONS (1000000000) >#define FB (0x8000000000000000) >#define LB (1) > >inline const int FirstBit1(const unsigned __int64 bb); >inline const int FirstBit2(const unsigned __int64 bb); >inline const int LastBit1(const unsigned __int64 bb); >inline const int LastBit2(const unsigned __int64 bb); >inline const int LastBit3(const unsigned __int64 bb); > >int main() >{ > unsigned int a, b, t; > > cout << "Press enter to start..."; > cin.ignore(); > cout << endl; > > t = GetTickCount(); > for(a = 0; a < ITERATIONS; ++a) > b = FirstBit1(FB); > t = GetTickCount() - t; > cout << t << endl; > cout.flush(); > > t = GetTickCount(); > for(a = 0; a < ITERATIONS; ++a) > b = FirstBit2(FB); > t = GetTickCount() - t; > cout << t << endl; > cout.flush(); > > cout << endl; > cout.flush(); > > t = GetTickCount(); > for(a = 0; a < ITERATIONS; ++a) > b = LastBit1(LB); > t = GetTickCount() - t; > cout << t << endl; > cout.flush(); > > t = GetTickCount(); > for(a = 0; a < ITERATIONS; ++a) > b = LastBit2(LB); > t = GetTickCount() - t; > cout << t << endl; > cout.flush(); > > t = GetTickCount(); > for(a = 0; a < ITERATIONS; ++a) > b = LastBit3(LB); > t = GetTickCount() - t; > cout << t << endl; > cout.flush(); > > return 0; >} > >const int FirstBit1(const unsigned __int64 bb) >{ > __asm > { > bsf eax, [bb] > jnz L10 > bsf eax, [bb + 4] > add eax, 32 >L10: > } >} > >const int FirstBit2(const unsigned __int64 bb) >{ > __asm > { > bsf eax, [bb + 4] > add eax, 32 > bsf eax, [bb] > } >} > >const int LastBit1(const unsigned __int64 bb) >{ > __asm > { > bsr eax, [bb + 4] > jz L10 > add eax, 32 > jmp L11 >L10: > bsr eax, [bb] >L11: > } >} > >const int LastBit2(const unsigned __int64 bb) >{ > __asm > { > bsr eax, [bb + 4] > jnz L10 > bsr eax, [bb] > sub eax, 32 >L10: > add eax, 32 > } >} > >const int LastBit3(const unsigned __int64 bb) >{ > __asm > { > bsr eax, [bb] > sub eax, 32 > bsr eax, [bb + 4] > add eax, 32 > } >} > >Output on my computer: > >Press enter to start... > >5898 >5899 > >4747 >6509 >7080 > >-------- >Regards, >Koundinya
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.