Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 循环展开与循环平铺_C++_Optimization_Compiler Construction_Nasm - Fatal编程技术网

C++ 循环展开与循环平铺

C++ 循环展开与循环平铺,c++,optimization,compiler-construction,nasm,C++,Optimization,Compiler Construction,Nasm,有人能告诉我这两种优化技术是相同的还是不同的吗 另外,这是程序员或编译器的责任吗?这是两种完全不同的性能优化 循环展开是一种代码优化,在循环中复制代码,并减少循环迭代的总数。这样做的好处是减少了循环开销(通常只与非常小的循环相关),并且在超标量CPU中减少了依赖暂停,从而实现了更好的指令调度。这可以手动和/或作为编译器优化来完成 平铺是一种内存优化,旨在通过处理平铺(较大数据结构中的小块)更好地利用缓存,通常是在图像或其他2D数据结构的上下文中。这通常在源代码级别实现,作为算法实现总体设计的一部

有人能告诉我这两种优化技术是相同的还是不同的吗


另外,这是程序员或编译器的责任吗?

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

循环展开是一种代码优化,在循环中复制代码,并减少循环迭代的总数。这样做的好处是减少了循环开销(通常只与非常小的循环相关),并且在超标量CPU中减少了依赖暂停,从而实现了更好的指令调度。这可以手动和/或作为编译器优化来完成


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

这两种技术是不同的。请参阅和的说明

循环展开是为了消除循环的开销。它(通常)只对迭代次数较少且在编译时已知的相当小的循环有用。这主要是由编译器完成的

在旧时代,计算机速度较慢,编译器更原始,程序员会手动展开循环,但现在程序员这样做是不常见的——除了非常严格的嵌入式系统

循环平铺通常使用非常大的数据集来完成。其目的是:将一些数据加载到缓存中,并在分页某些新数据之前对其执行所有操作

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

虽然编译器可能会执行循环平铺,但有时程序员可能会手动执行,并且可能比编译器做得更好


一般来说,不要尝试进行这些类型的优化,因为它们会给代码增加很多复杂性(和bug),并且通常只提供适度的性能提升。但是,如果您的代码速度较慢,并且分析表明存在特定类型的瓶颈,则应考虑使用循环平铺之类的方法,这样可能会带来较大的性能提升。

循环展开是一种速度优化。这两种优化(实际上几乎全部)都应用于代码。@delnan:它们都是性能(即速度)优化,但循环展开通过提高代码效率来实现这一点,而平铺通过更好地使用缓存/内存层次结构来提高性能。这些类型的优化对性能至关重要。我很想看到没有他们的表演。我同意这可能会增加复杂性,从而导致潜在的bug,但即使是这些bug也可以通过良好的实践进行管理。平铺和展开是所有处理繁重数学的程序员都应该熟悉的优化。即使迭代次数很大或未知,小循环的展开也是至关重要的。编译器可以展开(例如)8次,并添加代码以处理最后0-7次迭代。(罐头。你必须检查他们是否真的有。)