【发布时间】:2017-04-03 14:27:50
【问题描述】:
假设我有
template <bool UsesFastMath> void foo(float* data, size_t length);
我想用-ffast-math 编译一个实例化(--use-fast-math 用于 nvcc),而另一个实例化没有它。
这可以通过在单独的翻译单元中实例化每个变体来实现,并使用不同的命令行编译每个变体 - 使用和不使用开关。
我的问题是,是否可以向流行的编译器 (*) 指示是否对单个函数应用 -ffast-math - 这样我就可以在同一个翻译单元中进行实例化。
注意事项:
- 如果答案是“否”,解释为什么不加分。
- 这与this one 的问题不同,后者是关于在运行时打开和关闭快速数学。我比较谦虚...
(*) 对于流行的编译器,我指的是您拥有这些信息的 gcc、clang、msvc icc、nvcc(用于 GPU 内核代码)中的任何一个。
【问题讨论】:
-
nvcc: 否。编译标志是在每个编译单元的基础上应用的。没有等效的函数属性可以在每个函数的基础上应用它。如果您想应用不同的标志,请将代码粘贴到不同的编译单元中(如果您愿意,可以包含来自同一文件的源代码)。对于严格的本地控制,各种 CUDA 设备内在函数(或者最坏的情况,一些内联汇编)可以提供您需要的大部分内容。 -
我已按照建议提供了答案
标签: gcc floating-point nvcc fast-math template-instantiation