防止虚假分享的奇怪代码
Strange code for preventing false sharing
我想从这个link
讨论golang中的以下结构
// Local per-P Pool appendix.
57 type poolLocal struct {
58 private interface{} // Can be used only by the respective P.
59 shared []interface{} // Can be used by any P.
60 Mutex // Protects shared.
61 pad [128]byte // Prevents false sharing.
62 }
由于使用了互斥锁,上述结构一次只能被一个线程访问。编码器将在线程开始时锁定结构并在线程完成时解锁它。所以线程之间不共享内存。所以不会超过一个核心
访问内存。因此,据我了解,虚假共享不会发生。如果不能发生错误共享,为什么编码器要填充结构
有额外的字节(填充[128]字节)?我的理解错了吗?
同一缓存行上的内存位置受制于false-sharing,这对性能非常不利。
缓存行大小范围从 32 到 128 字节,具体取决于处理器型号。 128 字节填充将减少不同进程使用同一缓存行的机会,从而提高性能
如我所见,下面的会更好,因为它会更明确
type poolLocal struct {
_ [64]byte // Prevents false sharing.
private interface{} // Can be used only by the respective P.
shared []interface{} // Can be used by any P.
Mutex // Protects shared.
_ [64]byte // Prevents false sharing.
}
我想从这个link
讨论golang中的以下结构// Local per-P Pool appendix.
57 type poolLocal struct {
58 private interface{} // Can be used only by the respective P.
59 shared []interface{} // Can be used by any P.
60 Mutex // Protects shared.
61 pad [128]byte // Prevents false sharing.
62 }
由于使用了互斥锁,上述结构一次只能被一个线程访问。编码器将在线程开始时锁定结构并在线程完成时解锁它。所以线程之间不共享内存。所以不会超过一个核心 访问内存。因此,据我了解,虚假共享不会发生。如果不能发生错误共享,为什么编码器要填充结构 有额外的字节(填充[128]字节)?我的理解错了吗?
同一缓存行上的内存位置受制于false-sharing,这对性能非常不利。 缓存行大小范围从 32 到 128 字节,具体取决于处理器型号。 128 字节填充将减少不同进程使用同一缓存行的机会,从而提高性能
如我所见,下面的会更好,因为它会更明确
type poolLocal struct {
_ [64]byte // Prevents false sharing.
private interface{} // Can be used only by the respective P.
shared []interface{} // Can be used by any P.
Mutex // Protects shared.
_ [64]byte // Prevents false sharing.
}