gpt4 book ai didi

c++ - x86暂停指令的跨平台实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:25 25 4
gpt4 key购买 nike

编写 x86 暂停指令的跨平台实现的最佳实践是什么?我计划在 C++ 11 项目的繁忙循环中使用它。

如果我只使用 gcc 工具链,那么我可以使用 _mm_pause 内部函数。即使 native 处理器不支持 x86 暂停指令,此内在函数是否也能正确执行操作?我也希望我的代码也适用于 clang/llvm 工具链。

我想回退可以使用“std::this_thread::sleep_for”,因为我使用的是 C++ 11。但我不确定如何检测处理器能力(支持暂停与不支持暂停)并回退到 sleep 状态。

我正在使用 cmake 构建我的项目,并且总是在同一台机器上构建和部署。所以我很乐意在编译期间检测处理器设置。

一个示例实现(伪代码)是:

void pause() {
// Not sure how to detect if pause is available on the platform.
#if defined(USE_mm_pause)
__asm__ ( "pause;" );
#else
std::this_thread::sleep_for(std::chrono::seconds(0));
#endif
}

最佳答案

Does this intrinsic do the right thing even when the native processor does not support the x86 pause instruction?

是的,暂停指令被编码为 F3 90。不知道该指令的奔腾 4 之前的处理器会将其解码为:

  REP NOP

这只是一个带有无用前缀字节的普通NOP。处理器将等待一两个周期,然后在不以任何方式改变处理器状态的情况下继续。您不会从使用 PAUSE 中获得性能和功耗优势,但该程序仍会按预期工作。

有趣的事实:REP NOP 在大约 35 年前发布的 8086 上什至是合法的。这就是我所说的向后兼容性。

关于c++ - x86暂停指令的跨平台实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19779569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com