Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: about SEE of Crafty

Author: martin fierz

Date: 08:41:59 01/06/04

Go up one level in this thread


On January 06, 2004 at 11:35:42, Gerd Isenberg wrote:

>On January 06, 2004 at 10:56:00, martin fierz wrote:
>
>>On January 06, 2004 at 09:40:33, Robert Hyatt wrote:
>>
>>>Maybe there is some confusion here.  There is _no_ cost for "allocating"
>>>local variables in a function.  And I _do_ mean _NO_.  These values are
>>>simply "on the stack" and when the function is entered, the stack pointer has
>>>some constant subtracted from it to leave a "hole" that is used to hold local
>>>function variables.  no malloc() or anything like that is done by modern
>>>compilers, hence zero cost.
>>
>>hi bob,
>>
>>is this really true? i used to have a HUGE structure describing a move in the
>>first version of my chess program (don't ask, please...). in my negamax function
>>i had this
>>
>>int negamax(int alpha, int beta, int depth)
>>   {
>>   MOVE movelist[MAXMOVES];
>>   ...other variables...
>>
>>   ...typical negamax code...
>>
>>   }
>>
>>i saw clear speed differences depending on the value i used for MAXMOVES - and
>>in my tests, i made sure that using 100 would never overflow in the positions i
>>was searching, then i set it to e.g. 200 and the program would get a few %
>>slower, although these additional 100 array elements were never used.
>>
>>how can this be explained? i'm not memsetting the array to 0 or anything.
>
>Hi Martin,
>
>that was my point in my reply to Bob - instruction length.
>
>Did you expect the assembly,

hi gerd,

for heaven's sake no! to me, __asm is about equivalent to chinese, i'm not an
expert like you :-)

>specially the bp-relative offsets of the other
>locals load/stores? In C, per default all locals of a function on the stack,
>including actual parameters are addressed relative to the base pointer register.
>As long those offsets are in a signed byte range (-128..+127), with X86-32 only
>one byte (to sign extend) is necessary, otherwise the complete 32-bit offset is
>needed.

...and this sounds a bit like chinese too! forgive me for my stupidity in this
area! are you saying that if the storage of my locals exceeds X bytes (X=256?),
then my function will get slower? and that the execution speed of my function
would depend on the storage amount in a step-like way: locals need less than X
bytes => fast; else => slow?
because that is not what i saw. i didn't measure exactly, but the larger i made
MAXMOVES, the slower the program got.

cheers
  martin

>
>Gerd
>
>>
>>like uri, i thought the program was allocating memory every time it entered the
>>function, and that that was taking time. i ended up making my MOVE variable much
>>smaller - although it's still much larger than crafty's :-)
>>
>>i thought perhaps i should allocate the movelist beforehand as a global, like
>>this:
>>
>>MOVE *movelist[MAX_SEARCH_DEPTH]
>>for(i=0;i<MAX_SEARCH_DEPTH;i++)
>>   movelist[i] = malloc(sizeof(MOVE)*MAXMOVES)
>>
>>and then in the negamax function use the appropriate movelist for that search
>>depth. that turned out to be significantly slower than the local variable
>>approach. again, i don't understand why that would be... - anyone?
>>
>>cheers
>>  martin



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.