访问未初始化的值会导致性能下降吗?

时间:2012-08-14 00:19:20

标签: c++ performance optimization micro-optimization initialization

我正在优化矩阵数值热点。

目前,我正在阻止和loop unrolling以提高性能。但是,我故意避免剥掉边界。相反,我让阻塞步骤溢出,当然,算法然后触及未初始化的值。

然而,矩阵被慷慨地预先分配以应对溢出,所以我实际上并非非法访问内存位置。

由于以下几个原因,我不做剥皮:

  • 懒惰
  • 由于剥离边框的位置非常糟糕而导致性能下降。
  • 避免复杂的边框剥离代码。

但是,我想知道这些触及未初始化值的溢出访问是否会导致性能下降?

我可以预见地知道未初始化的访问在哪里发生,并且它们也通过valgrind报告。我还使用英特尔的VTune对代码进行了分析,并且看不出任何迹象表明由于这种情况导致性能下降。

1 个答案:

答案 0 :(得分:5)

只是为了得到迂腐的东西:

根据标准,如果您使用未初始化的数据,可能会发生不好的事情。 (该标准允许“陷阱”值可能触发异常。)但是出于所有实际目的,这可能不适用于此。


如果您正在处理整数,访问和操作未初始化的数据将不会影响性能。 (除了划分,所有操作通常都是固定延迟)

对于浮点,有两个问题:

  1. Signalling NaNs
  2. Denormalized Values
  3. 根据环境,信令NaN可能会触发硬件异常。所以这实际上是一个正确性问题,而不仅仅是性能问题。

    非常规浮标与此有关,这可能违反直觉。然而, 未初始化的数据很有可能被非规范化

    And you really don't want to be messing with denormalized floating-point.

    因此,如果你不幸的是未初始化的值甚至有一个非规范化值,那么在每次循环迭代结束时你可能会遇到令人讨厌的100+周期惩罚。现在取决于循环的大小,这可能也可能不重要。

    那就是说,为什么未初始化的数据容易被非规范化?如果浮点值的前几位为零,则它被非规范化。就这么简单。如果数据曾经是一个整数或一个64位指针...当重新解释为浮点值时,它将被非规范化。


    建议:

    • 零初始化数据。如果它太贵了,至少零点初始化终点。
    • 通过输入清理代码避免访问未初始化的数据。像Duff's Device这样的东西可能是合适的。虽然我通常更喜欢一组二进制减少if语句。