簡體   English   中英

GCC __builtin_函數

[英]GCC __builtin_ functions

以下功能是在一個時鍾周期內執行的嗎?

__builtin_popcount
__builtin_ctz
__builtin_clz

同樣的ll(64位)版本的時鍾周期是多少。 他們是便攜式的嗎 為什么或者為什么不?

這些功能是在一個時鍾周期內執行的嗎?

不必要。 在可以使用單個指令實現它們的體系結構中,它們通常是計算該功能的最快方式(但仍然不一定是單個時鍾周期)。 在不能將其作為單個指令實現的體系結構中,它們的性能不太確定。

在我的處理器(Core 2 Duo)上, __builtin_ctz__builtin_clz可以用一條指令(位掃描正向和位掃描反向)實現。 但是,在我的處理器上使用單個指令無法實現__builtin_popcount 對於__builtin_popcount ,gcc 4.7.2調用庫函數,而clang 3.1生成內聯指令序列(實現這個位錯誤的hack )。 顯然,這兩種實現的性能將不盡相同。

它們便攜嗎?

它們不能跨編譯器移植。 它們起源於GCC(據我所知),並且也在其他一些編譯器中實現,例如Clang。

支持這些功能的編譯器可以為多種架構提供它們,但實現質量(性能)可能會有所不同。

像這樣的__builtin函數用於以比使用內聯匯編更簡單的方式訪問特定的機器指令。 如果您需要實現最高性能並且願意犧牲可移植性來執行此操作,或者為未提供這些功能的編譯器或平台提供替代實現,那么使用它們是有意義的。 如果最佳低級性能是您的目標,您還應檢查編譯器的匯編輸出,以確定它是否真正生成您希望它使用的指令。

通過將-O3 -march=native -S編譯為匯編代碼,您可以初步了解編譯器對其執行的操作。 在那里你可以檢查這是否只解析為一個匯編語句。 如果是這樣,這並不能保證在一個周期內完成。 要知道實際成本,你必須衡量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM