MATLAB中截断三对角矩阵循环为何比完整循环更慢?
优化后算法更慢的原因分析
缓存命中率差异
原循环中j从1到n连续遍历Q的列,在Matlab这类列优先存储的环境中,Q的列是连续内存块,CPU缓存能高效命中,内存访问延迟极低。而优化后的循环直接跳至j=n-1和j=n,访问的内存位置不连续,极易触发缓存 miss,需要等待内存数据加载,这部分延迟远超过跳过的几次迭代节省的时间。编译器优化能力受限
原循环是规则的连续迭代,编译器可自动进行循环展开、SIMD向量化等优化,将多个迭代的运算打包成单指令多数据操作,大幅提升计算效率。但优化后的循环仅执行2次迭代,编译器无法有效开展向量化优化,直接失去了原循环的并行计算收益。分支判断的额外开销
每次执行这段代码都要做if n>3的分支判断,若这段代码处于外层大循环(比如n从1逐步增长到目标规模),当n在3附近切换时,CPU的分支预测容易失败,分支预测失败会导致流水线清空并重新填充,带来额外的性能损耗。CPU流水线执行的停顿
原循环的连续迭代能充分利用CPU的流水线执行特性,即使前面几次迭代计算的H值为0,这些运算也能填充流水线,让后续的有效计算并行进行。优化后的循环打破了流水线的连续性,导致CPU出现执行停顿,反而增加了整体耗时。
内容的提问来源于stack exchange,提问作者Giorgio Martinez
相关产品推荐
相关产品推荐

