我可以让我的编译器在每个函数的基础上使用快速数学吗?

时间:2016-11-19 23:34:31

标签: gcc floating-point nvcc fast-math template-instantiation

假设我有

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

我想用-ffast-math--use-fast-math为nvcc)编译一个实例,而另一个实例化没有它。

这可以通过在单独的翻译单元中实例化每个变体,并使用不同的命令行编译每个变体来实现 - 使用和不使用开关。

我的问题是,是否有可能向热门编译器(*)表明是否应用-ffast-math来实现个别功能 - 以便我能够在我的实例中进行实例化。相同的翻译单位。

备注:

  • 如果答案是&#34;否&#34;,奖励积分可以解释原因。
  • 这与this one的问题不同,后者是关于在运行时打开和关闭快速数学的问题。我谦虚得多......

(*)受欢迎的编译器我的意思是:gcc,clang,msvc icc,nvcc(用于GPU内核代码),你有这些信息。

2 个答案:

答案 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内联汇编。