什么是编写跨平台的x86暂停指令实现的最佳实践?
我计划在C ++ 11项目中的繁忙旋转循环中使用它。
如果我只使用gcc工具链,那么我可以使用_mm_pause内部函数。即使本机处理器不支持x86暂停指令,这个内部函数是否会执行正确的操作?我也希望我的代码能在clang / llvm工具链上运行。
我想一个备选方案可以使用“std :: this_thread :: sleep_for”,因为我正在使用C ++ 11。但我不确定如何检测处理器功能(支持暂停还是不支持)并回退到睡眠状态。
我正在使用cmake构建我的项目,并且将始终在同一台机器上构建和部署。因此,在编译期间检测处理器设置是可行的。
以下是一个示例实现(伪代码):
如果我只使用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
}
SIGILL
错误。 - Phil Miller__asm__ __volatile__("pause;");
,这样GCC就不会在暂停期间重新排列内存访问。 - Caseysleep_for
和yield
有任何关联吗?还是只是巧合?因为对于sleep/yield
,调度程序会处理您的时间片,而nop
只是一个空操作。 - Red XIII<immintrin.h>
中的_mm_pause()
函数。它可以在所有主要编译器中使用,包括MSVC。请参见如何在64位C++代码中使用暂停汇编指令?。(有重复内容的倾向,可能会被关闭。) - Peter Cordes