其他分享
首页 > 其他分享> > c – 访问未初始化的值是否会导致性能下降?

c – 访问未初始化的值是否会导致性能下降?

作者:互联网

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

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

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

剥皮有几个原因:

>懒惰
>由于剥离边框的局部性非常差,性能受到打击.
>避免复杂的边框剥离代码.

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

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

解决方法:

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

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

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

对于浮点,有两个问题:

> Signalling NaNs
> Denormalized Values

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

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

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

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

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

建议:

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

标签:c,performance,optimization,initialization,micro-optimization
来源: https://codeday.me/bug/20190901/1786579.html