编译器优化

C++11中memory_order_consume的目的

匿名 (未验证) 提交于 2019-12-03 00:29:01
原文: The Purpose of memory_order_consume in C++11 在C++11标准原子库中,大多数函数接收一个memory_order参数: enum memory_order { memory_order_relaxed, memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cst }; 上面的值被称为 内存顺序约束 。每一个都有自己的目的。在它们之中,memory_order_consume很可能是最少被正确理解的。它是最复杂的排序约束,也最难被正确使用。尽管如此,然而还是吸引着好奇的程序员去弄懂它--或者只是想解开它的神秘面纱。这就是这篇文章的目的所在。 首先,让这个术语直白着:一个使用memory_order_consume的操作具有 消费语义 (consume semantics)。我们称这个操作 为消费操作 (consume operations)。 也许对于memory_order_consume最的价值的观察结果就是总是可以安全的将它替换成memory_order_acquire。那是因为 获取操作 (acquire operations)提供了消费操作(consume

编译原理学习小结_0

匿名 (未验证) 提交于 2019-12-03 00:19:01
编译器简介 编译器是一个翻译程序。将一种程序翻译成另一种语言(如汇编或其他语言)。作为翻译的重要组成部分,编译器能够向用户报告编译的源程序的出现的错误。 编译器分类 一遍编译器 多遍编译器 装入并执行编译器 调试编译器 优化编译器 等 编译器模型――分析-综合模型 编译有两部分组成:分析和综合。分析部分将源程序切分成一些基本快并形成源程序的中间表示,综合部分将源程序的中间表示转换为所需的目标程序。 编译器的前驱和后缀 源程序分析 三个阶段: 1、线性分析 2、层次分析 3、语义分析 词法分析:线性分析被称为词法分析或扫描。此过程将记号的空格将被删除(提取元素)。 语法分析:又被称为层次分析。将程序分成不同结构,来实现语法的分析( 如分辨表达式和语句 )。实现程序的层次结构通常是通过递归来表达的。 语义分析:语义分析阶段检测源程序的语义错误,并收集代码生成阶段要用到的类型信息。语义分析的重要组成部分是类型检查。类型检查负责检验每个操作符的操作数是否满足源语言的说明。 编译器的各阶段 符号表管理 符号表是一个数据结构。每个标识符在符号表都有一条记录,记录每个域对应于标识符的一个属性(存储位置、类型、作用域)。 各分析阶段 词法分析器:此阶段将源码去掉空格,生成字符流,对每个标记符建立记号。 语法分析器:将源码建立层次。 语义分析器:对错误进行检查(其实前三个过程都有检查源码错误

编译原理学习小结_0

匿名 (未验证) 提交于 2019-12-03 00:18:01
编译器简介 编译器是一个翻译程序。将一种程序翻译成另一种语言(如汇编或其他语言)。作为翻译的重要组成部分,编译器能够向用户报告编译的源程序的出现的错误。 编译器分类 一遍编译器 多遍编译器 装入并执行编译器 调试编译器 优化编译器 等 编译器模型――分析-综合模型 编译有两部分组成:分析和综合。分析部分将源程序切分成一些基本快并形成源程序的中间表示,综合部分将源程序的中间表示转换为所需的目标程序。 编译器的前驱和后缀 源程序分析 三个阶段: 1、线性分析 2、层次分析 3、语义分析 词法分析:线性分析被称为词法分析或扫描。此过程将记号的空格将被删除(提取元素)。 语法分析:又被称为层次分析。将程序分成不同结构,来实现语法的分析( 如分辨表达式和语句 )。实现程序的层次结构通常是通过递归来表达的。 语义分析:语义分析阶段检测源程序的语义错误,并收集代码生成阶段要用到的类型信息。语义分析的重要组成部分是类型检查。类型检查负责检验每个操作符的操作数是否满足源语言的说明。 编译器的各阶段 符号表管理 符号表是一个数据结构。每个标识符在符号表都有一条记录,记录每个域对应于标识符的一个属性(存储位置、类型、作用域)。 各分析阶段 词法分析器:此阶段将源码去掉空格,生成字符流,对每个标记符建立记号。 语法分析器:将源码建立层次。 语义分析器:对错误进行检查(其实前三个过程都有检查源码错误

方舟之应用编译篇

匿名 (未验证) 提交于 2019-12-02 23:59:01
华为方舟编译器开源了 介绍了方舟编译器的基本功能与编译方法,那么方舟编译器该怎么用,如何对我们的应用进行优化呢? 查找华为方舟编译器的相关资料,发现其开源范围介绍说:目前开源的部分只是 编译器IR+中端语言 部分的源码,而编译器前端、后端(生成汇编)、编译优化的代码需要在后续逐步开源( 但是从编译情况对比来看,目前除了运行时库生成so文件的部分未开源,其余文件均可生成,具体还需要等待全部代码开源后确认 )。 ・ 正 ・ 文 ・ 来 ・ 啦 ・ 好了,话不多说,开始DEMO代码的编译吧(以samples/helloworld为例,在编译前需要保证方舟编译器已经编译通过,生成了需要的 maple、mplcg、jbc2mpl、java2jar 这四个文件)。 1. 下载环境需要的jar包(开源代码缺少java-core.jar包) //OpenArkCompiler //使用wget https://gitee.com/mirrors/java-core/blob/master/java-core.jar 获取的文件有问题 mkdir libjava-core cd libjava-core git clone https://gitee.com/mirrors/java-core.git mv java-core/java-core.jar ./ 2. 配置环境,生成libjava

01 编译原理概述

匿名 (未验证) 提交于 2019-12-02 23:57:01
。 华为方舟编译器,由华为公司研发,支持多种编程语言、多种芯片平台的联合编译、运行而设计的统一编程的开发平台,包含编译器、工具链、运行时等关键部件。华为的方舟编译器的原理是替代传统的语言虚拟机的静态编译方式,方舟能够直接将高级编程语言编写的命令语句直接转换成计算机读取以及运行起来速度更快的机器码,代替了解释器,减少了编译的过程所占据的资源,提升了系统整体的运行效率。 本次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示(IR)和语言编译实现,同时搭配编译器其他二进制组件,实现Java程序到aarch64汇编指令的编译过程。开发者可基于开源代码+二进制,编译构建出编译器工具链,尝试对Java程序进行编译。社区参与者可以通过框架源码学习方舟编译器的编译器中间表达(IR)及基本的中端编译框架,熟悉方舟编译器的架构思想,并参与诸如对编译器中端优化的贡献。 来源:博客园 作者: HvYan 链接:https://www.cnblogs.com/HvYan/p/11452083.html

C/C++中extern关键字详解

僤鯓⒐⒋嵵緔 提交于 2019-12-02 23:51:35
转自 https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 1 基本解释 :extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释! 第二,当extern不与"C"在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段

编译器的优化

匿名 (未验证) 提交于 2019-12-02 23:49:02
编译器使用的优化技巧 a、1. 变量 优化 b 、加法的优化 变量+变量 = lea reg32,[变量+变量] 变量+变量 = add eax,xx 变量+常量 = add 变量+常量 变量+1 = inc 变量 b 、减法的优化 变量-变量 = lea reg32,[变量-变量] 变量-变量 = sub xx,xx 变量-常量 = add 变量+补码(常量) 变量-1 = dec 变量 c 、乘法优化 变量*常量(为2的幂)=shl eax, n(2^n)(乘数为2的幂) 变量*常量(非2的幂)=lea eax, [变量+变量*n] 变量*变量=Imul reg32 d 、除法的优化 普通除法: mov Reg32_1, XXXXXXXXh(除数) imul Reg32_2(被除数) add edx,Reg32_2 sar edx,xxx mov eax,edx Shr eax,1Fh mov Reg32_1, XXXXXXXXh(除数) imul Reg32_2(被除数) mov Reg32_1, edx shr Reg32_1, 1Fh add Reg32_1, edx 应用计算结果 (除数=XXXXXXXXh*2^-32 如果倒数被向上圆整了,那么根据sar指令后的数值向下 圆整即可) 除数为2的次方: mov eax, (被除数) cdq and edx, XXh

Centos 6.9 编译安装gcc 4.8.5

眉间皱痕 提交于 2019-12-02 21:36:40
前言 GCC (GNU Compiler Collection,GNU编译器合集)是linux以及其他类UNIX平台上进行开源项目,软件开发等必不可少的工具链组成之一。(其他的还有clang以及llvm等编译器) 对于程序员以及系统管理员而言,经常需要从软件的源码进行手动编译安装, 不论是configure脚本,还是make工具,最终都需要调用gcc(或者其它编译器)来进行实际的编译工作。 另外,各种软件也经常需要使用gcc的新版特性,并且与旧版gcc共存,根据实际的需求进行调用。 实验环境:VMware Workstation Pro 14(试用版) 系统平台: CentOS release 6.9 (Final) 内核 2.6.32-696.el6.x86_64 软件包:minimal最小化安装 基础知识 glibc GNU C Library https://www.gnu.org/ GNU C库项目提供了 GNU系统和GNU / Linux系统的核心库,以及许多其他使用Linux作为内核的系统。glibc是Linux系统中最底层的API,几乎其它任何的运行库都要依赖glibc。这些库提供了关键的API, 包括ISO C11,POSIX.1-2008,BSD,操作系统特定的API等等。这些API包括open, read,write,malloc,printf,

java解释执行和编译执行

匿名 (未验证) 提交于 2019-12-02 21:35:18
解释执行:将编译好的字节码一行一行地翻译为机器码执行。 编译执行:以方法为单位,将字节码一次性翻译为机器码后执行。 前者的优势在于不用等待,后者则在实际运行当中效率更高。 为了满足不同的场景,HotSpot虚拟机内置了多个即时编译器:C1,C2与Graal。 C1:即Client编译器,面向对启动性能有要求的客户端GUI程序,采用的优化手段比较简单,因此编译的时间较短。 C2:即Server编译器,面向对性能峰值有要求的服务端程序,采用的优化手段复杂,因此编译时间长,但是在运行过程中性能更好。   从Java7开始,HotSpot虚拟机默认采用分层编译的方式:热点方法首先被C1编译器编译,而后 热点方法中的热点再进一步被C2编译(理解为二次编译,根据前面的运行计算出更优的编译优化)。为了不干扰程序的正常运行,JIT编译时放在额外的线程中执行的,HotSpot根据实际CPU的资源,以1:2的比例分配给C1和C2线程数。在计算机资源充足的情况,字节码的解释运行和编译运行时可以同时进行,编译执行完后的机器码会在下次调用该方法时启动,已替换原本的解释执行(意思就是已经翻译出效率更高的机器码,自然替换原来的相对低效率执行的方法)。 JIT编译: 现在主流的商用虚拟机(如Sun HotSpot、IBM J9)中几乎都同时包含解释器和编译器(三大商用虚拟机之一的 JRockit 是个例外

深度学习引擎

◇◆丶佛笑我妖孽 提交于 2019-12-02 17:08:44
目录 本文目的 主流框架的问题 Training Inference 已有框架 为什么复杂,以及问题 历史类似问题 解决方案: 深度学习解决方案 TVM 特点 竞争对手 TVM的IR 偏算子端的IR 偏计算图端的部分 XLA的IR eg代码优化 Q: 深度学习编译和传统编译的技术路线差别 方法 ref: 深度学习引擎 本文目的 高效的Inference框架 主流框架的问题 Training TensorFlow,PyTorch Inference 已有框架 TensorFlow等这样的框架孱弱,Intel的OpenVINO,ARM的ARM NN,NV的TensorRT 为什么复杂,以及问题 设备可能会是多种多样的,如Intel CPU / Intel GPU / ARM CPU / ARM GPU / NV GPU / FPGA / AI芯片 各大设备厂商的框架并不具备通用性,比如对训练框架模型产生的算子支持不全 在一个设备厂商的Inference框架能跑,但是不一定在另外一个设备厂商的Inference框架上能跑 如果换了硬件,没有统一的使用体验,算子支持也不一样,性能还不一定是最好的 历史类似问题 曾经出现了很多种编程语言,有很多种硬件,历史上最开始也是一种语言对应一种硬件,从而造成编译器的维护困难与爆炸 解决方案: 抽象出编译器前端,编译器中端,编译器后端等概念,引入IR