我有一些函数包含一些x * 0.f
表达式。如果我使用编译标志/fp:fast,那些就会被优化掉。但显然无法用#pragma float_control(...)
设置此标志 - 不确定原因。因此,我尝试使用__assume(...)
内在函数来触发某些变量的优化步骤 - 但是根据不起作用的汇编输出。任何人都有另一个想法如何触发fp:某些函数的快速语义?
答案 0 :(得分:0)
显然我错过了documentation ...
中的重要部分这是snippet,适用于MSVC和GCC
// GCC
#if defined(__GNUC__)
#define USERLIB_PRAGMA(x) _Pragma(#x)
// MSVC
#elif defined(_MSC_VER)
#define USERLIB_PRAGMA(x) __pragma(x)
// Fallback
#else
#define USERLIB_PRAGMA(x)
#endif
// GCC
#if defined(__GNUC__)
#define USERLIB_FAST_MATH_BEGIN \
USERLIB_PRAGMA(GCC push_options) \
USERLIB_PRAGMA(GCC optimize("fast-math")) \
#define USERLIB_FAST_MATH_END \
USERLIB_PRAGMA(GCC pop_options) \
// MSVC
#elif defined(_MSC_VER)
#define USERLIB_FAST_MATH_BEGIN \
USERLIB_PRAGMA(float_control(except, off, push)) \
USERLIB_PRAGMA(float_control(precise, off, push)) \
#define USERLIB_FAST_MATH_END \
USERLIB_PRAGMA(float_control(pop)) \
USERLIB_PRAGMA(float_control(pop)) \
// Fallback
#else
#define USERLIB_FAST_MATH_BEGIN
#define USERLIB_FAST_MATH_END
#endif
float a(float x) {
return 0.f * x;
}
USERLIB_FAST_MATH_BEGIN
float b(float x) {
return 0.f * x;
}
USERLIB_FAST_MATH_END
float c(float x) {
return 0.f * x;
}