簡體   English   中英

強制編譯器使用函數

[英]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.

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