Merge branch 'master' of git://git.ffmpeg.org/ffmpeg into lags-rac
[FFMpeg-mirror/lagarith.git] / doc / ffmpeg_powerpc_performance_evaluation_howto.txt
blob2eb4ee71a52eea525e87a9b33fea6536917e8d79
1 FFmpeg & evaluating performance on the PowerPC Architecture HOWTO
3 (c) 2003-2004 Romain Dolbeau <romain@dolbeau.org>
7 I - Introduction
9 The PowerPC architecture and its SIMD extension AltiVec offer some
10 interesting tools to evaluate performance and improve the code.
11 This document tries to explain how to use those tools with FFmpeg.
13 The architecture itself offers two ways to evaluate the performance of
14 a given piece of code:
16 1) The Time Base Registers (TBL)
17 2) The Performance Monitor Counter Registers (PMC)
19 The first ones are always available, always active, but they're not very
20 accurate: the registers increment by one every four *bus* cycles. On
21 my 667 Mhz tiBook (ppc7450), this means once every twenty *processor*
22 cycles. So we won't use that.
24 The PMC are much more useful: not only can they report cycle-accurate
25 timing, but they can also be used to monitor many other parameters,
26 such as the number of AltiVec stalls for every kind of instruction,
27 or instruction cache misses. The downside is that not all processors
28 support the PMC (all G3, all G4 and the 970 do support them), and
29 they're inactive by default - you need to activate them with a
30 dedicated tool. Also, the number of available PMC depends on the
31 procesor: the various 604 have 2, the various 75x (aka. G3) have 4,
32 and the various 74xx (aka G4) have 6.
34 *WARNING*: The PowerPC 970 is not very well documented, and its PMC
35 registers are 64 bits wide. To properly notify the code, you *must*
36 tune for the 970 (using --tune=970), or the code will assume 32 bit
37 registers.
40 II - Enabling FFmpeg PowerPC performance support
42 This needs to be done by hand. First, you need to configure FFmpeg as
43 usual, but add the "--powerpc-perf-enable" option. For instance:
45 #####
46 ./configure --prefix=/usr/local/ffmpeg-svn --cc=gcc-3.3 --tune=7450 --powerpc-perf-enable
47 #####
49 This will configure FFmpeg to install inside /usr/local/ffmpeg-svn,
50 compiling with gcc-3.3 (you should try to use this one or a newer
51 gcc), and tuning for the PowerPC 7450 (i.e. the newer G4; as a rule of
52 thumb, those at 550Mhz and more). It will also enable the PMC.
54 You may also edit the file "config.h" to enable the following line:
56 #####
57 // #define ALTIVEC_USE_REFERENCE_C_CODE 1
58 #####
60 If you enable this line, then the code will not make use of AltiVec,
61 but will use the reference C code instead. This is useful to compare
62 performance between two versions of the code.
64 Also, the number of enabled PMC is defined in "libavcodec/ppc/dsputil_ppc.h":
66 #####
67 #define POWERPC_NUM_PMC_ENABLED 4
68 #####
70 If you have a G4 CPU, you can enable all 6 PMC. DO NOT enable more
71 PMC than available on your CPU!
73 Then, simply compile FFmpeg as usual (make && make install).
77 III - Using FFmpeg PowerPC performance support
79 This FFmeg can be used exactly as usual. But before exiting, FFmpeg
80 will dump a per-function report that looks like this:
82 #####
83 PowerPC performance report
84  Values are from the PMC registers, and represent whatever the
85  registers are set to record.
86  Function "gmc1_altivec" (pmc1):
87         min: 231
88         max: 1339867
89         avg: 558.25 (255302)
90  Function "gmc1_altivec" (pmc2):
91         min: 93
92         max: 2164
93         avg: 267.31 (255302)
94  Function "gmc1_altivec" (pmc3):
95         min: 72
96         max: 1987
97         avg: 276.20 (255302)
98 (...)
99 #####
101 In this example, PMC1 was set to record CPU cycles, PMC2 was set to
102 record AltiVec Permute Stall Cycles, and PMC3 was set to record AltiVec
103 Issue Stalls.
105 The function "gmc1_altivec" was monitored 255302 times, and the
106 minimum execution time was 231 processor cycles. The max and average
107 aren't much use, as it's very likely the OS interrupted execution for
108 reasons of its own :-(
110 With the exact same settings and source file, but using the reference C
111 code we get:
113 #####
114 PowerPC performance report
115  Values are from the PMC registers, and represent whatever the
116  registers are set to record.
117  Function "gmc1_altivec" (pmc1):
118         min: 592
119         max: 2532235
120         avg: 962.88 (255302)
121  Function "gmc1_altivec" (pmc2):
122         min: 0
123         max: 33
124         avg: 0.00 (255302)
125  Function "gmc1_altivec" (pmc3):
126         min: 0
127         max: 350
128         avg: 0.03 (255302)
129 (...)
130 #####
132 592 cycles, so the fastest AltiVec execution is about 2.5x faster than
133 the fastest C execution in this example. It's not perfect but it's not
134 bad (well I wrote this function so I can't say otherwise :-).
136 Once you have that kind of report, you can try to improve things by
137 finding what goes wrong and fixing it; in the example above, one
138 should try to diminish the number of AltiVec stalls, as this *may*
139 improve performance.
143 IV) Enabling the PMC in Mac OS X
145 This is easy. Use "Monster" and "monster". Those tools come from
146 Apple's CHUD package, and can be found hidden in the developer web
147 site & FTP site. "MONster" is the graphical application, use it to
148 generate a config file specifying what each register should
149 monitor. Then use the command-line application "monster" to use that
150 config file, and enjoy the results.
152 Note that "MONster" can be used for many other things, but it's
153 documented by Apple, it's not my subject.
155 If you are using CHUD 4.4.2 or later, you'll notice that MONster is
156 no longer available. It's been superseeded by Shark, where
157 configuration of PMCs is available as a plugin.
161 V) Enabling the PMC on Linux
163 On linux you may use oprofile from http://oprofile.sf.net, depending on the
164 version and the cpu you may need to apply a patch[1] to access a set of the
165 possibile counters from the userspace application. You can always define them
166 using the kernel interface /dev/oprofile/* .
168 [1] http://dev.gentoo.org/~lu_zero/development/oprofile-g4-20060423.patch
171 Romain Dolbeau <romain@dolbeau.org>
172 Luca Barbato <lu_zero@gentoo.org>