自旋锁实现推理
Spinlock implementation reasoning
我想通过替换一些互斥锁来提高程序的性能
自旋锁。我在
中找到了自旋锁实现
我打算重复使用。我相信这个实现比更简单的实现更安全,在更简单的实现中,线程像这里找到的那样不断尝试
但是我需要澄清一些关于此处找到的 yield 函数的事情
首先我可以假设数字 4,16,32 是任意的。我实际上测试了一些其他值,我发现在我的案例中使用其他值获得了最佳性能。
但是有人可以解释一下 yield 代码背后的原因吗?具体来说,为什么我们需要这三个
BOOST_SMT_PAUSE
sched_yield
和
nanosleep
是的,这个概念被称为 "adaptive spinlock" - 参见例如https://lwn.net/Articles/271817/.
通常选择指数back-off的数字:https://geidav.wordpress.com/tag/exponential-back-off/
因此,数字不是任意的。但是,哪种 "numbers" 适合您的情况取决于您的应用程序模式、要求和系统资源。
介绍 "micro-delays" 的三种方法明确旨在平衡成本和潜在收益:
- zero-cost是在high-CPU上自旋,但是会导致高耗电和浪费周期
- 一个小的 "cheap" 延迟可能能够防止 context-switch 的成本,同时减少 CPU 相对于 busy-spin
的负载
- 一个简单的
yield
可能允许 OS 避免上下文切换,这取决于其他系统负载(例如,如果线程数 < 逻辑核心数)
这些 trade-offs 对于 low-latency 应用程序很重要,在这些应用程序中,上下文切换或缓存未命中的影响很重要。
TL;DR
所有 trade-offs 尝试在浪费 CPU 周期和损失 cache/thread 效率之间找到平衡。
我想通过替换一些互斥锁来提高程序的性能 自旋锁。我在
中找到了自旋锁实现我打算重复使用。我相信这个实现比更简单的实现更安全,在更简单的实现中,线程像这里找到的那样不断尝试
但是我需要澄清一些关于此处找到的 yield 函数的事情
首先我可以假设数字 4,16,32 是任意的。我实际上测试了一些其他值,我发现在我的案例中使用其他值获得了最佳性能。
但是有人可以解释一下 yield 代码背后的原因吗?具体来说,为什么我们需要这三个
BOOST_SMT_PAUSE
sched_yield
和nanosleep
是的,这个概念被称为 "adaptive spinlock" - 参见例如https://lwn.net/Articles/271817/.
通常选择指数back-off的数字:https://geidav.wordpress.com/tag/exponential-back-off/
因此,数字不是任意的。但是,哪种 "numbers" 适合您的情况取决于您的应用程序模式、要求和系统资源。
介绍 "micro-delays" 的三种方法明确旨在平衡成本和潜在收益:
- zero-cost是在high-CPU上自旋,但是会导致高耗电和浪费周期
- 一个小的 "cheap" 延迟可能能够防止 context-switch 的成本,同时减少 CPU 相对于 busy-spin 的负载
- 一个简单的
yield
可能允许 OS 避免上下文切换,这取决于其他系统负载(例如,如果线程数 < 逻辑核心数)
这些 trade-offs 对于 low-latency 应用程序很重要,在这些应用程序中,上下文切换或缓存未命中的影响很重要。
TL;DR
所有 trade-offs 尝试在浪费 CPU 周期和损失 cache/thread 效率之间找到平衡。