Document variables with heavy SMP read access
authorMarco Costalba <mcostalba@gmail.com>
Wed, 3 Jun 2009 08:19:29 +0000 (10:19 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Wed, 3 Jun 2009 16:36:50 +0000 (17:36 +0100)
Also move NodesSincePoll away from the same cache line
of other heavy read accessed only variables.

Fortunatly we don't have anymore write access contention,
but still read access contention in some cases.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/search.cpp

index 66bdb9b8b266b1c6c344cf3a92535037d5aa8f01..a6e2c3410d504bf3d9f3de04abb0ba3249b59e65 100644 (file)
@@ -130,8 +130,11 @@ namespace {
 
   /// Constants
 
 
   /// Constants
 
+  // Search depth at iteration 1
+  const Depth InitialDepth = OnePly /*+ OnePly/2*/;
+
   // Depth limit for selective search
   // Depth limit for selective search
-  const Depth SelectiveDepth = 7*OnePly;
+  const Depth SelectiveDepth = 7 * OnePly;
 
   // Use internal iterative deepening?
   const bool UseIIDAtPVNodes = true;
 
   // Use internal iterative deepening?
   const bool UseIIDAtPVNodes = true;
@@ -187,12 +190,11 @@ namespace {
 
   /// Variables initialized from UCI options
 
 
   /// Variables initialized from UCI options
 
-  // Minimum number of full depth (i.e. non-reduced) moves at PV and non-PV
-  // nodes
-  int LMRPVMoves, LMRNonPVMoves;
+  // Minimum number of full depth (i.e. non-reduced) moves at PV and non-PV nodes
+  int LMRPVMoves, LMRNonPVMoves; // heavy SMP read access for the latter
 
   // Depth limit for use of dynamic threat detection
 
   // Depth limit for use of dynamic threat detection
-  Depth ThreatDepth;
+  Depth ThreatDepth; // heavy SMP read access
 
   // Last seconds noise filtering (LSN)
   bool UseLSNFiltering;
 
   // Last seconds noise filtering (LSN)
   bool UseLSNFiltering;
@@ -201,19 +203,13 @@ namespace {
   Value LSNValue;
 
   // Extensions. Array index 0 is used at non-PV nodes, index 1 at PV nodes.
   Value LSNValue;
 
   // Extensions. Array index 0 is used at non-PV nodes, index 1 at PV nodes.
+  // There is heavy SMP read access on these arrays
   Depth CheckExtension[2], SingleReplyExtension[2], PawnPushTo7thExtension[2];
   Depth PassedPawnExtension[2], PawnEndgameExtension[2], MateThreatExtension[2];
 
   Depth CheckExtension[2], SingleReplyExtension[2], PawnPushTo7thExtension[2];
   Depth PassedPawnExtension[2], PawnEndgameExtension[2], MateThreatExtension[2];
 
-  // Search depth at iteration 1
-  const Depth InitialDepth = OnePly /*+ OnePly/2*/;
-
-  // Node counters, used only by thread[0]
-  int NodesSincePoll;
-  int NodesBetweenPolls = 30000;
-
   // Iteration counters
   int Iteration;
   // Iteration counters
   int Iteration;
-  BetaCounterType BetaCounter; // does not have internal data
+  BetaCounterType BetaCounter; // has per-thread internal data
 
   // Scores and number of times the best move changed for each iteration
   IterationInfoType IterationInfo[PLY_MAX_PLUS_2];
 
   // Scores and number of times the best move changed for each iteration
   IterationInfoType IterationInfo[PLY_MAX_PLUS_2];
@@ -231,7 +227,7 @@ namespace {
   bool InfiniteSearch;
   bool PonderSearch;
   bool StopOnPonderhit;
   bool InfiniteSearch;
   bool PonderSearch;
   bool StopOnPonderhit;
-  bool AbortSearch;
+  bool AbortSearch; // heavy SMP read access
   bool Quit;
   bool FailHigh;
   bool FailLow;
   bool Quit;
   bool FailHigh;
   bool FailLow;
@@ -263,6 +259,11 @@ namespace {
   HANDLE SitIdleEvent[THREAD_MAX];
 #endif
 
   HANDLE SitIdleEvent[THREAD_MAX];
 #endif
 
+  // Node counters, used only by thread[0] but try to keep in different
+  // cache lines (64 bytes each) from the heavy SMP read accessed variables.
+  int NodesSincePoll;
+  int NodesBetweenPolls = 30000;
+
 
   /// Functions
 
 
   /// Functions