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.