2010-07-09

llscheme - 2 - profiling

本文谈谈怎样对llscheme生成出来的代码进行性能剖析。假设有个示例程序fib.scm,它会算出第一千个斐波那契数。我想到两种方法:
  1. 利用传统的gprof工具链
    • CFLAGS='-lpg' ./autogen.sh --prefix=/usr (保证运行时库是以'-lpg'编译的)
    • sudo make install
    • llscheme -S -o fib.ll <>
    • llc fib.ll (得到 fib.s 本地CPU汇编代码)
    • gcc -pg fib.s -o fib -llsrt -lgc -lgmp
      这样运行./fib确实会得到gmon.out,但接下来跑 gprof 却得不到任何剖析数据。具体原因有待分析。
  2. 利用LLVM自己的profiler - llvm-prof,它需要一个LLVM bitcode文件作为输入。为此,我们得先把llscheme的运行时库打包成LLVM字节码,而不是用autotools那一套生成出来的共享库liblsrt.so。
    • cd llscheme/src/runtime
    • clang -emit-llvm -c *.c -I./include -I../include
    • llvm-ar rcs liblsrt.bca *.o
    • llvm-as fib.ll
    • llvm-ld fib.bc liblsrt.bca -lgmp -lgc -o fib (这一步会生成可执行文件fib,以及对应的字节码文件fib.bc - 会把老的覆盖掉)
    • perl profile.pl fib.bc -load /usr/lib/libgmp.so -load /usr/lib/libgc.so 这样就能输出详细的剖析数据。
profile.pl 来自 LLVM 的 subversion 仓库,不过这个脚本有点问题。我有一个小补丁:
--- profile.pl.old 2007-09-12 01:09:54.000000000 +0800
+++ profile.pl 2010-07-07 13:13:55.282462603 +0800
@@ -65,10 +65,10 @@
my $libdir = `llvm-config --libdir`;
chomp $libdir;

-my $LibProfPath = $libdir . "/profile_rt.so";
+my $LibProfPath = $libdir . "/libprofile_rt.so";

system "opt -q -f $ProfilePass $BytecodeFile -o $BytecodeFile.inst";
system "lli -fake-argv0 '$BytecodeFile' -load $LibProfPath " .
- "$BytecodeFile.inst $ProgramOpts " . (join ' ', @ARGV);
+ (join ' ', @ARGV) . " $BytecodeFile.inst $ProgramOpts";
system "rm $BytecodeFile.inst";
system "llvm-prof $LLVMProfOpts $BytecodeFile $ProfileFile";

标签: ,

0 Comments:

发表评论

<< Home