Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: calling subroutines

Author: Robert Hyatt

Date: 11:27:17 10/06/98

Go up one level in this thread


On October 06, 1998 at 13:41:15, Roberto Waldteufel wrote:

>
>On October 06, 1998 at 13:06:32, Robert Hyatt wrote:
>
>>On October 06, 1998 at 11:55:01, Roberto Waldteufel wrote:
>>
>>>
>>>On October 06, 1998 at 09:50:07, Frank Schneider wrote:
>>>
>>>>Hi John,
>>>>
>>>>On October 05, 1998 at 16:49:07, John Coffey wrote:
>>>>
>>>>>Like most chess programs, I have a data structure that represents the current
>>>>>state of the board.  Some programs have bitboards, but instead I use information
>>>>>for each square.  My data structure could easily grow into 300 to 500 bytes.
>>>>>
>>>>>I am just now starting to write my search routines.  If I am in my routine
>>>>>"SearchForWhite()" and it tries a move and then calls "SearchForBlack()" (These
>>>>>names are hypothetical at this point) then it needs to pass the current state
>>>>>of the board to "SearchForBlack()."
>>>>>
>>>>>Question:
>>>>>
>>>>>Is it more efficient to ....
>>>>>
>>>>>1.  Only have one copy of the current state, and have "SearchForBlack()"
>>>>>restore the board back to its previous state before returning to
>>>>>"SearchforWhite()"?
>>>>>
>>>>>or
>>>>>
>>>>>2.  "SearchForWhite" passes the whole data structure on the stack as a copy of
>>>>>the original so that "SearchForBlack()" doesn't have to restore the board?
>>>>>
>>>>>John Coffey
>>>>Gromit uses your method 2. It currently searches about 20K nps on K6/200 and
>>>>the copying of the datastructures (about 1KB per move) takes 10-15% of total
>>>>cpu-time. It may take more if you take into account the cache-effects.
>>>>
>>>>Just to give you an idea how expensive it roughly is.
>>>>
>>>>Frank
>>>
>>>Hi Frank,
>>>
>>>Have you tried both methods for comparison and chosen method 2, or have you not
>>>tried method 1? I use method 1 and always have - I just assumed without testing
>>>that passing the whole board data structure on the stack would be too expensive.
>>>Maybe I should have tested this out. Method 2 is cetainly easier to program
>>>because you never need to unmake any moves. The question really is whether it is
>>>quicker to unmake moves or copy data.
>>>
>>>In Rabbit I avoid a lot of the overhead involved in move retraction by a trick I
>>>use in my move generation. Whenever two successive moves have the same
>>>from-square, I don't retract the move, but just move the piece from the old
>>>to-square to the new to-square. Also, if two successive moves share the same
>>>to-square, then there is no need to recalculate attack maps of sliding pieces
>>>through the to-square between the moves.
>>>
>>>Best wishes,
>>>Roberto
>>
>>
>>
>>Or, you can use "rotated bitmaps" and *never* "recalculate attack maps of
>>sliding pieces..."
>>
>>:)
>
>Hi Bob,
>
>Do you mean that you calculate your attack maps "on the fly" rather than
>incrementally update them? I incrementally update my attack maps, so that my
>code for making and unmaking moves (mostly in assembler) has to extend sliding
>attacks through newly vacated squares and truncate them through newly occupied
>squares, but I think my code does this quite efficiently. Maybe it is better to
>avoid this and calculate attack maps for sliding pieces on the fly, but I would
>have thought that would be more expensive, since the same attack maps then have
>to be recalculated many times.
>
>Best wishes,
>Roberto



simply stated, this is correct.  Think about rook moves along a rank.  If
you isolate the 8 bits for the rank you are looking at generating rook moves
for, you can, before the fact, create 256 unique bitmaps that would show which
squares the rook on square X attacks, given the 256 (actually only 128 different
states since we know where the rook is) unique states of the occupied squares
on that rank.  IE to generate rook moves, shift the proper rank to the right
end of a register, mask all but 8 bits, then probe into the above table to get
the bitmap for the rook on that square, based on the occupied squares on that
rank.  I do this for all sliding pieces by keeping 4 unique occupied_squares
bitmaps...

The idea came about when I started a grad seminar on computer chess in the
Fall of 1994 when work on "crafty" started...  it eliminates any incremental
attack stuff at all...  if you want more details, let me know.  I have an
almost-completed paper for the ICCAJ written...



This page took 0.01 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.