[英]Force the compiler to use a function
我在玩一些函數來近似一些常用函數(sqrt,sin,cos等),我想知道是否可以“研究”我正在使用的C庫的性能和精度以及硬件指令(如果可供使用的話)
因此,我的問題是:有沒有辦法告訴編譯器,對於某些功能,我需要“庫版本”,對於其他功能,則需要“硬件版本”? (並且在可能的情況下,使編譯器可以自由地優化庫版本,但無需使用硬件指令)。
就像是:
library_fun(x); // <-- compiled to the library version
hardware_fun(x); // <-- compiled to the hardware version (if available)
編輯:
好的,我的問題不是非常自我說明的新試驗:
我假設我的C庫對於某些數學函數具有某種“軟件后備”實現,以防萬一硬件沒有它們。 我想知道是否可以調用它(這就是我所說的library_fun
)來檢查它的精度/性能/好奇心。
另外,我將能夠使用硬件指令(如果存在且可用)。
作為更詳細的“示例”,在我的代碼中,我具有函數sqrt
。 如果我檢查程序集輸出, sqrtsd
得到sqrtsd
指令。 因此,無論如何都不會調用sqrt。
通過按特定順序列出庫,鏈接器將使用符號(函數)的第一次出現按順序搜索這些庫。 在搜索編譯的源代碼之后將搜索庫,因此,代碼中的任何符號都將比庫中的版本優先。
請注意,可能存在沖突或不兼容,例如,如果某個庫函數使用該庫中的其他函數,而這些函數已在較早列出的庫或對象中找到。
此行為可能進一步取決於您使用的工具鏈,但是我所描述的行為是我通常所看到的。
編輯:根據您對問題的編輯:編譯器可能會檢查編譯器正在運行的硬件,以決定使用庫函數或CPU指令進行某些數學運算。 然后,編譯可能會有開關來指示它使用/不使用這些指令,例如,如果要針對其他平台進行編譯。 VC2008具有:
/arch:[SSE|SSE2]
使用流SIMD擴展(SSE)和流SIMD擴展2(SSE2)指令指定代碼生成的體系結構。 /fp:precise
禁用固有的[浮點]; 而是使用標准的運行時庫例程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.