我正在嘗試為 arm (v7a) 編譯一些代碼,它有一個
#if defined(__arm__)
__yield();
#endif
在此拉取請求中添加
其他分支有YieldProcessor()用于 MSC 和/_mm_pause()或__builtin_ia32_pause()用于 x86 和 x86-64。
__yield編譯器找不到該符號,arm-v7a-linux-gnueabihf-gcc帶有-mcpu=cortex-a9 -mtune=cortex-a9 -march=armv7-a選項的7.3.1 。這樣的符號是否在其他一些 ARM 平臺、后來的 Gcc 或 Clang 上定義?
在編譯器附帶的頭檔案中,我能找到的只是__gnu_parallel::__yield一個行內包裝器sched_yield(),我認為這相當于std::this_thread::yield()代碼在 100 次迭代呼叫后呼叫的__yield(). 所以我認為不是這樣。但我也沒有__yield在 gcc 檔案中看到。
uj5u.com熱心網友回復:
的__yield本征被指定為部分ARM C語言擴展(見8.4“提示”)。它發出yield指令,大致相當于 x86 pause。它專門用于等待自旋鎖等情況;它可以防止 CPU 過度使用快取線(這會損害性能),可能會節省一些功率,并且在超執行緒 CPU 的情況下,為其他邏輯處理器提供更多計算單元。
(請注意,它純粹是一個 CPU 函式,而不是作業系統或庫呼叫;它不會像類似名稱的pause()orsched_yield()或std::this_thread::yield()呼叫那樣為作業系統產生 CPU 時間片。)
盡管 GCC 支持一些 ACLE 內在函式,但它似乎缺少這一點。您應該可以替換為asm volatile("yield");. 該yield指令沒有架構效果(它的執行方式類似于nop),因此不需要暫存器或記憶體破壞。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/363916.html
