【发布时间】:2012-08-14 00:19:19
【问题描述】:
我正在优化一个矩阵数值热点。
目前,我正在做阻塞和loop unrolling 以提高性能。但是,我故意避免剥去边框。相反,我让阻塞步骤溢出,当然,算法随后会触及未初始化的值。
但是,矩阵被慷慨地预先分配以应对溢出,所以我实际上并没有非法访问内存位置。
我不剥皮有几个原因:
- 懒惰
- 由于剥落边框的位置非常糟糕,性能受到影响。
- 避免复杂的边框剥离代码。
但是,我想知道这些触及未初始化值的溢出访问是否真的会导致性能下降?
我可以预见地知道未初始化的访问发生在哪里,并且它们也通过 valgrind 报告。我还使用 Intel 的 VTune 对代码进行了概要分析,并且看不到任何表明性能下降的迹象。
【问题讨论】:
-
+1,我强烈建议您至少对它们进行零初始化。假设您正在使用浮点,未初始化的数据很可能被非规范化。 And you do not want that to mess up your performance.
-
我知道,但是用
memset贪婪地将预先分配的矩阵池清零也非常昂贵。 -
虽然取决于循环的大小,但每个循环结束时几百个循环的惩罚可能并不明显。
-
您不必初始化整个数据集。只是终点。
-
加载未初始化的值不会影响性能。但是,如果您尝试对它们进行任何算术运算,那么它肯定会受到非规范化的影响。
标签: c++ performance optimization micro-optimization initialization