Author: Robert Hyatt
Date: 11:28:39 10/01/04
Go up one level in this thread
On October 01, 2004 at 11:25:13, Tony Werten wrote:
>On October 01, 2004 at 10:07:10, Robert Hyatt wrote:
>
>>On October 01, 2004 at 01:10:39, Tony Werten wrote:
>>
>>>Hi all,
>>>
>>>I have a simple question on wich I thought I had an answer, but I'm starting to
>>>doubt. However, since the memory requirements of my program are still getting
>>>bigger very fast, I'm not sure what is to blame, and switching back and forth
>>>takes too much time.
>>>
>>>Question:
>>>
>>>What is faster ?
>>>
>>>struct
>>>{
>>> move current_move[MAXPLY],hashmove[MAXPLY],killers[MAXPLY];
>>>
>>> moves movelist[3000]
>>> // etc
>>>
>>>} TREE
>>>
>>>or
>>>
>>>struct
>>>{
>>> move current_move,hashmove,killers;
>>> // etc
>>>
>>>} SEARCHDATA
>>>
>>>struct
>>>{
>>> SEARCHDATA data[MAXPLY];
>>>
>>> moves movelist[3000]
>>> //
>>>
>>>} TREE
>>>
>>>ie In the second case, all data from current ply should be close in memory and I
>>>can locally use a SEARCHDATA* wich would be pointing to
>>> &tree.data[currentply], and have less adresscalculation.
>>>
>>>I always thought the 2nd should be fastest. Is that so ?
>>>
>>>Tony
>>
>>The way to answer this is to study temporal locality for the variables.
>>Variables that are used close together in terms of time should be close together
>>in memory. In the above I really don't see why they would be any different,
>>since the memory layout should be the same if I am looking at it correctly.
>
>In that case I'm not understanding it correctly i guess.
>
>In the first case I would expect the memory to look like
>
>current_move[0]
>current_move[1]
>current_move[..]
>current_move[MAXPLY]
>hashmove[0]
>hashmove[1]
>hashmove[..]
>hashmove[MAXPLY]
>
>while in the second case I would expect it to be
>
>current_move[0]
>hashmove[0]
>killers[0]
>current_move[1]
>hashmove[1]
>killers[1]
>current_move[..]
>hashmove[..]
>killers[..]
>
>Tony
>
You are correct. Linewrap here hid that [MAXPLY] on your struct so the second
case is what I was explaining. The second case should be faster but not by much
since those values can stick in cache a lot as well...
>
>> IE
>>the current_move, hash_move and killer_move arrays are adjacent in memory in
>>either, followed by the movelist. It might be minimally faster to make a
>>structure with a single hash_move, killer_move and current_move in it, and use
>>that to define an array. Then the data for each ply would be in adjacent memory
>>words and get pre-fetched properly.
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.