精华内容
下载资源
问答
  • 探索 Rust 编译器PGO来自 Rust 官方 blog,在过去的几个月中,Mozilla 一直在使用 Profile-Guided Optimization(PGO)来构建自己的...

    探索 Rust 编译器的 PGO

    来自 Rust 官方 blog,在过去的几个月中,Mozilla 一直在使用 Profile-Guided Optimization(PGO)来构建自己的优化版本的Clang,从而使 Firefox 的构建基础结构的编译时间减少了9%。Rust 编译器是否可以做到这一点,就是说,我们可以将配置文件引导的优化应用于 rustc 本身以使其更快吗?这篇文章恰好探讨了这个问题,更多详情请看:https://blog.rust-lang.org/inside-rust/2020/11/11/exploring-pgo-for-the-rust-compiler.html

    新加坡shopee garena母公司sea group招聘开发

    这边是 shopee 和 garena 的集团总部Sea infrastructure 中间件团队,现在招中间件研发。目前在用 Rust 和 Golang 做分布式 Redis 并落地到kubernetes。也准备在kubernetes上做kafka和pulsar服务。

    jd:

    • 对底层技术有浓厚兴趣

    • 熟悉多线程编程

    • 熟悉 Linux 系统原理和系统编程

    • 了解过分布式系统

    • 有 Rust,Golang,C,C++,Java的研发经验

    • 全日制本科或以上

    薪酬一般比国内高,税远少于国内,无996。入职提供约 7500rmb 的换城市补贴。工作环境跟国内一线大厂一样。对英语只有读写要求,但能正常交流更好。

    有兴趣的发英文简历到: huanggx@seagroup.com

    通过用 Rust 编写大量的Brainfuck编译器来学习汇编

    你是否想成为 CPU Whisperer?从逻辑上讲,Brainfuck 是最著名的深奥编程语言。它之所以成名,主要是因为它的名称中带有“ fuck”一词,但爱好者编译器开发人员喜欢它,因为它是一种很小的语言,可以很容易地为其编写编译器。有趣的事实是:人们编写的 Brainfuck 编译器比实际的 Brainfuck 程序更多。详情请看博客原文:https://github.com/pretzelhammer/rust-blog/blob/master/posts/too-many-brainfuck-compilers.md

    reacty_yew

    作者一直是 React 和它的 JSX 语法的忠实拥护者。同时倾向于使用旨在提供类似语法的 Rust 前端框架,并且当 Yew 成为可行的选择时,作者试图将两者结合起来,通过 Typescript 类型定义从 React 组件生成 Yew 组件。更多请看原文:https://www.hobofan.com/blog/2020-11-10-reacty_yew/


    From 日报小组 @Jancd @Downtime

    社区学习交流平台订阅:

    • Rust.cc论坛: 支持rss

    • 微信公众号:Rust语言学习交流

    展开全文
  • 参考手册: ... 说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也
    参考手册:

    http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/index.htm


    说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也可能有一些变化之处,具体参考官方文档。


    更多说明请参考http://blog.csdn.net/gengshenghong/article/details/7034748中补充说明部分。


    Summary:前面介绍了编译器和PGO相关的工具,这里介绍的工具不一定是PGO相关的工具。


    (1) 编译器选项映射工具

    对于编译器,有很多选项,对于那些熟悉于某一平台(比如win)的选项,但是对其它平台(比如Lin)的同功能的选项不太熟悉的时候,如果需要转换平台,比较头疼的就是去寻找相同功能的选项。编译器选项映射工具提供了这一功能来帮助用户找到另一平台的同功能选项。

    PS:不支持Mac OS。

    1. 使用方式:

    有两种方式使用这一功能,第一是使用编译器的选项/Qmap-opts;第二是直接运行map_opts工具。

    2. 使用编译器选项

    语法:<compiler command> <map-opts option> <compiler option(s)>

    举例:icl /Qmap-opts /Od /FA /Qipo

    Intel(R) Compiler option mapping tool
    
    mapping Windows options to Linux for C++
    
    '-Qmap-opts' Windows option maps to
      --> '-map-opts' option on Linux
      --> '-map_opts' option on Linux
    
    '-Od' Windows option maps to
      --> '-O0' option on Linux
    
    '-FA' Windows option maps to
      --> no equivalent Linux option found
    
    '-Qipo' Windows option maps to
      --> '-ipo' option on Linux

    3. 使用map_opts

    语法:map_opts [-nologo] -t<target OS> -l<language> -opts <compiler option(s)>

    其中,<target OS> = {l|linux|w|windows}、<language> = {f|fortran|c},都是可选的。

    举例:map_opts -opts /Od /FA /Qipo

    Intel(R) Compiler option mapping tool
    
    mapping Windows options to Linux for C++
    
    '-Od' Windows option maps to
      --> '-O0' option on Linux
    
    '-FA' Windows option maps to
      --> no equivalent Linux option found
    
    '-Qipo' Windows option maps to
      --> '-ipo' option on Linux


    (2) 无

    展开全文
  • 使用Intel编译器(5)PGO(1)PGO了解和使用

    千次阅读 2011-12-06 13:50:46
    参考手册: ... 说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也
    参考手册:

    http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/index.htm


    说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也可能有一些变化之处,具体参考官方文档。


    更多说明请参考http://blog.csdn.net/gengshenghong/article/details/7034748中补充说明部分。


    (1) 了解PGO的功能

    PGO是Intel编译器的又一优化技术,PGO与其它的一些优化技术/选项有一个明显的区别是:PGO优化是分三步完成的,是一个动态的优化过程。

    PGO,即Profile-Guided Optimizations,档案导引优化。

    说明:这里说的分三步是不考虑编译算一步,链接算一步这样划分的,前面的一些优化方法都是通过增加一些选项,然后编译链接就完成了,而PGO是需要两次编译链接和一次运行才是完整的,下面会详细分析。

    PGO主要通过降低指令快取置换 (cache-thrashing)、重组代码布局、缩减代码长度并减少分支预测失误来提高应用程序性能。


    (2) IPO没有解决的问题

    IPO是对程序进行静态拓扑分析,静态分析留下有一些问题是无法解决的,比如下面的例子:

    if (x > y) 
    	do_this();
     else
    	do that();	for(i=0; i<count; ++I
    do_work();
    for(i=0; i<count; ++I
    do_work();
    问题一:x大于y的频率有多高?

    问题二:count的大小是多少?

    简单理解,就是在静态情况下,编译器是无法获取这些信息的。GPO就是利用运行时反馈的信息来对这些问题进行预测判断,从而提高程序性能。举例而言,对于IPO中内联的优化,程序如何知道哪些模块该内联,哪些模块不应该内联(内联会增加代码大小,并不是内联都能优化,其中有一个平衡点),而GPO则能通过程序执行时的反馈信息更加有效的判断是否应该内联。总体来说,使用PGO能辅助很多其他优化更好的进行,比如更精准的分支预测,提高指令cache的效率,更好的决定函数是否内联(IPO),更好的向量化决策(auto-vec),switch语句的优化等等。


    (3) PGO的使用和优化流程

    1. PGO的编译过程和使用

    A、利用/Qprof-gen选项生成一个辅助的(Instrumented)可执行文件

    B、执行该可执行文件(会产生动态信息文件Dynamic Information Files,后缀为.dyn)

    C、利用/Qprof-use选项再次编译源文件生成最终的PGO优化的可执行文件(会先创建和合并dyn文件成为一个pgopti.dpi文件,然后利用这个dpi文件进行编译优化)


    2. PGO优化流程

    来自于:http://www.evget.com/zh-CN/product/910/feature.aspx

    “档案导引优化”(PGO) 编译过程使“英特尔 C++ 编译器”可以更好地利用处理器微体系结构,更有效地使用指令调度与高速缓存,并可以更好地执行分支预测。通过重新组织代码布局以减少指令缓存反覆、缩减代码长度并减少分支预测失误,它可以帮助提高应用程序性能。
    如下图(PGO的过程)所示,PGO 过程分为三个阶段。这些步骤包括:1) 应用程序编译阶段,此时进行指令插入;2) 档案生成阶段,此时执行并监视应用程序;3) 重新编译阶段,此时使用第一次运行期间采集的数据帮助进行优化。下面介绍多个影响档案导引优化的代码长度:
    •基本指令块与函数排序 - 将经常执行的指令块与函数放在一起,以充分利用指令缓存的区域性。
    •辅助内嵌决策 - 内嵌经常执行的函数,这样虽然会增加代码长度,但在对性能影响最大的地方却可以得到很好的补偿。
    •辅助矢量化决策 - 对遍历计数高且经常执行的循环进行矢量化处理,这样虽然会增加代码长度,但性能的提高却可以减轻其负面影响。



    (4) IPO和PGO的关系

    在IPO部分和上面的部分,都多次提及IPO和PGO以及其他选项之间会相互影响。这里单独强调一下,IPO和PGO之间会相互影响,所以同时使用IPO和PGO是个不错的选择,能得到更好的性能。IPO是静态的分析,PGO是动态的分析,两者结合。而且,IPO和PGO与其它一些选项还有一个不同在于,一般的选项都是要么主要优化速度,要么主要优化的是代码大小(或者说,一般的选项对于代码的速度和大小的影响是可以预测的吧),但是IPO和PGO对于不同的程序可能会得到不同的优化方面,或者说优化的程度不一样,总之,依赖于程序的特点,了解这一点就可以了。


    (5) 举例:

    icl /Qprof-gen test.cpp
    test.exe
    icl /Qprof-use test.cpp

    展开全文
  • 参考手册: ... 说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也
    参考手册:

    http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/index.htm


    说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也可能有一些变化之处,具体参考官方文档。


    更多说明请参考http://blog.csdn.net/gengshenghong/article/details/7034748中补充说明部分。


    Summary:前面是代码覆盖工具,这里介绍的是两个辅助性的小工具,profmerge和proforder,它们主要是辅助其他工具使用(前面的代码覆盖已经提到了profmerge工具)。

    (1) 回顾PGO相关选项和文件输出

    先再次回顾一下PGO的选项和相关的输出文件:

    1. PGO三步曲:

    使用/Qprof-gen选项编译:其输出为辅助性可执行文件,在可执行文件中插入了相关的代码。

    运行辅助可执行程序:运行过程中,产生dyn动态信息文件(dynamic profile information),每次运行,都可能产生一些dyn文件,dyn文件可以有多个。

    使用/Qprof-use选项编译:编译得到优化后的可执行文件。其编译前编译器会首先将所有dyn文件合并为一个dpi文件。说明:这里要介绍的profmerge也可以完成将多个dyn合并为一个dpi文件,且使用起来更灵活,不需要使用/Qprof-use编译就可以进行合并。

    2. /Qprof-gen:srcpos:

    前面的代码覆盖工具使用的就是这个选项,当然这个选项后面的工具还会用到。使用这个选项取代PGO优化中的第一步的选项,那么除了得到辅助可执行文件,还会生成两个文件:PGOPTI.SPI,PGOPTI.SPL,其中SPI表示static profile information,和dpi对应,保存静态信息。注意:这两个文件只有在使用/Qprof-gen:srcpos的时候才会产生,前面的代码覆盖工具codecov使用了spi和dpi文件,后面的工具也会用到。


    总结:这里简单回顾了PGO选项相关的输出:spi、dpi、dyn、辅助可执行文件等。


    (2) profmerge合并工具

    1. 功能

    profmerge工具用于将多个dyn文件合并到一个dpi文件,编译器在反馈编译阶段(即使用/Qprof-use)会自动先使用profmerge进行合并。其可以将当前目录或者指定目录下的所有dyn文件合并到一个dpi文件。

    说明:由于profmerge会合并所有的dyn文件到dpi文件,所以使用的时候,记得要删除目录下无关的dyn文件,一个例子是:在代码覆盖的时候,如果已经运行过辅助可执行文件,进行过代码覆盖测试,如果还是继续在当前目录下运行辅助可执行文件,然后进行代码覆盖测试,一定要先将之前生成的dyn文件都删除,否则得到的结果不正确。


    2. 选项:

    profmerge的功能很简单,所以其选项也很容易理解了,都是一些基本的选项。

    -help:显示帮助信息

    -nologo:运行时不显示版本信息。

    -dump:显示dump信息,使用此选项后,profmerge合并的同时会输出一些相关信息,这些信息就是dyn(dpi)文件中保存的信息。


    -prof_dir dir:设置要合并的dyn文件所在目录和生成的dpi文件的所在目录。

    -prof_dpi file:设置生成的dpi文件的文件名,如:profmerge -prof-dpi test.dpi

    -prof_file file:?????????????


    (3) proforder工具

    1. 功能:

    proforder工具也是在PGO编译的反馈编译阶段(/Qprof-use)被使用的,用于提高性能。proforder工具用于生成/ORDER链接选项需要的一个函数列表。关于/ORDER选项,参考MSDN文档:http://msdn.microsoft.com/zh-cn/library/00kh39zz(v=VS.80).aspx。简单理解,/ORDER指定一个文件,表示要链接的obj文件的函数的顺序列表。很显然,同样的函数,同样的代码,不同的链接顺序得到的性能也会不一样(比如指令cache的对齐等问题)。


    2. 使用:

    proforder需要指定spi和dpi文件,要得到spi文件,需要使用/Qprof-gen:srcpos选项编译,dpi就可以利用profmerge得到了。其输出为一个proford.txt(默认)的文本文件,内容为函数列表。

    说明:proforder需要使用到spi和dpi文件,输出是一个txt文件。从PGO的三步编译来看,并没有生成SPI文件和txt文件,那么是不是说PGO编译过程中没有使用proforder呢?相信PGO一定会用到/ORDER链接来控制函数列表的链接顺序,之所以没有看到有spi和txt文件,可能是作为临时文件删除了,或者直接在内存中完成了相关的内容。当然,这并不是一个大问题。问题是proforder单独使用好像意义并不大,当然,或许对于将编译和链接分开进行的时候,可能有用吧。


    3. 选项:

    -help:显示帮助信息

    -nologo:不显示版本信息


    下面是一个简单的例子来理解部分的选项:

    // File: profmerge_proforder.cpp
    #include <stdio.h>
    
    void foo()
    {
    	printf("foo\n");
    }
    
    static void bar()
    {
    	printf("bar\n");
    }
    
    void foobar()
    {
    	printf("foobar\n");
    }
    
    int main()
    {
    	foo();
    	bar();
    	foobar();
    	
    	return 0;
    }

    @echo OFF
    rem #File: clear_build.bat
    rem #set proforderopts=-nologo ...	rem #can set env vars in command line or in this file before run this bat file.
    
    rem #clear
    if exist *.obj del *.obj
    if exist *.exe del *.exe
    if exist *.dyn del *.dyn
    if exist *.lock del *.lock
    if exist *.dpi del *.dpi
    if exist *.spi del *.spi
    if exist *.spl del *.spl
    
    rem #compile
    icl profmerge_proforder.cpp /Qprof-gen:srcpos
    
    rem #run
    profmerge_proforder
    
    rem #profmerge
    profmerge
    
    rem #cls
    cls
    
    rem #proforder
    proforder %proforderopts%
    (运行上面的bat之前使用“set proforderopts=”设置proforder的选项即可)

    下面是不使用其它选项的时候输出的proford.txt文件的内容:

    main
    ?foo@@YAXXZ
    printf
    ?bar@@YAXXZ # STATIC: 'C:\TEMPLAB\PGO\PROFMERGE&PROFORDER\PROFMERGE_PROFORDER.CPP'
    ?foobar@@YAXXZ


    -omit_static选项:函数顺序中忽略静态函数(不显示静态函数)。从上面的txt中看到bar函数的现实后面有STATIC的信息,使用下面的命令运行:

    set proforderopts=-nologo -omit_static

    clear_build.bat

    后,得到的proford.txt的内容如下:

    main
    ?foo@@YAXXZ
    printf
    ?foobar@@YAXXZ
    
    很容易看到,没有显示static函数。


    指定输入输出的选项:

    -prof_dir dir:指定查找输入的spi和dpi文件所在的目录,默认为当前目录。
    -prof_dpi file:指定输入的dpi文件的文件名,默认为pgopti.dpi.
    -prof_file string:这个选项表示,spi文件为string.spi,dpi文件为string.dpi(string替换为指定的任意字符串)。测试发现,使用了这个选项后,-o选项等选项没有效果,输出文件为string.ipo(是ipo后缀...),当然,其内容还是一个文本文件。说明:使用这个选项,那么spi和dpi文件的文件名就是一样的了,只能是string.dpi和string.spi,输出也只能是string.ipo了。
    -prof_spi file:指定输入的spi文件的文件名,默认为pgopti.spi.
    -o file:指定输出的txt文件的文件名,默认为proford.txt.

    这就是proforder的所有选项了,可见proforder使用还是很容易的。


    展开全文
  • 参考手册: ... 说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也
  • 参考手册: ... 说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也
  • 参考手册: ... 说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也
  • 参考手册: ... 说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也
  • (1) Profile Function or Loop ...之所以把这一功能和PGO优化放在一个部分,是因为它们有一些相同之处:都是通过编译器在编译时给生成的可执行文件中插入辅助代码(测试代码,instrumentation code),对于PGO
  • 在JVM 中有三个非常重要的编译器,它们分别是:前端编译器、JIT 编译器和AOT编译器。 前端编译器 将源代码转化成字节码,如javac;我们一般称 javac 编译器为前端编译器,因为其发生在整个编译的前期。javac编译...
  • PGo编译器将规范编译为程序的源代码。 目的/动机 是用于指定/建模并发系统的语言。 它旨在编写。 特别是,PlusCal可以编译为TLA +,可以根据有用的系统属性(使用TLC模型检查器)进行检查。 例如,是有关互斥问题...
  • 标准C语言编译器

    千次阅读 2018-09-03 13:45:51
    CC 转自CC和GCC编译器  从名字上看,老的unix系统的CC程式叫做C Compiler。但GCC这个名字按GNU的说法叫做Gnu ...所以他们是不相同的,一个是个古老的C编译器,一个是编译器的Gnu的编译器的集合(Gcc里的C编译器...
  • 我更倾向于周志明对编译器的"分类"的看法,编译过程中有三类比较有有代表性的编译器: 前端编译器:Sun的javac,Eclipse的增量编译器EJC。把*.java编译为*.class JIT编译器:Hotsport VM的c1,c2编译器把字节码编译为...
  • JVM基本概念

    2017-01-10 19:26:42
    编译相关 英文缩写 英文全称 ... PGO Profile-Guided Optimization 通俗的说就是基于动态信息的激进优化 Java调试相关IBM Developerworks 介绍调试相关的好文章 英文缩写 英文全称 中文 JDWA
  • 使用Intel编译器系列合集

    千次阅读 2011-12-02 13:43:33
    参考手册: ... 说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也
  • pgo 插件Posted by Pirama Arumuga Nainar, Software Engineer 作者:软件工程师Pirama Arumuga Nainar Profile-guided optimization (PGO) is a well known compiler optimization technique. In PGO, runtime ...
  • 2013年夏天,Facebook工程师开始对HHVM JIT...Facebook工程师Guilherme Ottoni最近描述了Facebook如何在JIT编译器中利用性能分析引导优化(PGO)技术达到这一效果。 性能分析引导优化技术主要采用运行时分析,例...
  • 因此,编译器尝试自动优化代码以提高其性能,当今的编译器都深谙其道。编译器可以转化循环、条件语句和递归函数、消除整块代码和利用目标指令集的优势让代码变得高效而简洁。所以对程序员来说,写
  • Facebook工程师Guilherme Ottoni最近描述了Facebook如何在JIT编译器中利用性能分析引导优化(PGO)技术达到这一效果。\u0026#xD;\u0026#xD;性能分析引导优化技术主要采用运行时分析,例如,识...
  • PGO 即 Profile-guided optimization(归档引导优化),是一种自适应优化手段,不需要对软件代码本身做出改进,即可获得性能的提升,目前已经应用于 GCC、VC++ 等常见的编译器中。一些开源项目像 Firefox 就默认使用...
  • Intel c++编译器有下列优点,建议VC++项目开发采用intel c++编译器取代VS自带c++编译器: 与 Microsoft Visual C++ 相兼容,可以嵌入 Microsoft Visual Studio 开发环境。 支持最新的多核处理器,并提供安全功能,...
  • Profile-guided optimization (PGO),配置文件引导的优化,基于插桩或采样从程序运行时生成配置文件,使编译器对内联和代码布局做优化,可以获得免费的性能提升。在安卓中使用的教程较少,实际操作时会遇到一些问题...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 431
精华内容 172
关键字:

编译器pgo