llvm中如何利用分支概率和基本塊頻率估計

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. 參考文獻:

【1】. Hashemi, A., Kaeli, D., Calder, B.: Procedure mapping using static call graph estimation. In: Workshop on Interaction between Compiler and Computer Architecture, San Antonio, TX (1997) 
【2】. Youfeng Wu, James R. Larus: Static branch frequency and program profile analysis. MICRO 1994: 1-11


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章