假设我有
template <bool UsesFastMath> void foo(float* data, size_t length);
我想用-ffast-math
(--use-fast-math
为nvcc)编译一个实例,而另一个实例化没有它。
这可以通过在单独的翻译单元中实例化每个变体,并使用不同的命令行编译每个变体来实现 - 使用和不使用开关。
我的问题是,是否有可能向热门编译器(*)表明是否应用-ffast-math
来实现个别功能 - 以便我能够在我的实例中进行实例化。相同的翻译单位。
备注:
(*)受欢迎的编译器我的意思是:gcc,clang,msvc icc,nvcc(用于GPU内核代码),你有这些信息。
答案 0 :(得分:4)
在GCC中,您可以声明如下函数:
__attribute__((optimize("-ffast-math")))
double
myfunc(double val)
{
return val / 2;
}
这是仅限GCC的功能。
请参阅此处的工作示例 - &gt; https://gcc.gnu.org/ml/gcc/2009-10/msg00385.html
似乎GCC没有验证optimize()参数。所以像“-ffast-match”这样的错别字会被默默地忽略。
答案 1 :(得分:1)
从CUDA 7.5(我熟悉的最新版本,虽然目前正在发布CUDA 8.0)开始,nvcc
不支持允许程序员应用特定编译器优化的函数属性基于每个功能。
由于通过命令行开关设置的优化配置适用于整个编译单元,因此一种可能的方法是使用与不同优化配置一样多的不同编译单元,如问题中已经提到的那样;源代码可以共享,#include
- 来自公共文件。
使用nvcc
,命令行开关--use_fast_math
基本上控制了三个功能区域:
您可以使用适当的内在函数以其他操作粒度应用其中一些更改,其他更改使用PTX内联汇编。