相关疑难解决方法(0)

gcc的ffast-math实际上做了什么?

我理解gcc的--ffast-math标志可以大大提高浮动操作的速度,并超出IEEE标准,但我似乎无法找到有关它正在发生的事情的信息.任何人都可以解释一些细节,并可能给出一个明确的例子,说明如果标志开启或关闭会有什么变化?

我确实尝试过挖掘SO以寻找类似的问题,但却找不到任何解释ffast-math工作原理的东西.

math floating-point performance gcc fast-math

138
推荐指数
2
解决办法
5万
查看次数

114
推荐指数
5
解决办法
10万
查看次数

替换极其缓慢的pow()函数

我们有一个CFD求解器,在运行模拟时,发现它在某些机器上运行速度非常慢,而在其他机器上却运行得非常慢.使用英特尔VTune,发现以下行是问题(在Fortran中):

RHOV= RHO_INF*((1.0_wp - COEFF*EXP(F0)))**(1.0_wp/(GAMM - 1.0_wp))
Run Code Online (Sandbox Code Playgroud)

使用VTune进行钻取,问题可以追溯到call pow装配线,当跟踪堆栈时,它显示它正在使用__slowpow().经过一番搜索,这个页面出现了抱怨同样的事情.

在具有libc版本2.12的机器上,模拟花了18秒.在libc版本为2.14的机器上,模拟耗时0秒.

基于上述页面的信息,当基数pow()接近1.0 时出现问题.所以我们做了另一个简单的测试,我们在之前用任意数字缩放基数pow(),然后除以在pow()调用之后提升到指数的数字.使用libc 2.12时,运行时间从18秒减少到0秒.

但是,将这些全部放在我们所做的代码上是不切实际的a**b.如何更换pow()libc中的函数?例如,我希望call powFortran编译器生成的装配线调用pow()我们编写的自定义函数来执行缩放,调用libc pow()然后除以缩放.如何创建一个对编译器透明的中间层?

编辑

为了澄清,我们正在寻找类似(伪代码)的东西:

double pow(a,b) {
   a *= 5.0
   tmp = pow_from_libc(a,b)
   return tmp/pow_from_libc(5.0, b)
}
Run Code Online (Sandbox Code Playgroud)

是否可以加载powlibc并在我们的自定义函数中重命名以避免命名冲突?如果customPow.o文件可以pow从libc 重命名,如果其他东西仍然需要libc会发生什么?这会导致libc powcustomPow.opowlibc 之间的命名冲突吗?

c fortran libc pow

24
推荐指数
2
解决办法
4192
查看次数

标签 统计

c ×2

c++ ×1

fast-math ×1

floating-point ×1

fortran ×1

gcc ×1

libc ×1

math ×1

optimization ×1

performance ×1

pow ×1