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