Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Perft 5

Author: Magoo

Date: 06:08:13 05/07/03

Go up one level in this thread


On May 07, 2003 at 07:37:43, Tony Werten wrote:

>On May 07, 2003 at 06:20:00, Magoo wrote:
>
>>On May 07, 2003 at 05:08:43, Uri Blass wrote:
>>
>>>On May 07, 2003 at 04:57:03, Magoo wrote:
>>>
>>>>On May 07, 2003 at 03:56:33, Tim Foden wrote:
>>>>
>>>>>On May 06, 2003 at 19:24:23, Magoo wrote:
>>>>>
>>>>>>After making alot of functions to macros and alot of other stuff, my program is
>>>>>>much faster!!
>>>>>>Perft 5 (without evaluating nodes) gives:
>>>>>>Depth:5, Nodes:5072212, Time:63 sec, Nps:80511, Value:0
>>>>>>
>>>>>>But!! I know other programs (i been looking at mscp and faile) do this
>>>>>>at least 6 times faster, (that is perft 5 < 10sec).
>>>>>>I've looked at the source for the programs i compare with, especially faile does
>>>>>>alot of stuff in the move_generator, mine is smaller, maybe a few more if
>>>>>>statments.
>>>>>>Now, if i only could figure out why it is so slow, it shouldn't be!!
>>>>>>
>>>>>>Flat profile:
>>>>>>
>>>>>>Each sample counts as 0.01 seconds.
>>>>>>  %   cumulative   self              self     total
>>>>>> time   seconds   seconds    calls   s/call   s/call  name
>>>>>> 66.51     42.12    42.12  5087588     0.00     0.00  move_generator
>>>>>
>>>>>>  3.65     56.68     2.31  5087587     0.00     0.00  undo_move
>>>>>>  3.21     58.71     2.03  5087587     0.00     0.00  do_move
>>>>>
>>>>>Does your move generate generate all moves in a position in one go, or do you
>>>>>only generate one move at a time?
>>>>>
>>>>>If you are generating all moves in one go, then it looks like you are calling
>>>>>your movegen in the leaf nodes.  You really should have much fewer calls to your
>>>>>movegen than to your make/unmake move routines.
>>>>>
>>>>>Cheers, Tim.
>>>>
>>>>Yes, i do call move_generator in the leaf nodes, i have no better way to check
>>>>if a move is legal... i look at the moves generated and look for "YxK", that is
>>>>a move where the king is captured, then i just return -INFINITY and decrease the
>>>>node count..
>>>
>>>You have better ways to do it.
>>>
>>>You do not need to generate all moves only to
>>>check if the king can be captured.
>>>
>>>You should only check if the opponent of that king has pieces in the relevant
>>>squares.
>>>
>>>If the white king is at e1 you need only to look at every direction to check if
>>>there is check from that direction.
>>>
>>>For example if you see
>>>e2 white pawn then you know no check from that direction
>>>
>>>Uri
>>
>>Yes, i have a "in_check" function, it does what you say. I will add this check
>>before generating moves.
>
>You can do even better.
>
>If you were incheck before making the move do the full check as Uri said. ( Also
>if the move was a special move like ep or castle)
>
>If you weren't incheck, then there is only 1 way of being in check. The
>fromsquare of the moved piece was attacked by a slider. Find the direction in
>wich to travel from the kingsquare to the from_square ( easy with 0x88) and look
>if there is an opponent slider on that line.
>
>Tony

I added the in_check test (a very slow one that first loops to find the king and
then traces in all directions), this is what i got:
Depth:5, Nodes:5072212, Time:16 sec, Nps:317013, Value:0

Thanks for the help!!





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.