我的自旋锁显然有一个繁忙的自旋循环,而无法获取锁:
while(try_lock() == false)
{
// Use _mm_pause() or _tpause() here?
}
我注意到循环内没有
_mm_pause()
。我知道忽略这一点可能会导致内存屏障/栅栏/排序方面的性能下降?
在添加
_mm_pause()
之前我发现_tpause()
:
https://www.felixcloutier.com/x86/tpause
但是,从 Intel Intrinsics Guide 来看,它的用法似乎稍微复杂一些。
我想最大限度地提高性能/不关心功耗。
我应该使用哪个,如果是
_t_pause()
,如何正确使用?即使在 Github 上我也找不到任何示例用法。
架构将是 2022+ Intel Xeon 型号。
编辑:
我刚刚注意到
_mm_pause()
延迟是140个周期?!
不幸的是,我没有看到
_tpause()
的延迟。
来自这个 Linux 补丁:
/*
* On Intel the TPAUSE instruction waits until any of:
* 1) the TSC counter exceeds the value provided in EDX:EAX
* 2) global timeout in IA32_UMWAIT_CONTROL is exceeded
* 3) an external interrupt occurs
*/
所以看起来
TPAUSE
适用于功率优化的睡眠情况,而不是低延迟旋转。您应该使用 PAUSE
来实现这一点。