我正在优化矩阵数值热点。
目前,我正在阻止和loop unrolling以提高性能。但是,我故意避免剥掉边界。相反,我让阻塞步骤溢出,当然,算法然后触及未初始化的值。
然而,矩阵被慷慨地预先分配以应对溢出,所以我实际上并非非法访问内存位置。
由于以下几个原因,我不做剥皮:
但是,我想知道这些触及未初始化值的溢出访问是否会导致性能下降?
我可以预见地知道未初始化的访问在哪里发生,并且它们也通过valgrind报告。我还使用英特尔的VTune对代码进行了分析,并且看不出任何迹象表明由于这种情况导致性能下降。
答案 0 :(得分:5)
只是为了得到迂腐的东西:
根据标准,如果您使用未初始化的数据,可能会发生不好的事情。 (该标准允许“陷阱”值可能触发异常。)但是出于所有实际目的,这可能不适用于此。
如果您正在处理整数,访问和操作未初始化的数据将不会影响性能。 (除了划分,所有操作通常都是固定延迟)
对于浮点,有两个问题:
根据环境,信令NaN可能会触发硬件异常。所以这实际上是一个正确性问题,而不仅仅是性能问题。
非常规浮标与此有关,这可能违反直觉。然而, 未初始化的数据很有可能被非规范化。
And you really don't want to be messing with denormalized floating-point.
因此,如果你不幸的是未初始化的值甚至有一个非规范化值,那么在每次循环迭代结束时你可能会遇到令人讨厌的100+周期惩罚。现在取决于循环的大小,这可能也可能不重要。
那就是说,为什么未初始化的数据容易被非规范化?如果浮点值的前几位为零,则它被非规范化。就这么简单。如果数据曾经是一个整数或一个64位指针...当重新解释为浮点值时,它将被非规范化。
建议: