Computer Chess Club Archives


Search

Terms

Messages

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

Author: Sune Fischer

Date: 02:10:23 01/16/02

Go up one level in this thread


On January 15, 2002 at 11:48:09, Miguel A. Ballicora wrote:

One thing I don't understand; why can't the compiler see that b isn't being
used?
I would think a good compiler could see this and skip all the loops.
Have you tried doing b+=... and then return(b)?

-S.

>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.