6

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

如果我只使用 gcc 工具链,那么我可以使用 _mm_pause 内在函数。即使本机处理器不支持 x86 暂停指令,这个内在函数是否正确?我也希望我的代码也能在 clang/llvm 工具链上工作。

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

我正在使用 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
}
4

1 回答 1

11

即使本机处理器不支持 x86 暂停指令,这个内在函数是否正确?

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

  REP NOP

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

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

于 2013-11-05T10:24:55.757 回答