1 | /* |
2 | Stockfish, a UCI chess playing engine derived from Glaurung 2.1 |
3 | Copyright (C) 2004-2008 Tord Romstad (Glaurung author) |
4 | Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad |
5 | Copyright (C) 2015-2019 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad |
6 | |
7 | Stockfish is free software: you can redistribute it and/or modify |
8 | it under the terms of the GNU General Public License as published by |
9 | the Free Software Foundation, either version 3 of the License, or |
10 | (at your option) any later version. |
11 | |
12 | Stockfish is distributed in the hope that it will be useful, |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | GNU General Public License for more details. |
16 | |
17 | You should have received a copy of the GNU General Public License |
18 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 | */ |
20 | |
21 | #ifndef MISC_H_INCLUDED |
22 | #define MISC_H_INCLUDED |
23 | |
24 | #include <cassert> |
25 | #include <chrono> |
26 | #include <ostream> |
27 | #include <string> |
28 | #include <vector> |
29 | |
30 | #include "types.h" |
31 | |
32 | const std::string engine_info(bool to_uci = false); |
33 | void prefetch(void* addr); |
34 | void start_logger(const std::string& fname); |
35 | |
36 | void dbg_hit_on(bool b); |
37 | void dbg_hit_on(bool c, bool b); |
38 | void dbg_mean_of(int v); |
39 | void dbg_print(); |
40 | |
41 | typedef std::chrono::milliseconds::rep TimePoint; // A value in milliseconds |
42 | |
43 | static_assert(sizeof(TimePoint) == sizeof(int64_t), "TimePoint should be 64 bits" ); |
44 | |
45 | inline TimePoint now() { |
46 | return std::chrono::duration_cast<std::chrono::milliseconds> |
47 | (std::chrono::steady_clock::now().time_since_epoch()).count(); |
48 | } |
49 | |
50 | template<class Entry, int Size> |
51 | struct HashTable { |
52 | Entry* operator[](Key key) { return &table[(uint32_t)key & (Size - 1)]; } |
53 | |
54 | private: |
55 | std::vector<Entry> table = std::vector<Entry>(Size); // Allocate on the heap |
56 | }; |
57 | |
58 | |
59 | enum SyncCout { IO_LOCK, IO_UNLOCK }; |
60 | std::ostream& operator<<(std::ostream&, SyncCout); |
61 | |
62 | #define sync_cout std::cout << IO_LOCK |
63 | #define sync_endl std::endl << IO_UNLOCK |
64 | |
65 | |
66 | /// xorshift64star Pseudo-Random Number Generator |
67 | /// This class is based on original code written and dedicated |
68 | /// to the public domain by Sebastiano Vigna (2014). |
69 | /// It has the following characteristics: |
70 | /// |
71 | /// - Outputs 64-bit numbers |
72 | /// - Passes Dieharder and SmallCrush test batteries |
73 | /// - Does not require warm-up, no zeroland to escape |
74 | /// - Internal state is a single 64-bit integer |
75 | /// - Period is 2^64 - 1 |
76 | /// - Speed: 1.60 ns/call (Core i7 @3.40GHz) |
77 | /// |
78 | /// For further analysis see |
79 | /// <http://vigna.di.unimi.it/ftp/papers/xorshift.pdf> |
80 | |
81 | class PRNG { |
82 | |
83 | uint64_t s; |
84 | |
85 | uint64_t rand64() { |
86 | |
87 | s ^= s >> 12, s ^= s << 25, s ^= s >> 27; |
88 | return s * 2685821657736338717LL; |
89 | } |
90 | |
91 | public: |
92 | PRNG(uint64_t seed) : s(seed) { assert(seed); } |
93 | |
94 | template<typename T> T rand() { return T(rand64()); } |
95 | |
96 | /// Special generator used to fast init magic numbers. |
97 | /// Output values only have 1/8th of their bits set on average. |
98 | template<typename T> T sparse_rand() |
99 | { return T(rand64() & rand64() & rand64()); } |
100 | }; |
101 | |
102 | |
103 | /// Under Windows it is not possible for a process to run on more than one |
104 | /// logical processor group. This usually means to be limited to use max 64 |
105 | /// cores. To overcome this, some special platform specific API should be |
106 | /// called to set group affinity for each thread. Original code from Texel by |
107 | /// Peter Ă–sterlund. |
108 | |
109 | namespace WinProcGroup { |
110 | void bindThisThread(size_t idx); |
111 | } |
112 | |
113 | #endif // #ifndef MISC_H_INCLUDED |
114 | |