ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-01 23:09:06  阅读:238  来源: 互联网

标签:c performance optimization initialization micro-optimization


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

目前,我正在阻止和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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有