首页 > 其他分享 >propeller实操

propeller实操

时间:2023-04-16 23:56:27浏览次数:33  
标签:llvm perf -- create clang 实操 propeller txt

  1. 首先建立a.c, 为待优化的bin。
//a.c
int fun(int x) {
  if(x>5) return x+1;
  else return x-1;
}

int main() {
  int ans = 0;
  for(int i=0; i<100000000; i++) ans += fun(i);
  return ans;
}
  1. 利用clang生成带bb块映射信息的object和exe
    注意这里clang要使用lld作为
clang a.c -c -fbasic-block-sections=labels -funique-internal-linkage-names  -o a.o
clang a.o -o a_with_bbam

其中funique-internal-linkage-names参数可以提升profile的精度,有助于优化效果。

  1. 使用perf采集程序运行时数据
    注意perf的硬件事件需要运行在实体机上,虚拟机或云主机有问题。
sudo perf record -e cycles:u -j any,u -- ./a_with_bbam
sudo chown wf:wf perf.data

便会生成一个采集lbr硬件提供的分支跳转信息的perf.data文件。

  1. 使用create_llvm_prof转化profile
    create_llvm_prof是autofdo中提供的一个工具,将perf.data的工具转化为clang/lld能识别的优化输入数据。autofdo前期为gcc也做了一个类似的转化工具。

构建create_llvm_prof遇到的一些问题。

  1. llvm-project最好用最新的分支
  2. autofdo的llvm_propeller_profile_writer.cc和perf_data_reader.cc中需要添加"llvm/ADT/Optional.h"头文件
  3. llvm_profile_reader.cc中接口llvm::sampleprof::SampleProfileReader::create()在最新版本的llvm中多了一个文件系统参数,第28行可修改为如下,传入的是实际的文件系统。
 auto reader_or_err = llvm::sampleprof::SampleProfileReader::create(
       filename, C, *llvm::vfs::getRealFileSystem(), discriminator_pass);
/path/to/autofdo/build/create_llvm_prof --format=propeller --binary=a_with_bbam \
--profile=perf.data --out=cluster.txt --propeller_symorder=symorder.txt --profiled_binary_name=./a_with_bbam
  1. 最后一步利用得到的反馈式数据,优化链接编译链接过程
    使用上面生成的cluter.txt和symorder.txt进行优化。
clang -funique-internal-linkage-names -fbasic-block-sections=list=./cluster.txt -c a.c
clang -Wl,--symbol-ordering-file=./symorder.txt -Wl,--no-warn-symbol-ordering -fuse-ld=lld a.o -o a_opt

这里展示列出这个简单问题的cluster.txt和symorder.txt的结果,cluster.txt中的结果

!fun
!!0 1 3
!main
!!0 1 2 3

symorder.txt

fun
main
fun.cold
main.cold

标签:llvm,perf,--,create,clang,实操,propeller,txt
From: https://www.cnblogs.com/zwlwf/p/17324492.html

相关文章

  • 第 14 章Linux 实操篇-进程管理(重点)
    第14章Linux实操篇-进程管理(重点)目录第14章Linux实操篇-进程管理(重点)14.1基本介绍14.2显示系统执行的进程14.2.1基本介绍14.2.2ps详解14.2.3应用实例14.1终止进程kill和killall14.3.1介绍:14.3.2基本语法14.3.3常用选项14.3.4最佳实践14.5服务(service)......
  • 第 12 章Linux 实操篇-网络配置
    第12章Linux实操篇-网络配置目录第12章Linux实操篇-网络配置13.1Linux网络配置原理图13.1.1画出原理图,帮助理解13.2查看网络IP和网关13.2.1查看虚拟网络编辑器和修改IP地址13.2.2查看网关13.3查看windows环境的中VMnet8网络配置(ipconfig指令)13.4查看lin......
  • 图数据库驱动的基础设施运维实操
    本文系图技术在大型、复杂基础设施之中SRE/DevOps的实践参考,并以OpenStack系统之上的图数据库增强的运维案例为例,揭示图数据库、图算法在智能运维上的应用。本文所有示例代码开源。最近,有些尚未使用过图技术、DevOps/Infra领域的工程师在NebulaGraph社区询问是否有「图......
  • 图数据库驱动的基础设施运维实操
    本文系图技术在大型、复杂基础设施之中SRE/DevOps的实践参考,并以OpenStack系统之上的图数据库增强的运维案例为例,揭示图数据库、图算法在智能运维上的应用。本文所有示例代码开源。最近,有些尚未使用过图技术、DevOps/Infra领域的工程师在NebulaGraph社区询问是否有「图......
  • .NET Core MongoDB数据仓储和工作单元模式实操
    前言MongoDB从入门到实战的相关教程YyFlight.ToDoList项目源码地址MongoDB事务使用前提说明创建EntityBase公共类添加UserInfo用户表实体映射模型创建用户Repository创建用户管理业务代码UserOperationExample控制创建注册数据库基础操作和工作单元注册相关应用服务......
  • 第 11 章Linux 实操篇-定时任务调度
    第11章Linux实操篇-定时任务调度11.1crond任务调度crontab进行定时任务的设置11.1.1概述任务调度:是指系统在某个时间执行的特定的命令或程序。任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等个别用户工作:个别用户可能希望执行某些程序,比......
  • 第 9 章 Linux 实操篇-实用指令
    第9章Linux实操篇-实用指令目录第9章Linux实操篇-实用指令9.1指定运行级别9.1.1基本介绍9.1.2应用实例9.1.3CentOS7后运行级别说明9.2帮助指令9.2.1man获得帮助信息9.2.2help指令9.2.3应用实例9.3文件目录类9.3.1pwd指令9.3.2ls指令9.3.3cd指令9.3.4m......
  • 第 7 -8章 Linux 实操篇-开机、重启和用户登录注销-8.用户管理
    第7-8章Linux实操篇-开机、重启和用户登录注销-8.用户管理目录第7-8章Linux实操篇-开机、重启和用户登录注销-8.用户管理7.1关机&重启命令7.1.1基本介绍7.1.2注意细节7.2用户登录和注销7.2.1基本介绍7.2.2使用细节第8章Linux实操篇-用户管理8.1基本介绍8.2添......
  • 第 6 章 Linux 实操篇- Vi 和 Vim 编辑器
    第6章Linux实操篇-Vi和Vim编辑器6.1vi和vim的基本介绍Linux系统会内置vi文本编辑器Vim具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使......
  • NGINX的stream模块以及实操问题
    NGINX的stream模块以及实操问题前言:nginx从1.9.0开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等。nginx作为一个优秀的web服务器软件,毫无疑问,功能是十分强大的,但学习这种软件,如果脱离了实际操作(应用场景落地),那么就是一种耍流氓的行为。(1)关于stream域的模块......