使用 _mm_pause() 或 _tpause() 进行忙自旋循环?

问题描述 投票:0回答:1

我的自旋锁显然有一个繁忙的自旋循环,而无法获取锁:

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个周期?!

enter image description here

不幸的是,我没有看到

_tpause()
的延迟。

c++ performance optimization x86
1个回答
0
投票

来自这个 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
来实现这一点。

© www.soinside.com 2019 - 2024. All rights reserved.