![](/img/trans.png)
[英]std::shared_ptr vs std::make_shared: unexpected cache misses and branch prediction
[英]Performance of std::pow - cache misses?
我一直在努力优化我的数字程序,并且遇到了一些神秘的问题。 我循环执行数千个浮点运算的代码,其中1个调用pow
- 然而,该调用占用了5%的时间......这不一定是关键问题,但它很奇怪,所以我想要了解发生了什么。
当我查找缓存未命中时,VS.NET 2010RC的分析器报告说std::pow
中几乎所有缓存未命中都发生了...所以......那是什么呢? 有更快的替代方案吗? 我试过powf
,但这只是稍快一点; 它仍然是异常缓存未命中数的原因。
为什么像pow这样的基本功能会导致缓存未命中?
编辑:这不是托管代码。 /Oi
内在函数已启用,但编译器可以选择忽略它。 用exp(y*log(x))
替换pow(x,y)
具有类似的性能 - 刚才所有的缓存未命中都在log函数中。
是的......它很慢。 至于为什么那些感觉更自信的人可以尝试解释。
想加快速度吗? 这里: http : //martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-cc/
您能否提供有关'x'以及评估战俘的环境的更多信息?
您所看到的可能是工作中的硬件预取程序。 根据分析器,不同汇编指令的“成本”分配可能不正确,在评估pow所需的长延迟指令上应该更频繁。
除此之外,我会使用像VTune / PTU这样的真正的分析器,而不是任何Visual Studio版本中可用的分析器。
如果你的代码涉及一些繁重的数字运算,我不会太惊讶std::pow
占用了5%的运行时间。 许多数值运算速度非常快,因此像std::pow
这样稍微慢一点的操作相对于其他已经很快的操作来说似乎需要更多的时间。 (这也可以解释为什么你没有看到很多改进转换为std::powf
。)
缓存未命中有点令人费解,如果没有更多数据,很难提供解释。 一种可能性是,如果你的其他代码是如此内存密集,以至于它吞噬了所有分配的缓存,那么std::pow
在缓存未命中的所有优势就不足为奇了。
如果用另一个函数替换std::pow(var)
,比如std::max(var, var)
,它还会占用5%吗? 你还得到所有缓存未命中吗?
我猜不到准时,也就是缓存未命中。 计算能力比许多其他操作(你使用的是哪些?)慢。 调用不在缓存中的代码将导致缓存未命中,无论它是哪个函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.