簡體   English   中英

是否可以使編譯器按功能使用快速運算符?

[英]Can I make my compiler use fast-math on a per-function basis?

假設我有

template <bool UsesFastMath> void foo(float* data, size_t length);

我想用-ffast-math (對於nvcc是--use-fast-math )來編譯一個實例,而沒有它則編譯另一個實例。

這可以通過在單獨的翻譯單元中實例化每個變體,並使用不同的命令行(使用和不使用開關)來編譯每個變體來實現。

我的問題是是否可以指示流行的編譯器(*)對單個函數應用-ffast-math這樣我就可以在同一翻譯單元中使用我的實例化。

筆記:

  • 如果答案為“否”,則為解釋為什么不提供加分。
  • 這是不一樣的問題, 這一次 ,大約是在運行時開啟快速數學和關閉。 我要謙虛得多...

(*)由流行的編譯器提供,我的意思是:gcc,clang,msvc icc,nvcc(用於GPU內核代碼)中有關您的信息。

在GCC中,您可以聲明如下函數:

__attribute__((optimize("-ffast-math")))
double
myfunc(double val)
{
    return val / 2;
}

這是僅限GCC的功能。

在此處查看工作示例-> https://gcc.gnu.org/ml/gcc/2009-10/msg00385.html

似乎GCC不會驗證optimize()參數。 因此,像“ -ffast-match”這樣的拼寫錯誤將被忽略。

隨着CUDA 7.5(我所熟悉的最新版本,雖然CUDA 8.0目前正在發售)的, nvcc 支持的功能屬性,允許程序員在每個函數的應用特定的編譯器優化。

由於通過命令行開關設置的優化配置適用於整個編譯單元,因此,一種可行的方法是使用與存在不同優化配置一樣多的不同編譯單元,正如問題中已經提到的那樣。 源代碼可以被共享和#include從共同的文件-ed。

使用nvcc ,命令行開關--use_fast_math基本控制三個功能區域:

  • 啟用了清零模式(即,禁用了非常規支持)
  • 單精度倒數,除法和平方根切換為近似版本
  • 某些標准數學函數被等效的低精度內在函數取代

您可以通過使用適當的內在函數,按操作粒度應用其中的某些更改,而通過使用PTX內聯匯編來應用其他更改。

暫無
暫無

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

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