Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: 0x88 compared to rot BB

Author: Vincent Diepeveen

Date: 14:18:17 01/12/03

Go up one level in this thread


On January 12, 2003 at 17:14:18, Bas Hamstra wrote:

you need indepth processor knowledge if you try to get a concept to work fast
which needs a lot of work to get fast.

this whereas bitboards is all optimized very well for the concept itself.

you work against assembly language stuff in bitboards.

so you better figure out how a processor works before writing a move generator.

the improtant problems to solve
  - limit the number of branches
  - arrays are allowed to use but try to minimize them
  - do not mix 8 bits with 32 bits. perhaps faster on k6 and even k7, but
    not always. and not at p4.

the square attacked with incremental bitboards is a simple AND.
see gnuchess 4.0 how to do it (not later raped versions of it).

>I am playing with a 0x88 implementation, that is supposed to be faster than my
>rotated BitBoard program. Just for fun. However I am a little disappointed about
>the speed gains so far. I have learned in the past that there are a couple of
>very speed critical functions:
>
>- make/unmake
>- gencaptures
>- squareattacked
>- SEE
>
>So far my 0x88 make/unmake is about the same speed as in my BB program Tao. The
>second function I tested was bool SquareAttacked(int Sq, int ByColor). I was a
>little disappointed to see it is more than 2x slower than my rotated BitBoard
>version.
>                                     rot BB        0x88
>Makes/Unmakes per sec:              4237288       4.25M
>GenCaptures per sec:                1915709           ?
>GenCapturesChecks per sec:          1569859           ?
>SquareAttacked per sec:            18181818          8M !!!
>SwapValue[c1e3] per sec:            6756757           ?
>GetBishopAttacks[26] per sec:      45454545           ?
>
>Below the 0x88 function used for SquareAttacked, which for the moment is the
>fastest I can think of:
>
>bool TBoard::SquareAttacked(int To, int ByColor)
>
>{   int             n,
>                    D,
>                    From,
>                    Type,
>                    Sq,
>                    Count = PieceCount[ByColor];
>
>    if(ByColor==WHITE && Bord[To-17] == 13) return true;
>    if(ByColor==WHITE && Bord[To-15] == 13) return true;
>    if(ByColor==BLACK && Bord[To+17] == 12) return true;
>    if(ByColor==BLACK && Bord[To+15] == 12) return true;
>
>    for(n=0; n<Count; n++)

why use all this slow code for something that should be a single AND?

>    {   From=PieceList[ByColor][n];
>        Type=Bord[From]>>1;
>        if(Type==PAWN) break;
>        if(PseudoAtt[127+To-From] & (1<<Type) )
>        {   if(Type==KING || Type==KNIGHT) return true;
>            D = Dir[127+To-From];
>            for(Sq=From+D; Sq!=To; Sq+=D)
>                if(Bord[Sq]) break;
>            if(Sq==To) return true;
>        }
>    }
>
>    return false;
>}
>
>All in all a little disappointing so far. Are the tiny loops *really* so
>amazingly fast?
>
>Best regards,
>Bas.



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.