编写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
}
Run Code Online (Sandbox Code Playgroud)
Nil*_*nck 10
即使本机处理器不支持x86暂停指令,这种内在功能是否正确?
是的,暂停指令编码为F3 90.不知道该指令的Pentium 4前处理器会将其解码为:
REP NOP
Run Code Online (Sandbox Code Playgroud)
这只是一个普通NOP的无用前缀字节.处理器将等待一两个循环然后继续而不以任何方式改变处理器状态.您将无法从使用中获得性能和功耗,PAUSE但程序仍将按预期工作.
有趣的事实:REP NOP大约35年前发布的8086甚至是合法的.这就是我所说的向后兼容性.
| 归档时间: |
|
| 查看次数: |
1826 次 |
| 最近记录: |