编写 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 上也是合法的。这就是我所说的向后兼容性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)