doc/optimization.txt
a552591f
 optimization Tips (for libavcodec):
5e123bd3
 ===================================
a552591f
 
 What to optimize:
5e123bd3
 -----------------
c5a44f57
 If you plan to do non-x86 architecture specific optimizations (SIMD normally),
a6493a8f
 then take a look in the x86/ directory, as most important functions are
8ea9ce41
 already optimized for MMX.
a552591f
 
8ea9ce41
 If you want to do x86 optimizations then you can either try to finetune the
a6493a8f
 stuff in the x86 directory or find some other functions in the C source to
8ea9ce41
 optimize, but there aren't many left.
a552591f
 
5e123bd3
 
a552591f
 Understanding these overoptimized functions:
5e123bd3
 --------------------------------------------
0a46c933
 As many functions tend to be a bit difficult to understand because
 of optimizations, it can be hard to optimize them further, or write
6609f9e2
 architecture-specific versions. It is recommended to look at older
2eed5288
 revisions of the interesting files (web frontends for the various FFmpeg
 branches are listed at http://ffmpeg.org/download.html).
0a46c933
 Alternatively, look into the other architecture-specific versions in
a6493a8f
 the x86/, ppc/, alpha/ subdirectories. Even if you don't exactly
0a46c933
 comprehend the instructions, it could help understanding the functions
 and how they can be optimized.
8ea9ce41
 
 NOTE: If you still don't understand some function, ask at our mailing list!!!
db95e559
 (http://lists.ffmpeg.org/mailman/listinfo/ffmpeg-devel)
a552591f
 
5e123bd3
 
ac59e7f4
 When is an optimization justified?
 ----------------------------------
07bf0cc9
 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.
a552591f
 
 
8ea9ce41
 WTF is that function good for ....:
5e123bd3
 -----------------------------------
6609f9e2
 The primary purpose of this list is to avoid wasting time optimizing functions
 which are rarely used.
a552591f
 
 put(_no_rnd)_pixels{,_x2,_y2,_xy2}
8ea9ce41
     Used in motion compensation (en/decoding).
a552591f
 
 avg_pixels{,_x2,_y2,_xy2}
8ea9ce41
     Used in motion compensation of B-frames.
c5a44f57
     These are less important than the put*pixels functions.
a552591f
 
 avg_no_rnd_pixels*
38aca760
     unused
a552591f
 
 pix_abs16x16{,_x2,_y2,_xy2}
8ea9ce41
     Used in motion estimation (encoding) with SAD.
a552591f
 
 pix_abs8x8{,_x2,_y2,_xy2}
8ea9ce41
     Used in motion estimation (encoding) with SAD of MPEG-4 4MV only.
c5a44f57
     These are less important than the pix_abs16x16* functions.
a552591f
 
 put_mspel8_mc* / wmv2_mspel8*
8ea9ce41
     Used only in WMV2.
     it is not recommended that you waste your time with these, as WMV2
     is an ugly and relatively useless codec.
a552591f
 
 mpeg4_qpel* / *qpel_mc*
8ea9ce41
     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.
38aca760
 
a552591f
 qpel{8,16}_mc??_old_c / *pixels{8,16}_l4
8ea9ce41
     Just used to work around a bug in an old libavcodec encoder version.
     Don't optimize them.
a552591f
 
7d67aa9b
 tpel_mc_func {put,avg}_tpel_pixels_tab
8ea9ce41
     Used only for SVQ3, so only optimize them if you need fast SVQ3 decoding.
7d67aa9b
 
a552591f
 add_bytes/diff_bytes
8ea9ce41
     For huffyuv only, optimize if you want a faster ffhuffyuv codec.
a552591f
 
 get_pixels / diff_pixels
8ea9ce41
     Used for encoding, easy.
38aca760
 
a552591f
 clear_blocks
8ea9ce41
     easiest to optimize
38aca760
 
a552591f
 gmc
8ea9ce41
     Used for MPEG-4 gmc.
     Optimizing this should have a significant effect on the gmc decoding
2e1ad4a2
     speed.
a552591f
 
143cc725
 gmc1
8ea9ce41
     Used for chroma blocks in MPEG-4 gmc with 1 warp point
     (there are 4 luma & 2 chroma blocks per macroblock, so
38aca760
     only 1/3 of the gmc blocks use this, the other 2/3
     use the normal put_pixel* code, but only if there is
8ea9ce41
     just 1 warp point).
     Note: DivX5 gmc always uses just 1 warp point.
143cc725
 
a552591f
 pix_sum
8ea9ce41
     Used for encoding.
38aca760
 
8c55915b
 hadamard8_diff / sse / sad == pix_norm1 / dct_sad / quant_psnr / rd / bit
8ea9ce41
     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.
a552591f
 
 put_pixels_clamped / add_pixels_clamped
8ea9ce41
     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.
a552591f
 
 idct/fdct
38aca760
     idct (encoding & decoding)
     fdct (encoding)
     difficult to optimize
 
a552591f
 dct_quantize_trellis
8ea9ce41
     Used for encoding with trellis quantization.
38aca760
     difficult to optimize
a552591f
 
 dct_quantize
8ea9ce41
     Used for encoding.
38aca760
 
a552591f
 dct_unquantize_mpeg1
8ea9ce41
     Used in MPEG-1 en/decoding.
a552591f
 
 dct_unquantize_mpeg2
8ea9ce41
     Used in MPEG-2 en/decoding.
a552591f
 
 dct_unquantize_h263
8ea9ce41
     Used in MPEG-4/H.263 en/decoding.
a552591f
 
 FIXME remaining functions?
8ea9ce41
 BTW, most of these functions are in dsputil.c/.h, some are in mpegvideo.c/.h.
a552591f
 
 
38aca760
 
a552591f
 Alignment:
8ea9ce41
 Some instructions on some architectures have strict alignment restrictions,
c5a44f57
 for example most SSE/SSE2 instructions on x86.
8ea9ce41
 The minimum guaranteed alignment is written in the .h files, for example:
a552591f
     void (*put_pixels_clamped)(const DCTELEM *block/*align 16*/, UINT8 *pixels/*align 8*/, int line_size);
 
 
7b8c3aed
 General Tips:
 -------------
 Use asm loops like:
be449fca
 __asm__(
7b8c3aed
     "1: ....
     ...
9c193cc4
     "jump_instruction ....
8144dff0
 Do not use C loops:
7b8c3aed
 do{
be449fca
     __asm__(
7b8c3aed
         ...
 }while()
 
d801f1c8
 For x86, mark registers that are clobbered in your asm. This means both
 general x86 registers (e.g. eax) as well as XMM registers. This last one is
 particularly important on Win64, where xmm6-15 are callee-save, and not
 restoring their contents leads to undefined results. In external asm (e.g.
 yasm), you do this by using:
 cglobal functon_name, num_args, num_regs, num_xmm_regs
 In inline asm, you specify clobbered registers at the end of your asm:
 __asm__(".." ::: "%eax").
2344dc6b
 If gcc is not set to support sse (-msse) it will not accept xmm registers
 in the clobber list. For that we use two macros to declare the clobbers.
 XMM_CLOBBERS should be used when there are other clobbers, for example:
 __asm__(".." ::: XMM_CLOBBERS("xmm0",) "eax");
 and XMM_CLOBBERS_ONLY should be used when the only clobbers are xmm registers:
 __asm__(".." :: XMM_CLOBBERS_ONLY("xmm0"));
d801f1c8
 
 Do not expect a compiler to maintain values in your registers between separate
 (inline) asm code blocks. It is not required to. For example, this is bad:
 __asm__("movdqa %0, %%xmm7" : src);
 /* do something */
 __asm__("movdqa %%xmm7, %1" : dst);
 - first of all, you're assuming that the compiler will not use xmm7 in
    between the two asm blocks.  It probably won't when you test it, but it's
    a poor assumption that will break at some point for some --cpu compiler flag
 - secondly, you didn't mark xmm7 as clobbered. If you did, the compiler would
    have restored the original value of xmm7 after the first asm block, thus
    rendering the combination of the two blocks of code invalid
 Code that depends on data in registries being untouched, should be written as
 a single __asm__() statement. Ideally, a single function contains only one
 __asm__() block.
 
 Use external asm (nasm/yasm) or inline asm (__asm__()), do not use intrinsics.
 The latter requires a good optimizing compiler which gcc is not.
 
 Inline asm vs. external asm
 ---------------------------
 Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc)
 and external asm (.s or .asm files, handled by an assembler such as yasm/nasm)
a6be21d3
 are accepted in FFmpeg. Which one to use differs per specific case.
d801f1c8
 
 - if your code is intended to be inlined in a C function, inline asm is always
    better, because external asm cannot be inlined
 - if your code calls external functions, yasm is always better
 - if your code takes huge and complex structs as function arguments (e.g.
    MpegEncContext; note that this is not ideal and is discouraged if there
    are alternatives), then inline asm is always better, because predicting
    member offsets in complex structs is almost impossible. It's safest to let
    the compiler take care of that
 - in many cases, both can be used and it just depends on the preference of the
    person writing the asm. For new asm, the choice is up to you. For existing
    asm, you'll likely want to maintain whatever form it is currently in unless
    there is a good reason to change it.
 - if, for some reason, you believe that a particular chunk of existing external
    asm could be improved upon further if written in inline asm (or the other
    way around), then please make the move from external asm <-> inline asm a
    separate patch before your patches that actually improve the asm.
7b8c3aed
 
a552591f
 
 Links:
5e123bd3
 ======
3df7be0f
 http://www.aggregate.org/MAGIC/
 
8ea9ce41
 x86-specific:
5e123bd3
 -------------
a552591f
 http://developer.intel.com/design/pentium4/manuals/248966.htm
 
38aca760
 The IA-32 Intel Architecture Software Developer's Manual, Volume 2:
a552591f
 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
 
20e570c8
 
 ARM-specific:
5e123bd3
 -------------
14c2634b
 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
652f5185
 Intel Wireless MMX 2 Coprocessor: Programmers Reference Manual
1a592ecc
 http://download.intel.com/design/intelxscale/31451001.pdf
20e570c8
 
2c2b3130
 PowerPC-specific:
5e123bd3
 -----------------
a1d0b6a2
 PowerPC32/AltiVec PIM:
2c2b3130
 www.freescale.com/files/32bit/doc/ref_manual/ALTIVECPEM.pdf
 
a1d0b6a2
 PowerPC32/AltiVec PEM:
2c2b3130
 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
20e570c8
 
277bb936
 SPARC-specific:
5e123bd3
 ---------------
277bb936
 SPARC Joint Programming Specification (JPS1): Commonality
 http://www.fujitsu.com/downloads/PRMPWR/JPS1-R1.0.4-Common-pub.pdf
 
777bbfdd
 UltraSPARC III Processor User's Manual (contains instruction timings)
 http://www.sun.com/processors/manuals/USIIIv2.pdf
 
71253ce9
 VIS Whitepaper (contains optimization guidelines)
 http://www.sun.com/processors/vis/download/vis/vis_whitepaper.pdf
277bb936
 
a552591f
 GCC asm links:
5e123bd3
 --------------
3df7be0f
 official doc but quite ugly
 http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
 
8ea9ce41
 a bit old (note "+" is valid for input-output, even though the next disagrees)
8c55915b
 http://www.cs.virginia.edu/~clc5q/gcc-inline-asm.pdf