![](/img/trans.png)
[英]With GCC, can I disable -Wframe-larger-than on a per-function basis?
[英]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.