循环展开与循环平铺

pas*_*ena 16 c++ compiler-construction optimization nasm

有人可以告诉我们2种优化技术是相同还是不同?

此外,程序员或编译器是否有责任这样做?

Mic*_*l J 24

这两种技术是不同的.请参阅循环展开循环平铺的说明.

完成循环展开以消除循环的开销.它(通常)仅对相当小的循环有用,其中迭代次数很少并且在编译时是已知的.它主要由编译器完成.

在较旧的时候,当计算机速度较慢而编译器更加原始时,程序员会进行手动循环展开,但现在程序员做这件事是不寻常的 - 除非是非常严格的嵌入式系统.

循环平铺通常用非常大的数据集完成.目标是:在一些新数据中进行分页之前,将一些数据加载到高速缓冲存储器中并对其执行所有操作.

根据正在执行的操作和数据的内部组织,一个简单的循环可能会跳转到不同的数据页面,从而导致大量缓存未命中(和页面加载).仔细规划执行顺序可以显着改善某些问题的运行时间.

虽然编译器可能会执行循环切片,但有时程序员可能会手动执行此操作,并且可能比编译器做得更好.

通常,不要尝试进行这些类型的优化,因为它们会给代码增加很多复杂性(和错误),并且通常只能提供适度的性能提升.但是,如果您的代码很慢并且分析表明特定类型的瓶颈,那么应该考虑循环平铺之类的东西,这可能会带来很大的性能提升.

  • 这些类型的优化对性能至关重要。我很想看到没有它们的高性能 matmul。我同意它会增加复杂性并因此增加潜在的错误,但即使是那些也可以通过良好的实践来管理。平铺和展开是所有处理繁重数学的程序员都应该熟悉的优化。 (2认同)

Pau*_*l R 19

这是两种完全不同的性能优化.

循环展开是一种代码优化,其中代码在循环内被复制,并且循环迭代的总数减少.好处是减少了循环开销(通常仅与非常小的循环相关),并且在超标量CPU中具有减少的依赖性停顿的更好的指令调度.这可以手动和/或作为编译器优化来完成.

平铺是一种内存优化,旨在通过处理平铺(较大数据结构中的小块)来更好地利用缓存,通常在图像或其他2D数据结构的上下文中.这通常在源代码级实现,作为算法实现的整体设计的一部分.

  • @delnan:它们都是*性能*(即速度)优化,但是循环展开通过提高代码效率实现了这一点,而平铺通过更好地使用缓存/内存层次结构实现了性能提升. (6认同)