Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: oops here's a better version...

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.