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

C++ 访问未初始化的值会导致性能下降吗?,c++,performance,optimization,micro-optimization,initialization,C++,Performance,Optimization,Micro Optimization,Initialization,我正在优化一个矩阵数值热点 目前,我正在进行阻塞,以提高性能。然而,我故意避免剥去边界。相反,我让阻塞步骤溢出,当然,算法随后会触及未初始化的值 然而,矩阵是慷慨地预先分配,以应付溢出,所以我实际上没有非法访问内存位置 我不做脱皮有几个原因: 懒惰 由于剥离边界案例的位置非常糟糕,性能受到影响 避免复杂的边界剥离代码 但是,我想知道这些溢出的访问是否会影响未初始化的值 可以预见,我知道未初始化的访问发生在哪里,它们也会通过valgrind报告。我还使用Intel的VTune对代码进行了分析,

我正在优化一个矩阵数值热点

目前,我正在进行阻塞,以提高性能。然而,我故意避免剥去边界。相反,我让阻塞步骤溢出,当然,算法随后会触及未初始化的值

然而,矩阵是慷慨地预先分配,以应付溢出,所以我实际上没有非法访问内存位置

我不做脱皮有几个原因:

  • 懒惰
  • 由于剥离边界案例的位置非常糟糕,性能受到影响
  • 避免复杂的边界剥离代码
但是,我想知道这些溢出的访问是否会影响未初始化的值


可以预见,我知道未初始化的访问发生在哪里,它们也会通过valgrind报告。我还使用Intel的VTune对代码进行了分析,没有看到任何迹象表明性能会因此而下降。

为了避免迂腐的东西:

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


如果处理整数,访问和操作未初始化的数据将不会对性能产生影响。(除除法外,所有操作通常都是固定延迟)

对于浮点,有两个问题:

  • 根据环境的不同,信令NAN可能触发硬件异常。所以这实际上是一个正确性问题,而不仅仅是性能问题

    非规范浮动与此相关可能与直觉相反。然而, 未初始化的数据具有很高的非规范化概率

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

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


    建议:

    • 零初始化数据。如果成本太高,则至少为零初始化端点
    • 通过输入清除代码,避免访问未初始化的数据。像这样的东西可能是合适的。虽然我通常更喜欢一组二进制归约if语句

    +1,我强烈建议您至少对它们进行零初始化。假设您使用的是浮点,未初始化的数据很有可能被非规范化。我知道,但是贪婪地用
    memset
    将预先分配的矩阵池归零也是非常昂贵的。尽管这取决于循环的大小,但每个循环结束时几百个循环的代价可能并不明显。您不必初始化整个数据集。仅仅是结束点。加载未初始化的值不会影响性能。但如果你试图对它们做任何运算,那么它肯定会受到伤害,结果是非规范化。