From c2c0ba875f429e497c936b61be9f75dcc88385a9 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 6 Sep 2008 12:30:07 +0200 Subject: [PATCH 1/1] TranspositionTable: add first_entry() helper An inline function to retrieve the first TT entry given a position. Plus usual whitespace noise. Signed-off-by: Marco Costalba --- src/misc.cpp | 20 +++++++++---------- src/misc.h | 4 ++-- src/tt.cpp | 56 +++++++++++++++++++++++++++------------------------- src/tt.h | 8 +++++--- 4 files changed, 46 insertions(+), 42 deletions(-) diff --git a/src/misc.cpp b/src/misc.cpp index c58c9df0..ecd6a499 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -6,12 +6,12 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + Glaurung is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -52,12 +52,12 @@ long dbg_cnt0 = 0; long dbg_cnt1 = 0; -//// +//// //// Functions //// void dbg_print_hit_rate() { - + std::cout << "Total " << dbg_cnt0 << " Hit " << dbg_cnt1 << " hit rate (%) " << (dbg_cnt1*100)/(dbg_cnt0 ? dbg_cnt0 : 1) << std::endl; @@ -76,15 +76,15 @@ const std::string engine_name() { const char *dateString = __DATE__; std::stringstream s; int month = 0, day = 0; - + for(int i = 0; i < 12; i++) if(strncmp(dateString, monthNames[i], 3) == 0) month = i + 1; day = atoi(dateString+4); - + s << "Glaurung " << (dateString+9) << std::setfill('0') << std::setw(2) << month << std::setfill('0') << std::setw(2) << day; - + return s.str(); } else @@ -98,7 +98,7 @@ const std::string engine_name() { int get_system_time() { struct timeval t; gettimeofday(&t, NULL); - return t.tv_sec*1000 + t.tv_usec/1000; + return t.tv_sec*1000 + t.tv_usec/1000; } @@ -136,14 +136,14 @@ int Bioskey() { fd_set readfds; struct timeval timeout; - + FD_ZERO(&readfds); FD_SET(fileno(stdin), &readfds); /* Set to timeout immediately */ timeout.tv_sec = 0; timeout.tv_usec = 0; select(16, &readfds, 0, 0, &timeout); - + return (FD_ISSET(fileno(stdin), &readfds)); } diff --git a/src/misc.h b/src/misc.h index e156c08f..8bf09a86 100644 --- a/src/misc.h +++ b/src/misc.h @@ -6,12 +6,12 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + Glaurung is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see . */ diff --git a/src/tt.cpp b/src/tt.cpp index 328b13e6..268c21f8 100644 --- a/src/tt.cpp +++ b/src/tt.cpp @@ -6,12 +6,12 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + Glaurung is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -105,7 +105,7 @@ void TranspositionTable::store(const Position &pos, Value v, Depth d, Move m, ValueType type) { TTEntry *tte, *replace; - tte = replace = entries + int(pos.get_key() & (size - 1)) * 4; + tte = replace = first_entry(pos); for (int i = 0; i < 4; i++) { if (!(tte+i)->key()) // still empty @@ -118,12 +118,12 @@ void TranspositionTable::store(const Position &pos, Value v, Depth d, { if (m == MOVE_NONE) m = (tte+i)->move(); - + *(tte+i) = TTEntry(pos.get_key(), v, type, d, m, generation); return; } if ( i == 0 // already is (replace == tte+i), common case - || replace->generation() < (tte+i)->generation()) + || replace->generation() < (tte+i)->generation()) continue; if ( replace->generation() > (tte+i)->generation() @@ -143,28 +143,33 @@ void TranspositionTable::store(const Position &pos, Value v, Depth d, bool TranspositionTable::retrieve(const Position &pos, Value *value, Depth *d, Move *move, ValueType *type) const { - TTEntry *tte; - bool found = false; + TTEntry *tte = first_entry(pos); - tte = entries + int(pos.get_key() & (size - 1)) * 4; - for (int i = 0; i < 4 && !found ; i++) - if ((tte+i)->key() == pos.get_key()) + for (int i = 0; i < 4; i++) + { + tte += i; + if (tte->key() == pos.get_key()) { - tte = tte + i; - found = true; + *value = tte->value(); + *type = tte->type(); + *d = tte->depth(); + *move = tte->move(); + return true; } - if (!found) { - *move = MOVE_NONE; - return false; } - *value = tte->value(); - *type = tte->type(); - *d = tte->depth(); - *move = tte->move(); - return true; + *move = MOVE_NONE; + return false; } +/// TranspositionTable::first_entry returns a pointer to the first +/// entry of a cluster given a position. + +inline TTEntry* TranspositionTable::first_entry(const Position &pos) const { + + return entries + (int(pos.get_key() & (size - 1)) << 2); +} + /// TranspositionTable::new_search() is called at the beginning of every new /// search. It increments the "generation" variable, which is used to /// distinguish transposition table entries from previous searches from @@ -177,7 +182,7 @@ void TranspositionTable::new_search() { } -/// TranspositionTable::insert_pv() is called at the end of a search +/// TranspositionTable::insert_pv() is called at the end of a search /// iteration, and inserts the PV back into the PV. This makes sure the /// old PV moves are searched first, even if the old TT entries have been /// overwritten. @@ -212,12 +217,9 @@ TTEntry::TTEntry() { } TTEntry::TTEntry(Key k, Value v, ValueType t, Depth d, Move m, - int generation) { - key_ = k; - data = (m & 0x7FFFF) | (t << 20) | (generation << 23); - value_ = v; - depth_ = int16_t(d); -} + int generation) : + key_ (k), data((m & 0x7FFFF) | (t << 20) | (generation << 23)), + value_(v), depth_(int16_t(d)) {} /// Functions for extracting data from TTEntry objects. diff --git a/src/tt.h b/src/tt.h index f39d37dd..4ca34412 100644 --- a/src/tt.h +++ b/src/tt.h @@ -6,12 +6,12 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + Glaurung is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -47,7 +47,7 @@ public: ValueType type() const; int generation() const; -private: +private: Key key_; uint32_t data; int16_t value_; @@ -74,6 +74,8 @@ public: int full(); private: + TTEntry* first_entry(const Position &pos) const; + unsigned size; int writes; TTEntry* entries; -- 2.39.2