簡體   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