是否可以使编译器按功能使用快速运算符?

ein*_*ica 5 floating-point gcc nvcc fast-math template-instantiation

假设我有

template <bool UsesFastMath> void foo(float* data, size_t length);
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题是是否可以指示流行的编译器(*)是否适用-ffast-math于单个函数-这样我就可以在同一翻译单元中使用我的实例。

笔记:

  • 如果答案为“否”,则为解释为什么不提供加分。
  • 这是不一样的问题,这一次,大约是在运行时开启快速数学和关闭。我要谦虚得多...

(*)由流行的编译器表示我具有以下信息:gcc,clang,msvc icc,nvcc(用于GPU内核代码)。

小智 7

在GCC中,您可以声明如下函数:

__attribute__((optimize("-ffast-math")))
double
myfunc(double val)
{
    return val / 2;
}
Run Code Online (Sandbox Code Playgroud)

这是仅限GCC的功能。

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

似乎GCC不会验证optimize()参数。因此,像“ -ffast-match”这样的拼写错误将被忽略。


nju*_*ffa 4

从 CUDA 7.5(我熟悉的最新版本,尽管 CUDA 8.0 目前已发布)开始,nvcc支持允许程序员在每个函数的基础上应用特定编译器优化的函数属性。

由于通过命令行开关设置的优化配置适用于整个编译单元,因此一种可能的方法是使用与不同优化配置一样多的不同编译单元,正如问题中已经指出的那样;#include源代码可以从公共文件共享和编辑。

使用nvcc,命令行开关--use_fast_math基本上控制三个功能区域:

  • 启用清零模式(即禁用非正规支持)
  • 单精度倒数、除法和平方根切换为近似版本
  • 某些标准数学函数被等效的、较低精度的内在函数所取代

您可以通过使用适当的内在函数以每个操作的粒度应用其中一些更改,而使用 PTX 内联汇编来应用其他更改。