> 我们目前实现的是BB的Profiling,即一个基本块的执行次数是否到达一定阈值,如果达到了,就是热点,然后启动动态编译模块去对热点的BB进行翻译。 > > 其实我们也实现了trace的profiling ,但是效果不太好,目前发现和BB > Profiling效果差不多。主要是trace的profiling本身有些复杂,也要占用运行时间。还需要进一步研究。 trace profiling 你們是怎麼做的? trace profiling 最大的用處是這樣, --------------- | Load CPUState | BB1 | | | | | Save CPUState | --------------- | v --------------- | Load CPUState | BB2 | | | | | Save CPUState | --------------- 假設 BB1 -> BB2 構成一條 trace,那你就可以把 BB1 和 BB2 的代碼合在一起, 以 LLVM 來說,就是在一個 LLVM function 裡生成 BB1 和 BB2 的代碼,這樣一來 你可以透過 LLVM 優化手段把 BB1 尾端的 Save CPUState 和 BB2 開頭的 Load CPUState 消除。一般做法是將 CPUState 要讀出的內容存在 LLVM alloca 分配的 內存上,再透過 Promote Memory to Register 這一類的 opt pass 消除冗餘的 load/store。 韋任 -- Wei-Ren Chen (陳韋任) Computer Systems Lab, Institute of Information Science, Academia Sinica, Taiwan (R.O.C.) Tel:886-2-2788-3799 #1667 Homepage: http://people.cs.nctu.edu.tw/~chenwj