7

Suppose I have

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

and I want to compile one instantiation with -ffast-math (--use-fast-math for nvcc), and the other instantiation without it.

This can be achieved by instantiating each of the variants in a separate translation unit, and compiling each of them with a different command-line - with and without the switch.

My question is whether it's possible to indicate to popular compilers (*) to apply or not apply -ffast-math for individual functions - so that I'll be able to have my instantiations in the same translation unit.

Notes:

  • If the answer is "no", bonus points for explaining why not.
  • This is not the same questions as this one, which is about turning fast-math on and off at runtime. I'm much more modest...

(*) by popular compilers I mean any of: gcc, clang, msvc icc, nvcc (for GPU kernel code) about which you have that information.

4

2 回答 2

11

在 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”这样的错别字将被默默地忽略。

于 2016-11-20T10:07:36.627 回答
4

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

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

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

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

您可以通过使用适当的内部函数以按操作粒度应用其中一些更改,其他更改则使用 PTX 内联汇编。

于 2016-11-21T18:56:39.930 回答