Author: Vincent Diepeveen
Date: 09:35:16 09/15/02
Go up one level in this thread
On September 15, 2002 at 12:19:59, Tony Werten wrote:
>On September 15, 2002 at 12:00:06, Vincent Diepeveen wrote:
>
>>On September 14, 2002 at 13:27:12, Tony Werten wrote:
>>
>>2 tables is pretty outdated, because you suffer twice
>>latency of DRAM then (about factor 1000 slower than processor
>>speed).
>
>Yes, I know. My implementation is a 2 dimensional table wich uses cache after
>the first read.
>
>Tony
2 dimensional table???
For some reason i get impression you're not programming very low level...
>
>>
>>better is 1 table and doing a number
>>of sequential probes in it.
>>
>>>On September 14, 2002 at 13:00:09, scott farrell wrote:
>>>
>>>>I have been reading plenty on hash replacement schemes.
>>>>
>>>>I have read Breuker's thesis, and done some (slow) searching through the CCC
>>>>archives.
>>>>
>>>>I am going over my code and redoing the hashing parts, only to realise I have
>>>>borken IID (internal iterative deepening).
>>>>
>>>>Now I am unsure of what I should be aiming at in relation to hashing code.
>>>>
>>>>I am also unsure of exactly what multi-probing the hash tables is. I am guessing
>>>>there is still only one hashtable, and different equations to go from
>>>>key/checkkey to the hashtable index, so that there can be several alternative
>>>>slots that a hash entry for a position could appear at. Is Multi-probe just
>>>>aiming at reducing collisions - or is the idea to store more than one hash entry
>>>>for popular positions (say 1 for "depth based", and one for "replace always")?
>>>>
>>>>I think I am correct that I need atleast one of the probes as "replace always"
>>>>to get IID to work. What else do I need to guarantee that I get the best moves
>>>>from IID backed up to the main search?
>>>>
>>>>When people say "replace always" do that mean literaly, just store it all the
>>>>time? It seems over simplistic - but I tried it, and it works pretty much the
>>>>same as my code below that tries to keep the deeper entries.
>>>>
>>>>Any help apprecated.
>>>
>>>What most people do is have 2 tables. In the first you only store if the
>>>searchdepth >= table depth (and you move the former entry to the second table).
>>>If not then store in 2nd table.
>>>
>>>Tony
>>>
>>>PS I advise you to create a structure and create an array of that. Your
>>>implementation of serveral arrays kills the cache.
>>>
>>>>
>>>>Here is some of my code
>>>>
>>>>//////////////////////////////////////////////////////////////////////////////////////////////////////
>>>>// SET A TABLE ENTRY
>>>>//////////////////////////////////////////////////////////////////////////////////////////////////////
>>>>public final static void store(
>>>> int _depth,
>>>> int _value,
>>>> Move _best,
>>>> char _flag,
>>>> boolean _estOnly,
>>>> short _reqSE,
>>>> Board _b,
>>>> boolean usingSecondTE_notbeingused,
>>>> boolean _dontNullMove)
>>>>{
>>>> int key= 0;
>>>> long checkKeyt= 0;
>>>>
>>>> if (_b.sideToMove == Board.BLACK)
>>>> {
>>>> key= ~_b.key & (size - 1);
>>>> checkKeyt= ~_b.checkKey;
>>>> } else
>>>> {
>>>> key= _b.key & (size - 1);
>>>> checkKeyt= _b.checkKey;
>>>> }
>>>>
>>>> boolean collision=
>>>> checkKeyt != checkKey[key] && checkKey[key] != 0 && stale[key] == false;
>>>>
>>>> if (_best != null)
>>>> {
>>>> s1[key]= (byte) _best.s1;
>>>> s2[key]= (byte) _best.s2;
>>>> }
>>>>
>>>> }
>>>>
>>>> if (stale[key]
>>>> || (_depth > (int) depth[key])
>>>> || (_depth == (int) depth[key] && _flag > flag[key]))
>>>> {
>>>>
>>>> depth[key]= _depth;
>>>> value[key]= _value;
>>>> flag[key]= _flag;
>>>> SERequired[key]= _reqSE;
>>>> stale[key]= false;
>>>> checkKey[key]= checkKeyt;
>>>> dontNullMove[key]= _dontNullMove;
>>>>
>>>> } // end if replace
>>>> else
>>>> {
>>>> // store2nd(_depth, _value, _best, _flag, _reqSE, _b,
>>>>_dontNullMove);
>>>> }
>>>>}
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.