| 
							- FFmpeg & evaluating performance on the PowerPC Architecture HOWTO
 - 
 - (c) 2003-2004 Romain Dolbeau <romain@dolbeau.org>
 - 
 - 
 - 
 - I - Introduction
 - 
 - The PowerPC architecture and its SIMD extension AltiVec offer some
 - interesting tools to evaluate performance and improve the code.
 - This document tries to explain how to use those tools with FFmpeg.
 - 
 - The architecture itself offers two ways to evaluate the performance of
 - a given piece of code:
 - 
 - 1) The Time Base Registers (TBL)
 - 2) The Performance Monitor Counter Registers (PMC)
 - 
 - The first ones are always available, always active, but they're not very
 - accurate: the registers increment by one every four *bus* cycles. On
 - my 667 Mhz tiBook (ppc7450), this means once every twenty *processor*
 - cycles. So we won't use that.
 - 
 - The PMC are much more useful: not only can they report cycle-accurate
 - timing, but they can also be used to monitor many other parameters,
 - such as the number of AltiVec stalls for every kind of instruction,
 - or instruction cache misses. The downside is that not all processors
 - support the PMC (all G3, all G4 and the 970 do support them), and
 - they're inactive by default - you need to activate them with a
 - dedicated tool. Also, the number of available PMC depends on the
 - procesor: the various 604 have 2, the various 75x (aka. G3) have 4,
 - and the various 74xx (aka G4) have 6.
 - 
 - *WARNING*: The PowerPC 970 is not very well documented, and its PMC
 - registers are 64 bits wide. To properly notify the code, you *must*
 - tune for the 970 (using --tune=970), or the code will assume 32 bit
 - registers.
 - 
 - 
 - II - Enabling FFmpeg PowerPC performance support
 - 
 - This needs to be done by hand. First, you need to configure FFmpeg as
 - usual, but add the "--powerpc-perf-enable" option. For instance:
 - 
 - #####
 - ./configure --prefix=/usr/local/ffmpeg-svn --cc=gcc-3.3 --tune=7450 --powerpc-perf-enable
 - #####
 - 
 - This will configure FFmpeg to install inside /usr/local/ffmpeg-svn,
 - compiling with gcc-3.3 (you should try to use this one or a newer
 - gcc), and tuning for the PowerPC 7450 (i.e. the newer G4; as a rule of
 - thumb, those at 550Mhz and more). It will also enable the PMC.
 - 
 - You may also edit the file "config.h" to enable the following line:
 - 
 - #####
 - // #define ALTIVEC_USE_REFERENCE_C_CODE 1
 - #####
 - 
 - If you enable this line, then the code will not make use of AltiVec,
 - but will use the reference C code instead. This is useful to compare
 - performance between two versions of the code.
 - 
 - Also, the number of enabled PMC is defined in "libavcodec/ppc/dsputil_ppc.h":
 - 
 - #####
 - #define POWERPC_NUM_PMC_ENABLED 4
 - #####
 - 
 - If you have a G4 CPU, you can enable all 6 PMC. DO NOT enable more
 - PMC than available on your CPU!
 - 
 - Then, simply compile FFmpeg as usual (make && make install).
 - 
 - 
 - 
 - III - Using FFmpeg PowerPC performance support
 - 
 - This FFmeg can be used exactly as usual. But before exiting, FFmpeg
 - will dump a per-function report that looks like this:
 - 
 - #####
 - PowerPC performance report
 -  Values are from the PMC registers, and represent whatever the
 -  registers are set to record.
 -  Function "gmc1_altivec" (pmc1):
 -         min: 231
 -         max: 1339867
 -         avg: 558.25 (255302)
 -  Function "gmc1_altivec" (pmc2):
 -         min: 93
 -         max: 2164
 -         avg: 267.31 (255302)
 -  Function "gmc1_altivec" (pmc3):
 -         min: 72
 -         max: 1987
 -         avg: 276.20 (255302)
 - (...)
 - #####
 - 
 - In this example, PMC1 was set to record CPU cycles, PMC2 was set to
 - record AltiVec Permute Stall Cycles, and PMC3 was set to record AltiVec
 - Issue Stalls.
 - 
 - The function "gmc1_altivec" was monitored 255302 times, and the
 - minimum execution time was 231 processor cycles. The max and average
 - aren't much use, as it's very likely the OS interrupted execution for
 - reasons of its own :-(
 - 
 - With the exact same settings and source file, but using the reference C
 - code we get:
 - 
 - #####
 - PowerPC performance report
 -  Values are from the PMC registers, and represent whatever the
 -  registers are set to record.
 -  Function "gmc1_altivec" (pmc1):
 -         min: 592
 -         max: 2532235
 -         avg: 962.88 (255302)
 -  Function "gmc1_altivec" (pmc2):
 -         min: 0
 -         max: 33
 -         avg: 0.00 (255302)
 -  Function "gmc1_altivec" (pmc3):
 -         min: 0
 -         max: 350
 -         avg: 0.03 (255302)
 - (...)
 - #####
 - 
 - 592 cycles, so the fastest AltiVec execution is about 2.5x faster than
 - the fastest C execution in this example. It's not perfect but it's not
 - bad (well I wrote this function so I can't say otherwise :-).
 - 
 - Once you have that kind of report, you can try to improve things by
 - finding what goes wrong and fixing it; in the example above, one
 - should try to diminish the number of AltiVec stalls, as this *may*
 - improve performance.
 - 
 - 
 - 
 - IV) Enabling the PMC in Mac OS X
 - 
 - This is easy. Use "Monster" and "monster". Those tools come from
 - Apple's CHUD package, and can be found hidden in the developer web
 - site & FTP site. "MONster" is the graphical application, use it to
 - generate a config file specifying what each register should
 - monitor. Then use the command-line application "monster" to use that
 - config file, and enjoy the results.
 - 
 - Note that "MONster" can be used for many other things, but it's
 - documented by Apple, it's not my subject.
 - 
 - If you are using CHUD 4.4.2 or later, you'll notice that MONster is
 - no longer available. It's been superseeded by Shark, where
 - configuration of PMCs is available as a plugin.
 - 
 - 
 - 
 - V) Enabling the PMC on Linux
 - 
 - On linux you may use oprofile from http://oprofile.sf.net, depending on the
 - version and the cpu you may need to apply a patch[1] to access a set of the
 - possibile counters from the userspace application. You can always define them
 - using the kernel interface /dev/oprofile/* .
 - 
 - [1] http://dev.gentoo.org/~lu_zero/development/oprofile-g4-20060423.patch
 - 
 - --
 - Romain Dolbeau <romain@dolbeau.org>
 - Luca Barbato <lu_zero@gentoo.org>
 
 
  |