llvm中如何利用分支概率和基本块频率估计
来源:互联网 发布:知金教育集团 编辑:程序博客网 时间:2024/05/17 08:20
1. 背景
llvm自2.9版以后,已经集成了对分支概率和基本块频率的静态分析。
分支概率(branch probability)是指在程序的控制流图中,从控制流从一个基本块A到其任意后继基本块Si的概率。控制流从基本块A到其所有后继基本块的概率之和为1. 基本块频率(block frequency)是指在程序的控制流图中,任意基本块的执行次数。这两种信息都可以通过静态分析得到。其原理如下【1】【2】:
An alternative is static profiling, in which a compiler estimates execution frequencies (not absolute counts) with static program analysis. A static profile eliminates the drawbacks of dynamic profiling— if it accurately captures a program’s dynamic behavior. Recent work suggests that static analysis can predict dynamic program behavior. Fisher and Freudenberger [Fisher-92] observed that many programs’ dynamic branching behavior is independent of their input data. Ball and Larus developed a simple algorithm that statically predicts the outcome of a conditional branch with good accuracy [Ball-93]. Wagner et al. usedl simple estimates of branch probabilities to compute static profiles [Wagner-94]. (见文献【2】)
2. llvm3.3中的相关文件
Support/BranchProbability.cpp(.h): 实现一个用来表示分支概率的数据结构
Analysis/BranchProbabilityInfo.cpp(.h): 实现一个在basic block级别进行分支概率估计的FunctionPass
CodeGen/MachineBranchProbabilityInfo.cpp(.h): 实现一个在machine basic block级别进行分支概率估计的ImmutablePass
Support/BlockFrequency.cpp(.h): 实现一个用来表示基本块频率的数据结构
Analysis/BlockFrequencyInfo.cpp(.h): 实现一个在basic block级别进行基本块频率估计的FunctionPass
CodeGen/MachineBlockFrequency.cpp(.h): 实现一个在machine basic block级别进行基本块频率估计的MachineFunctionPass
Analysis/BlockFrequencyImpl.h: 在basic block级别和machine basic block级别共用的基本块频率估计的实现
3. llvm3.3中的相关实现
3.1 分支概率分析
3.1.1 在basic block级别,分支概率分析的实现主要参考文献【2】的方法,利用几个基本启发式来给分支加权。
for (po_iterator<BasicBlock *> I = po_begin(&F.getEntryBlock()), E = po_end(&F.getEntryBlock()); I != E; ++I) { DEBUG(dbgs() << "Computing probabilities for " << I->getName() << "\n"); if (calcUnreachableHeuristics(*I)) continue; if (calcMetadataWeights(*I)) continue; if (calcColdCallHeuristics(*I)) continue; if (calcLoopBranchHeuristics(*I)) continue; if (calcPointerHeuristics(*I)) continue; if (calcZeroHeuristics(*I)) continue; if (calcFloatingPointHeuristics(*I)) continue; calcInvokeHeuristics(*I);}return false;}
3.1.2 在machine basic block级别,分支概率的实现实际上依赖于basic block级别的分支概率分析结果,所以MachineBranchProbabilityInfo并不是一个独立的MachineFunctionPass.
3.2 基本块频率分析
3.2.1 在basic block级别和machine basic block级别共用基本块频率估计的实现
bool BlockFrequencyInfo::runOnFunction(Function &F) { BranchProbabilityInfo &BPI = getAnalysis<BranchProbabilityInfo>(); BFI->doFunction(&F, &BPI); return false;}
bool MachineBlockFrequencyInfo::runOnMachineFunction(MachineFunction &F) { MachineBranchProbabilityInfo &MBPI = getAnalysis<MachineBranchProbabilityInfo>(); MBFI->doFunction(&F, &MBPI); return false;}
3.2.2 上面的代码还可以看出,基本块频率分析依赖于分支概率分析。因此,如果要利用这两种分析结果,只需要在自己的FunctionPass或者MachineFunctionPass里面进行类似如下的修改(建议参考CodeGen/MachineBlockPlacement.cpp):
1)修改getAnalysisUsage函数如下:
void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired<MachineBranchProbabilityInfo>(); AU.addRequired<MachineBlockFrequencyInfo>(); MachineFunctionPass::getAnalysisUsage(AU);}
2)修改runOnMachineFunction函数如下
bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &F) { MBPI = &getAnalysis<MachineBranchProbabilityInfo>(); MBFI = &getAnalysis<MachineBlockFrequencyInfo>(); ... //打印分支概率信息 std::string szInfo; raw_fd_ostream S("machinBranchProbs.txt", szInfo, raw_fd_ostream::F_Append); for (MachineFunction::iterator BI = F.begin(), BE = F.end(); BI != BE; ++BI) { MachineBasicBlock *MBB = BI; for (MachineBasicBlock::const_succ_iterator SI =MBB->succ_begin(), EI = MBB->succ_end(); SI != EI; ++SI) { MachineBasicBlock *mBlock = *SI; MBPI->printEdgeProbability(S << " ", MBB, mBlock); } } S.close(); //打印基本块频率信息 raw_fd_ostream S1("machinBlockFreq.txt", szInfo, raw_fd_ostream::F_Append); if (MBFI) MBFI->print(S1);; S1.close(); ... return false;}
4. 参考文献:
- llvm中如何利用分支概率和基本块频率估计
- LLVM基本块频率术语
- 在LLVM中如何判断二个基本块(Basic Block)的支配关系
- 利用LIBSVM估计概率
- 在LLVM控制流图(CFG)中如何获得某个块(Block)的前继块和后继块
- 如何测呼吸?如何估计呼吸频率?
- 概率估计
- 最大似然估计和最大后验概率估计
- 概率密度函数和似然估计
- 先验概率,似然估计和后验概率
- 瞬时频率估计方法
- 如何在kernel中得到cpu的电压和频率
- 频率和概率以及均值和期望的联系区别
- 最大似然估计和最大后验概率
- 最大似然估计和最大后验概率
- 最大似然估计和最大后验概率
- parzen窗方法和k近邻方法估计概率密度
- 贝叶斯决策理论和概率密度估计方法
- 哥荒废了这么长时间
- Oracl数据库管理方面的资料(查询sga,查看oracle数据库名称sid,查看oracle数据库名称,查看表空间,修改表空间名称,数据库管理,sqlPlus数据显示)
- 《Oracle.11g.从入门到精通》书籍错误
- hdu 4649 Professor Tian
- poj 3984 迷宫问题 bfs
- llvm中如何利用分支概率和基本块频率估计
- cocos2dx 锚点
- 【jiasuba】菜鸟必收藏:Win 8系统最新整理的50个应用技巧
- Beyond Compare(bcompare.exe)报错误“应用程序发生错误”解决方案
- Java实现将ResultSet结果转成json格式
- oracle数据库表空间及归档
- 写一个函数,找出一个整数数组中的第二大数
- B树、B-树、B+树、B*树
- The Big Three Rule