相关疑难解决方法(0)

为什么将0.1f改为0会使性能降低10倍?

为什么这段代码,

const float x[16] = {  1.1,   1.2,   1.3,     1.4,   1.5,   1.6,   1.7,   1.8,
                       1.9,   2.0,   2.1,     2.2,   2.3,   2.4,   2.5,   2.6};
const float z[16] = {1.123, 1.234, 1.345, 156.467, 1.578, 1.689, 1.790, 1.812,
                     1.923, 2.034, 2.145,   2.256, 2.367, 2.478, 2.589, 2.690};
float y[16];
for (int i = 0; i < 16; i++)
{
    y[i] = x[i];
}

for (int j = 0; j < 9000000; j++)
{
    for (int i = 0; i < 16; i++)
    {
        y[i] *= …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point performance compilation visual-studio-2010

1491
推荐指数
5
解决办法
14万
查看次数

替换极其缓慢的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
查看次数