]> Cypherpunks repositories - gostls13.git/commitdiff
sync: align poolLocal to CPU cache line size
authorAliaksandr Valialkin <valyala@gmail.com>
Tue, 18 Apr 2017 10:12:58 +0000 (13:12 +0300)
committerIan Lance Taylor <iant@golang.org>
Thu, 20 Apr 2017 22:36:07 +0000 (22:36 +0000)
Make poolLocal size multiple of 128, so it aligns to CPU cache line
on the most common architectures.

This also has the following benefits:

- It may help compiler substituting integer multiplication
  by bit shift inside indexLocal.
- It shrinks poolLocal size from 176 bytes to 128 bytes on amd64,
  so now it fits two cache lines (or a single cache line on certain
  Intel CPUs - see https://software.intel.com/en-us/articles/optimizing-application-performance-on-intel-coret-microarchitecture-using-hardware-implemented-prefetchers).

No measurable performance changes on linux/amd64 and linux/386.

Change-Id: I11df0f064718a662e77a85d88b8a15a8919f25e9
Reviewed-on: https://go-review.googlesource.com/40918
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/sync/pool.go

index b3fd9d397c538a8f224b51f681c33ab3ce38479f..e54f917225b3f912badb10b4ae5b726eaa2e936d 100644 (file)
@@ -54,11 +54,18 @@ type Pool struct {
 }
 
 // Local per-P Pool appendix.
-type poolLocal struct {
+type poolLocalInternal struct {
        private interface{}   // Can be used only by the respective P.
        shared  []interface{} // Can be used by any P.
        Mutex                 // Protects shared.
-       pad     [128]byte     // Prevents false sharing.
+}
+
+type poolLocal struct {
+       poolLocalInternal
+
+       // Prevents false sharing on widespread platforms with
+       // 128 mod (cache line size) = 0 .
+       pad [128 - unsafe.Sizeof(poolLocalInternal{})%128]byte
 }
 
 // from runtime