GNU编译优化级别-O -O1 -O2 -O3

最近做一个算法的GPU加速,发现实际上使用gcc的-O3(最高级编译优化)选项,可以获得很高的加速比,我的程序里达到了3倍的样子,有时效果甚至比GPU加速好。因此小小学习了下GNU的编译优化。
附言一句,在进行调试的时候,最好关闭编译优化,不然程序自动优化,执行的步骤可能稍有变化。

GNU编译器提供-O选项供程序优化使用:
-O 提供基础级别的优化
-O2 提供更加高级的代码优化,会占用更长的编译时间
-O3 提供最高级的代码优化
不同的优化级别使用的优化技术也可以单独的应用于代码。 可以使用-f命令行选项引用每个
单独的优化技术。

1, 编译器优化级别1
在优化的第一个级别执行基础代码的优化。 这个级别试图执行9种单独的优化功能:
-fdefer-pop: 这种优化技术与汇编语言代码在函数完成时如何进行操作有关。 一般
情况下, 函数的输入值被保存在堆栈中并且被函数访问。 函数返回时, 输入值还在
堆栈中。 一般情况下, 函数返回之后, 输入值被立即弹出堆栈。这样做会使堆栈中
的内容有些杂乱。

-fmerge-constans: 使用这种优化技术, 编译器试图合并相同的常量. 这一特性有
时候会导致很长的编译时间, 因为编译器必须分析c或者c++程序中用到的每个常量,
并且相互比较他们.

-fthread-jumps: 使用这种优化技术与编译器如果处理汇编代码中的条件和非条件
分支有关。 在某些情况下, 一条跳转指令可能转移到另一条分支语句。 通过一连串
跳转, 编译器确定多个跳转之间的最终目标并且把第一个跳转重新定向到最终目标。

-floop-optimize: 通过优化如何生成汇编语言中的循环, 编译器可以在很大程序上
提高应用程序的性能。 通常, 程序由很多大型且复杂的循环构成。 通过删除在循环
内没有改变值的变量赋值操作, 可以减少循环内执行指令的数量, 在很大程度上提高
性能。 此外优化那些确定何时离开循环的条件分支, 以便减少分支的影响。

-fif-conversion: if-then语句应该是应用程序中仅次于循环的最消耗时间的部分。
简单的if-then语句可能在最终的汇编语言代码中产生众多的条件分支。 通过减少
或者删除条件分支, 以及使用条件传送 设置标志和使用运算技巧来替换他们, 编译
器可以减少if-then语句中花费的时间量。

-fif-conversion2: 这种技术结合更加高级的数学特性, 减少实现if-then语句所
需的条件分支。

-fdelayed-branch: 这种技术试图根据指令周期时间重新安排指令。 它还试图把
尽可能多的指令移动到条件分支前, 以便最充分的利用处理器的治理缓存。

-fguess-branch-probability: 就像其名称所暗示的, 这种技术试图确定条件分支最可
能的结果, 并且相应的移动指令, 这和延迟分支技术类似。 因为在编译时预测代码的安排,
所以使用这一选项两次编译相同的c或者c++代码很可能会产生不同的汇编语言代码, 这取决
于编译时编译器认为会使用那些分支。 因为这个原因, 很多程序员不喜欢采用这个特性, 并且
专门地使用-fno-guess-branch-probability选项关闭这个特性

-fcprop-registers: 因为在函数中把寄存器分配给变量, 所以编译器执行第二次检查以便减少
调度依赖性(两个段要求使用相同的寄存器)并且删除不必要的寄存器复制操作。

2, 编译器优化级别2
结合了第一个级别的所有优化技术, 再加上一下一些优化:
-fforce-mem: 这种优化再任何指令使用变量前, 强制把存放再内存位置中的所有变量都复制到寄存器
中。 对于只涉及单一指令的变量, 这样也许不会有很大的优化效果. 但是对于再很多指令(必须数学操作)
中都涉及到的变量来说, 这会时很显著的优化, 因为和访问内存中的值相比 ,处理器访问寄存器中的值要
快的多。

-foptimize-sibling-calls: 这种技术处理相关的和/或者递归的函数调用。 通常, 递归的函数调用
可以被展开为一系列一般的指令, 而不是使用分支。 这样处理器的指令缓存能够加载展开的指令并且
处理他们, 和指令保持为需要分支操作的单独函数调用相比, 这样更快。

-fstrength-reduce: 这种优化技术对循环执行优化并且删除迭代变量。 迭代变量是捆绑到循环计数器
的变量, 比如使用变量, 然后使用循环计数器变量执行数学操作的for-next循环。

-fgcse: 这种技术对生成的所有汇编语言代码执行全局通用表达式消除历程。 这些优化操作试图分析
生成的汇编语言代码并且结合通用片段, 消除冗余的代码段。如果代码使用计算性的goto, gcc指令推荐
使用-fno-gcse选项。

-fcse-follow-jumps: 这种特别的通用子表达式消除技术扫描跳转指令, 查找程序中通过任何其他途径都不
会到达的目标代码。 这种情况最常见的例子就式if-then-else语句的else部分。

-frerun-cse-after-loop: 这种技术在对任何循环已经进行过优化之后重新运行通用子表达式消除例程。
这样确保在展开循环代码之后更进一步地优化还编代码。

-fdelete-null-pointer-checks: 这种优化技术扫描生成的汇编语言代码, 查找检查空指针的代码。编译
器假设间接引用空指针将停止程序。 如果在间接引用之后检查指针, 它就不可能为空。

-fextensive-optimizations: 这种技术执行从编译时的角度来说代价高昂的各种优化技术,但是它可能
对运行时的性能产生负面影响。

-fregmove: 编译器试图重新分配mov指令中使用的寄存器, 并且将其作为其他指令操作数, 以便最大化
捆绑的寄存器的数量。

-fschedule-insns: 编译器将试图重新安排指令, 以便消除等待数据的处理器。 对于在进行浮点运算时有
延迟的处理器来说, 这使处理器在等待浮点结果时可以加载其他指令。

-fsched-interblock: 这种技术使编译器能够跨越指令块调度指令。 这可以非常灵活地移动指令以便等待
期间完成的工作最大化。

-fcaller-saves: 这个选项指示编译器对函数调用保存和恢复寄存器, 使函数能够访问寄存器值, 而且不必
保存和恢复他们。 如果调用多个函数, 这样能够节省时间, 因为只进行一次寄存器的保存和恢复操作, 而
不是在每个函数调用中都进行。

-fpeephole2: 这个选项允许进行任何计算机特定的观察孔优化。

-freorder-blocks: 这种优化技术允许重新安排指令块以便改进分支操作和代码局部性。

-fstrict-aliasing: 这种技术强制实行高级语言的严格变量规则。 对于c和c++程序来说, 它确保不在数据
类型之间共享变量. 例如, 整数变量不和单精度浮点变量使用相同的内存位置。

-funit-at-a-time: 这种优化技术指示编译器在运行优化例程之前读取整个汇编语言代码。 这使编译器可以
重新安排不消耗大量时间的代码以便优化指令缓存。 但是, 这会在编译时花费相当多的内存, 对于小型计算机可能
是一个问题。

-falign-functions: 这个选项用于使函数对准内存中特定边界的开始位置。大多数处理器按照页面读取内存,
并且确保全部函数代码位于单一内存页面内, 就不需要叫化代码所需的页面。

-fcrossjumping: 这是对跨越跳转的转换代码处理, 以便组合分散在程序各处的相同代码。 这样可以减少
代码的长度, 但是也许不会对程序性能有直接影响。

3, 编译器优化级别3
它整合了第一和第二级别中的左右优化技巧, 还包括一下优化:
-finline-functions: 这种优化技术不为函数创建单独的汇编语言代码,而是把函数代码包含在调度程序的
代码中。 对于多次被调用的函数来说, 为每次函数调用复制函数代码。 虽然这样对于减少代码长度不利, 但是
通过最充分的利用指令缓存代码, 而不是在每次函数调用时进行分支操作, 可以提高性能。

-fweb: 构建用于保存变量的伪寄存器网络。 伪寄存器包含数据, 就像他们是寄存器一样, 但是可以使用各种
其他优化技术进行优化, 比如cse和loop优化技术。

-fgcse-after-reload: 这中技术在完全重新加载生成的且优化后的汇编语言代码之后执行第二次gcse优化,
帮助消除不同优化方式创建的任何冗余段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库设计笔记——关系型数据库基础知识(三)

表的行称为元组,列称为属性,行列相交的部分称为单元;关系必须规范化,属性不可再分。(每个属性必须是不可分割的最小数据单元,即表中不能再包含表);主键(Primary Key&…

模块说明(三)

模块说明(三) 惯性环节、超前滞后环节 一般先使用连续列出传递函数,然后通过极性法或者双线线性不变法将连续转换为离散。 实例讲解 通常是通过电子电路对其进行补偿的。 记忆模块、零阶保持器、一阶保持器 离散PID 可参考连续PID…

数据库设计笔记——MySQL基础知识(四)

概述关系型数据库——由表来存储相关的数据,MySQL,SQL Server,Oracle等都是关系型数据库;元数据:用于集成并管理数据。MySQL数据库 用户数据库:用户根据需求创建数据库系统数据库information_schema&#x…

Python 数据科学入门

http://python.jobbole.com/85394/ Python 在数据科学领域越来越流行了。它的流行不无道理。 Python 容易学,有超强数据科学库,并且和 Hadoop 以及 Spark 等数据库和工具整合得非常好。Python 可以从头至尾完成一个数据科学项目,无论是读取…

哪些钱借了可以不还?

借钱竟然可以不还?这个估计很多人都不知道,但是在实际民间借贷中,确实是有一些借贷关系是不受法律保护的,那哪些债务还是不受法律保护的呢?(一)借款用于非法用途案例:任某在生意场上…

模块说明(四)

模块说明(四) 比较模块 判断一个矩阵是否为一个奇异矩阵,看其行列式是否为0 位设置与清零模块 位运算模块 按位运算 位提取、位移运算模块 检测模块 表查询库 表查询模块

C++等级考试知识点总结

第一章 C语言概述C是一种面向对象的程序设计语言抽象数据类型封装和信息隐藏以继承和派生方式实现程序的重用以运算符重载和虚函数来实现多态性以模板来实现类型的参数化 C是C语言的超集C继承了C语言简明、高效、灵活等众多优点以前使用C语言编写的大批软件可以不加任何修改&am…

reverse string

https://leetcode.com/problems/reverse-string/ Write a function that takes a string as input and returns the string reversed. Example: Given s “hello”, return “olleh”. 1. char* reverseString(char* s) {int i 0;int j strlen(s) - 1;while(i < j) …

PID控制器_Matlab/Simulink仿真

PID控制器_Matlab/Simulink仿真 Kp:比例增益;Kpe:当前误差 KI:积分增益;KI∫edt:过去误差,累计 KD:微分增益;KD*de/dt:变换趋势 PD控制是增加了一个零点 例子: simulink操作

银行停贷、涨息、排队,8月不贷只能等明年

这几天做贷款的朋友圈被这种消息刷屏了没&#xff1f;据深圳商报报道&#xff0c;目前深圳一些大银行已经出现了贷款资金余额不足的情况&#xff0c;甚至有的银行已经停止信用贷款的发放&#xff1b;业内人士认为&#xff0c;信贷额度紧张局面估计持续到年底。除了深圳&#xf…

如何快速把借呗额度提高到10万?

借呗是一个很好的贷款工具&#xff0c;快&#xff0c;简&#xff0c;省等优点深得广大网友的喜爱。但是借呗虽然好用&#xff0c;却受限于额度&#xff0c;很多人的额度都是在3万以内&#xff0c;能超过10万的毕竟是少数人&#xff0c;看到别人几十万的额度&#xff0c;你是不是…

Simulink模糊控制入门

Simulink模糊控制入门 第一步:在命令窗口输入 fuzzy 在命令窗口输入 :doc Implement Fuzzy PID Controller in Simulink Using Lookup Table可以找到模糊控制说明的文档 另一种设置隶属函数的方式(建议):先删除所有的FMs在添加7个就行

sum of two integers

https://leetcode.com/problems/sum-of-two-integers/ Calculate the sum of two integers a and b, but you are not allowed to use the operator and -. Example: Given a 1 and b 2, return 3. 注释&#xff0c;这个题目有意思&#xff0c;学过FPGA的人都知道最基本…

监管升级,央行变相加息,贷款难还在继续

近段看到很多有贷款需求的朋友已经排队很久了&#xff0c;但是贷款还是没有着落&#xff0c;而还在观望的朋友&#xff0c;对不起&#xff0c;可能贷款没你的份了&#xff0c;因为监管正在升级&#xff0c;说白了就是央行变相加息&#xff0c;让贷款更难。银行同业存单纳入MPA考…

集成运放笔记

集成运放笔记 1 电压传输特性 开环 u0A0d(Up-Un) 线性区 阻容耦合无法集成 电流源电路 比例电流源 微电源 以电流源为有源负载的放大电路 共射放大电路 放大电路中的反馈 基本概念和判断 反馈&#xff1a;输出量影响输入量 正反馈&#xff1a;增强了净输入量 负反馈&a…

网络技术等级考试知识点

第一章 网络系统结构与设计的基本原则第二章 中小型网络系统总体规划与设计方法第三章 IP地址规划设计技术第四章 路由设计基础第五章 局域网技术第六章 交换机及其配置第七章 路由器及其配置第八章 无线局域网设备安装与调试第九章 计算机网络新型服务系统的安装与配置第十章 …

音频特征域方法

特征域方法摘自&#xff1a;严勤 吕勇著《语音信号处理与识别》 特征域方法可分为鲁棒特征提取 和 特征补偿两个子类。 鲁棒特征提取&#xff1a;致力于寻找更加稳健的声学特征&#xff0c;这些特征受语音变异性的影响较小&#xff0c;因此测试集和训练集的声学特征可以保持较高…

linu的安装

linu的安装 基本说明 学习Linux需要一个环境&#xff0c;我们需要创建一个虚拟机&#xff0c;然后在虚拟机上安装一个Centos系统来学习。 1.先安装virtual machine 15.5 再安装Linux(CentOS 7.6/centOS8.1) 3.原理示意图 vmware15.5下载 VM安装的步骤 使用迅雷下载 …

Maximum Depth of Binary Tree

https://leetcode.com/problems/maximum-depth-of-binary-tree/ Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 求给定二叉树的最大的深度&#xff…

MATLAB工具常用函数

简介MATLAB 是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。使用 MATLAB&#xff0c;可以较使用传统的编程语言&#xff08;如 C、C 和 Fortran&#xff09;更快地解决技术计算问题。 应用范围&#xff1a;包括信号和图像处理、通讯、控…