Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: High performance move generation

Author: Antonio Dieguez

Date: 07:14:45 11/17/99

Go up one level in this thread


On November 16, 1999 at 14:27:37, Eugene Nalimov wrote:

>Unroll the outer loop, so that iDelta[iDir] become a compile-time constant in
>the inner loop. Also, you now have 2 calls to AddMove - replace it by one, write
>something like that:
>
>  for (iTarg = x+17; ONBOARD(iTarg); iTarg += 17) {
>    iTargContents = PIECE_AT(psPos, iTarg);
>    if (IS_YOUR_COLOR(iTargContents))
>      break;
>    AddMove(psPos, x, iTarg);
>    if (!IS_EMPTY(iTargContents))
>      break;
>    }

for (iTarg = x+17; ONBOARD(iTarg) &&
!IS_YOUR_COLOR(iTargContents=PIECE_AT(psPos, iTarg)); iTarg += 17) {

    AddMove(psPos, x, iTarg);
    if (!IS_EMPTY(iTargContents))
      break;
    }

just a bir shorter.

bye.

>I suspect that ONBOARD(), PIECE_AT(), IS_EMPTY(), etc. are macro. Right? Also,
>try to inline AddMove().
>
>In any case the move generation performance is not very important - but you know
>that yourself :-).
>
>Eugene
>
>On November 16, 1999 at 00:26:17, Scott Gasch wrote:
>
>>Hi,
>>
>>I have been rewriting my engine from the ground up and trying to "do it right"
>>this second go 'round.  For instance, I pruned the move data struct from a huge
>>56 byte struct down to an int to increase performance ;)
>>
>>I have recently been doing Vincent Diepeveen's test of move generation speed to
>>clock how fast my generator is.  In the prior version it generated at about 3
>>million nodes/sec whereas in this version (with the much smaller move
>>representation) it is up to about 6 million nodes/sec on my AMD K6-3 450.
>>
>>Vincent's test is to generate all successors of:
>>rnbqkbnr/ppp2ppp/8/3pp3/3PP3/8/PPP2PPP/RNBQKBNR b KQkq e6 0 0
>>
>>in a loop, 2000000 times and keep track of how long it takes... then compute
>>nodes/sec.  Vincent gets 15 million in the same position with a slower
>>processor!
>>
>>I have profiled my code and determined that the bottleneck is in my generation
>>routines (as opposed to AddMove)  So my question is this: I currently generate
>>moves for a specific piece something like this:
>>
>>    //
>>    // Figure out how the rook can move.
>>    //
>>    for (iDir = 0; iDir < 4; iDir++)
>>    {
>>        iTarg = x + iDelta[iDir];
>>        while (ONBOARD(iTarg))
>>        {
>>            iTargContents = PIECE_AT(psPos, iTarg);
>>
>>            //
>>            // The rook can move if the square is empty.
>>            //
>>            if (IS_EMPTY(iTargContents))
>>            {
>>                AddMove(psPos, x, iTarg);
>>            }
>>
>>            //
>>            // Or if there is an enemy piece there to capture.
>>            //
>>            else
>>            {
>>                if (COLOR(iTargContents) != COLOR(iRook))
>>                {
>>                    AddMove(psPos, x, iTarg);
>>                }
>>                break;
>>            }
>>            iTarg += iDelta[iDir];
>>        }
>>    }

wow! thats looks exactly extracted of my program.

>>However I see in GNUChess they use some kind of precomputed table.  I am not
>>sure I understand exactly how this works.  Also, does anyone else have any other
>>tricks to speed up move generation?  I know that in the long run this really
>>doesn't make TOO much of a difference but I want my new version to be lean and
>>mean...
>>
>>As always, I appreciate the help.
>>Scott



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.