繁体   English   中英

跨平台实现x86暂停指令

[英]Cross-platform implementation of the x86 pause instruction

编写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
}

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

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

  REP NOP

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM