optimization.txt 7.66 KB
Newer Older
Michael Niedermayer's avatar
Michael Niedermayer committed
1
optimization Tips (for libavcodec):
2
===================================
Michael Niedermayer's avatar
Michael Niedermayer committed
3 4

What to optimize:
5
-----------------
6
If you plan to do non-x86 architecture specific optimizations (SIMD normally),
7 8
then take a look in the i386/ directory, as most important functions are
already optimized for MMX.
Michael Niedermayer's avatar
Michael Niedermayer committed
9

10 11 12
If you want to do x86 optimizations then you can either try to finetune the
stuff in the i386 directory or find some other functions in the C source to
optimize, but there aren't many left.
Michael Niedermayer's avatar
Michael Niedermayer committed
13

14

Michael Niedermayer's avatar
Michael Niedermayer committed
15
Understanding these overoptimized functions:
16
--------------------------------------------
17 18
As many functions tend to be a bit difficult to understand because
of optimizations, it can be hard to optimize them further, or write
19
architecture-specific versions. It is recommended to look at older
Diego Biurrun's avatar
Diego Biurrun committed
20 21
revisions of the interesting files (for a web frontend try ViewVC at
http://svn.mplayerhq.hu/ffmpeg/trunk/).
22 23 24 25
Alternatively, look into the other architecture-specific versions in
the i386/, ppc/, alpha/ subdirectories. Even if you don't exactly
comprehend the instructions, it could help understanding the functions
and how they can be optimized.
26 27

NOTE: If you still don't understand some function, ask at our mailing list!!!
28
(http://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-devel)
Michael Niedermayer's avatar
Michael Niedermayer committed
29

30

31 32
When is an optimization justified?
----------------------------------
33 34 35 36 37 38 39 40 41
Normally, clean and simple optimizations for widely used codecs are
justified even if they only achieve an overall speedup of 0.1%. These
speedups accumulate and can make a big difference after awhile. Also, if
none of the following factors get worse due to an optimization -- speed,
binary code size, source size, source readability -- and at least one
factor improves, then an optimization is always a good idea even if the
overall gain is less than 0.1%. For obscure codecs that are not often
used, the goal is more toward keeping the code clean, small, and
readable instead of making it 1% faster.
Michael Niedermayer's avatar
Michael Niedermayer committed
42 43


44
WTF is that function good for ....:
45
-----------------------------------
46 47
The primary purpose of this list is to avoid wasting time optimizing functions
which are rarely used.
Michael Niedermayer's avatar
Michael Niedermayer committed
48 49

put(_no_rnd)_pixels{,_x2,_y2,_xy2}
50
    Used in motion compensation (en/decoding).
Michael Niedermayer's avatar
Michael Niedermayer committed
51 52

avg_pixels{,_x2,_y2,_xy2}
53
    Used in motion compensation of B-frames.
54
    These are less important than the put*pixels functions.
Michael Niedermayer's avatar
Michael Niedermayer committed
55 56

avg_no_rnd_pixels*
57
    unused
Michael Niedermayer's avatar
Michael Niedermayer committed
58 59

pix_abs16x16{,_x2,_y2,_xy2}
60
    Used in motion estimation (encoding) with SAD.
Michael Niedermayer's avatar
Michael Niedermayer committed
61 62

pix_abs8x8{,_x2,_y2,_xy2}
63
    Used in motion estimation (encoding) with SAD of MPEG-4 4MV only.
64
    These are less important than the pix_abs16x16* functions.
Michael Niedermayer's avatar
Michael Niedermayer committed
65 66

put_mspel8_mc* / wmv2_mspel8*
67 68 69
    Used only in WMV2.
    it is not recommended that you waste your time with these, as WMV2
    is an ugly and relatively useless codec.
Michael Niedermayer's avatar
Michael Niedermayer committed
70 71

mpeg4_qpel* / *qpel_mc*
72 73 74 75 76
    Used in MPEG-4 qpel motion compensation (encoding & decoding).
    The qpel8 functions are used only for 4mv,
    the avg_* functions are used only for B-frames.
    Optimizing them should have a significant impact on qpel
    encoding & decoding.
77

Michael Niedermayer's avatar
Michael Niedermayer committed
78
qpel{8,16}_mc??_old_c / *pixels{8,16}_l4
79 80
    Just used to work around a bug in an old libavcodec encoder version.
    Don't optimize them.
Michael Niedermayer's avatar
Michael Niedermayer committed
81

82
tpel_mc_func {put,avg}_tpel_pixels_tab
83
    Used only for SVQ3, so only optimize them if you need fast SVQ3 decoding.
84

Michael Niedermayer's avatar
Michael Niedermayer committed
85
add_bytes/diff_bytes
86
    For huffyuv only, optimize if you want a faster ffhuffyuv codec.
Michael Niedermayer's avatar
Michael Niedermayer committed
87 88

get_pixels / diff_pixels
89
    Used for encoding, easy.
90

Michael Niedermayer's avatar
Michael Niedermayer committed
91
clear_blocks
92
    easiest to optimize
93

Michael Niedermayer's avatar
Michael Niedermayer committed
94
gmc
95 96
    Used for MPEG-4 gmc.
    Optimizing this should have a significant effect on the gmc decoding
97
    speed.
Michael Niedermayer's avatar
Michael Niedermayer committed
98

Michael Niedermayer's avatar
Michael Niedermayer committed
99
gmc1
100 101
    Used for chroma blocks in MPEG-4 gmc with 1 warp point
    (there are 4 luma & 2 chroma blocks per macroblock, so
102 103
    only 1/3 of the gmc blocks use this, the other 2/3
    use the normal put_pixel* code, but only if there is
104 105
    just 1 warp point).
    Note: DivX5 gmc always uses just 1 warp point.
Michael Niedermayer's avatar
Michael Niedermayer committed
106

Michael Niedermayer's avatar
Michael Niedermayer committed
107
pix_sum
108
    Used for encoding.
109

110
hadamard8_diff / sse / sad == pix_norm1 / dct_sad / quant_psnr / rd / bit
111 112 113 114
    Specific compare functions used in encoding, it depends upon the
    command line switches which of these are used.
    Don't waste your time with dct_sad & quant_psnr, they aren't
    really useful.
Michael Niedermayer's avatar
Michael Niedermayer committed
115 116

put_pixels_clamped / add_pixels_clamped
117 118 119
    Used for en/decoding in the IDCT, easy.
    Note, some optimized IDCTs have the add/put clamped code included and
    then put_pixels_clamped / add_pixels_clamped will be unused.
Michael Niedermayer's avatar
Michael Niedermayer committed
120 121

idct/fdct
122 123 124 125
    idct (encoding & decoding)
    fdct (encoding)
    difficult to optimize

Michael Niedermayer's avatar
Michael Niedermayer committed
126
dct_quantize_trellis
127
    Used for encoding with trellis quantization.
128
    difficult to optimize
Michael Niedermayer's avatar
Michael Niedermayer committed
129 130

dct_quantize
131
    Used for encoding.
132

Michael Niedermayer's avatar
Michael Niedermayer committed
133
dct_unquantize_mpeg1
134
    Used in MPEG-1 en/decoding.
Michael Niedermayer's avatar
Michael Niedermayer committed
135 136

dct_unquantize_mpeg2
137
    Used in MPEG-2 en/decoding.
Michael Niedermayer's avatar
Michael Niedermayer committed
138 139

dct_unquantize_h263
140
    Used in MPEG-4/H.263 en/decoding.
Michael Niedermayer's avatar
Michael Niedermayer committed
141 142

FIXME remaining functions?
143
BTW, most of these functions are in dsputil.c/.h, some are in mpegvideo.c/.h.
Michael Niedermayer's avatar
Michael Niedermayer committed
144 145


146

Michael Niedermayer's avatar
Michael Niedermayer committed
147
Alignment:
148
Some instructions on some architectures have strict alignment restrictions,
149
for example most SSE/SSE2 instructions on x86.
150
The minimum guaranteed alignment is written in the .h files, for example:
Michael Niedermayer's avatar
Michael Niedermayer committed
151 152 153
    void (*put_pixels_clamped)(const DCTELEM *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size);


154 155 156 157 158 159 160
General Tips:
-------------
Use asm loops like:
asm(
    "1: ....
    ...
    "jump_instruciton ....
Michael Niedermayer's avatar
Michael Niedermayer committed
161
Do not use C loops:
162 163 164 165 166
do{
    asm(
        ...
}while()

167
Use asm() instead of intrinsics. The latter requires a good optimizing compiler
168 169
which gcc is not.

Michael Niedermayer's avatar
Michael Niedermayer committed
170 171

Links:
172
======
Michael Niedermayer's avatar
Michael Niedermayer committed
173 174
http://www.aggregate.org/MAGIC/

175
x86-specific:
176
-------------
Michael Niedermayer's avatar
Michael Niedermayer committed
177 178
http://developer.intel.com/design/pentium4/manuals/248966.htm

179
The IA-32 Intel Architecture Software Developer's Manual, Volume 2:
Michael Niedermayer's avatar
Michael Niedermayer committed
180 181 182 183 184 185 186 187
Instruction Set Reference
http://developer.intel.com/design/pentium4/manuals/245471.htm

http://www.agner.org/assem/

AMD Athlon Processor x86 Code Optimization Guide:
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/22007.pdf

188 189

ARM-specific:
190
-------------
191 192 193 194 195 196 197 198 199 200 201 202
ARM Architecture Reference Manual (up to ARMv5TE):
http://www.arm.com/community/university/eulaarmarm.html

Procedure Call Standard for the ARM Architecture:
http://www.arm.com/pdfs/aapcs.pdf

Optimization guide for ARM9E (used in Nokia 770 Internet Tablet):
http://infocenter.arm.com/help/topic/com.arm.doc.ddi0240b/DDI0240A.pdf
Optimization guide for ARM11 (used in Nokia N800 Internet Tablet):
http://infocenter.arm.com/help/topic/com.arm.doc.ddi0211j/DDI0211J_arm1136_r1p5_trm.pdf
Optimization guide for Intel XScale (used in Sharp Zaurus PDA):
http://download.intel.com/design/intelxscale/27347302.pdf
203 204
Intel Wireless MMX2 Coprocessor: Programmers Reference Manual
http://download.intel.com/design/intelxscale/31451001.pdf
205

206
PowerPC-specific:
207
-----------------
208
PowerPC32/AltiVec PIM:
209 210
www.freescale.com/files/32bit/doc/ref_manual/ALTIVECPEM.pdf

211
PowerPC32/AltiVec PEM:
212 213 214 215 216
www.freescale.com/files/32bit/doc/ref_manual/ALTIVECPIM.pdf

CELL/SPU:
http://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/30B3520C93F437AB87257060006FFE5E/$file/Language_Extensions_for_CBEA_2.4.pdf
http://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/9F820A5FFA3ECE8C8725716A0062585F/$file/CBE_Handbook_v1.1_24APR2007_pub.pdf
217

Michael Niedermayer's avatar
Michael Niedermayer committed
218
SPARC-specific:
219
---------------
Michael Niedermayer's avatar
Michael Niedermayer committed
220 221 222
SPARC Joint Programming Specification (JPS1): Commonality
http://www.fujitsu.com/downloads/PRMPWR/JPS1-R1.0.4-Common-pub.pdf

223 224 225
UltraSPARC III Processor User's Manual (contains instruction timings)
http://www.sun.com/processors/manuals/USIIIv2.pdf

226 227
VIS Whitepaper (contains optimization guidelines)
http://www.sun.com/processors/vis/download/vis/vis_whitepaper.pdf
Michael Niedermayer's avatar
Michael Niedermayer committed
228

Michael Niedermayer's avatar
Michael Niedermayer committed
229
GCC asm links:
230
--------------
Michael Niedermayer's avatar
Michael Niedermayer committed
231 232 233
official doc but quite ugly
http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

234
a bit old (note "+" is valid for input-output, even though the next disagrees)
235
http://www.cs.virginia.edu/~clc5q/gcc-inline-asm.pdf