Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Bitboards: must I rotate ?

Author: Alessandro Damiani

Date: 08:09:46 05/12/02

Go up one level in this thread


On May 12, 2002 at 07:45:55, Matthias Gemuh wrote:

>On May 12, 2002 at 06:49:08, Alessandro Damiani wrote:
>
>>On May 12, 2002 at 02:53:12, Matthias Gemuh wrote:
>>
>>>On May 12, 2002 at 00:23:07, Robert Hyatt wrote:
>>>
>>>>On May 11, 2002 at 05:48:17, Matthias Gemuh wrote:
>>>>
>>>>>
>>>>>Hi Experts,
>>>>>how much faster can I compute attacks when I rotate ? 5%? 20%? 50%?
>>>>>I don't understand rotation and hope the gain is 1% speed boost :-).
>>>>>Regards,
>>>>>Matthias.
>>>>
>>>>It is more than that.  The main thing is that it eliminates the loop needed
>>>>to find where a particular diagonal, file or rank is blocked.  Generating
>>>>the attacks on a particular "ray" becomes a simple table lookup...
>>>
>>>
>>>I don't loop. I use an idea from Crafty (blocking squares)
>>>
>>>if (((MovesAndAttacks->obstructed[k][j] & BitBoth) == 0) &&
>>>           (MovesAndAttacks->SlidingMoves[bishop][k]&ChsPos->Mask[j]))
>>>
>>>tells me bishop on square k can move unhindered to square j.
>>
>>k is the from-square, j is the to-square. You loop over the to-squares, else you
>>wouldn't get the moves. ;)
>>
>>Note that the if-statement above is executed in a loop. This costs. By using the
>>conventional approach for bitboards the cost in the loop is minimized. And since
>>one has to at least loop over the to-squares this is optimal.
>>
>>Here is an excerpt from the move generator of my engine (Fortress):
>>
>>    // bishops:
>>    fromSquares= Board_me->pieceBoard[Board_BISHOP];
>>    while (fromSquares) {
>>        from= Bitboard_firstOne(fromSquares);
>>        toSquares= Board_attackFromBishop(from) & target;
>>        while (toSquares) {
>>            to= Bitboard_firstOne(toSquares);
>>            *current++= Move_new(from, to, Board_BISHOP, Board[to]);
>>            Bitboard_clearBit(toSquares, to);
>>        };
>>        Bitboard_clearBit(fromSquares, from);
>>    };
>>
>>The variables fromSquares, toSquares, target are bitboards, while from and to
>>are integers.
>>
>>My code is in C. If you wonder what is up with "Board_me" and
>>"Bitboard_clearBit()" I am emulating object oriented languages. The dot is just
>>replaced with the underscore.
>>
>>The loop over the to-squares is in my case the following one:
>>
>>        while (toSquares) {
>>            to= Bitboard_firstOne(toSquares);
>>            *current++= Move_new(from, to, Board_BISHOP, Board[to]);
>>            Bitboard_clearBit(toSquares, to);
>>        };
>>
>>I have to add that Move_new() is a macro. So, the cost is essentially getting
>>the to-square and going to the next to-square. My Bitboard_firstOne() uses
>>ffs(), which I was told uses the hardware first-bit finder. The
>>Bitboard_clearBit() is a macro that removes the specified bit by using an AND
>>operation.
>>
>>Regards,
>>
>>Alessandro
>
>
>
>Hi Alesandro,
>I think I must first understand those rotated bitboards, otherwise I won't see
>how to avoid the "if" in such loops and still not bump into obstacles from one
>"to" to the next.
>I think well in unrotated bitboards, but a rotation just lets them slip out of
>my hands :-).
>

Hi Matthias,

I don't use Rotated Bitboards. I use my own method. If you look at my code above
you won't see anything about the details of the implementation of bitboards. The
method "Board_attackFromBishop()" contains the details. (BTW it is a macro :)

The bottom line of my text was: everyone has to loop over the to-squares (I
exclude the other case, since not realistic), and therefore you also have to
loop. ;)

Regards,

Alessandro

P.S. Die andere Möglichkeit ist, dass mein Englisch Blähungen hat. *g*



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.