最近研究Intel Media SDK
视频解码20个1080p cpu 4% 之后就不能添加了。修改添加join 和修改深度和栈 也只能增加几路。于是就想到编译64 位ffmpeg
实现软硬解码器。编译时发现 32位一路1080p 6% cpu 64 位 10% 的cpu 多option
选项一个个添加对比发现还是有很多提升的固留下笔记共大家研究学习。
./configure --prefix=/home/h264 --enable-gpl --disable-static
--enable-shared --enable-memalign-hack --enable-small
--disable-swscale-alpha --disable-programs --disable-ffmpeg
--disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc
--disable-htmlpages
--disable-manpages --disable-podpages --disable-txtpages
--disable-avdevice --disable-avfilter --disable-network --enable-dxva2
--disable-vaapi --disable-vda --disable-vdpau --disable-everything
--enable-decoder=h264 --enable-asm --enable-mmx --enable-mmxext
--enable-sse --enable-sse2 --enable-sse3 --enable-ssse3 --enable-sse4
--enable-sse42 --enable-avx --enable-avx2 --enable-inline-asm
--enable-yasm --enable-hwaccel=h264_dxva2 --disable-iconv
--disable-debug --enable-fma3 --enable-fma4 添加xop amd3dnow amd3dext
效率反而降低
optimizations:
--disable-asm disable all assembler optimizations 禁用所有汇编优化
--disable-altivec disable AltiVec optimizations 禁用的AltiVec优化
(AltiVec技术支持高带宽的数据处理和计算增强算法,如在和无线基站中的单芯片解决方案一样。这种方法允许开发人员在市场和客户要求变化时平衡现有的PowerPC代码和增加的AltiVec性能)
--disable-amd3dnow disable 3DNow! optimizations 禁用的3DNow!优化
AMD开发的一套SIMD,支持单精度浮点数的矢量运算,用于增强x86架构的计算机在三维图像处理上的性能。
--disable-amd3dnowext disable 3DNow! extended optimizations 禁用的3DNow!扩展优化
--disable-mmx disable MMX optimizations 禁用mmx优化
--disable-mmxext disable MMXEXT optimizations 禁用mmxext优化
--disable-sse disable SSE optimizations 禁用sse优化
--disable-sse2 disable SSE2 optimizations 禁用sse2优化
--disable-sse3 disable SSE3 optimizations 禁用sse3优化
--disable-ssse3 disable SSSE3 optimizations 禁用ssse3优化
--disable-sse4 disable SSE4 optimizations 禁用sse4优化
--disable-sse42 disable SSE4.2 optimizations 禁用sse42优化
--disable-avx disable AVX optimizations 禁用avx优化
--disable-xop disable XOP optimizations 禁用xop优化
XOP 是 AMD 全新推出新一代基于 SSE5 的 SIMD 指令集
--disable-fma3 disable FMA3 optimizations 禁用fma3优化
--disable-fma4 disable FMA4 optimizations 禁用fma4优化
FMA4指令集:FMA指令是AVX指令集的一个分支,因此FMA指令使用的是与AVX指令同样的编码设计规则。事实上,的FMA指令集也吸取了AMD提出的SSE5指令集的精髓,FMA指令的fused-multiply-add(融合乘加)与SSE5中的multiply-add/subtract运算如出一辙。当前FMA指令已分为2个版本,其中FMA4是AMD制定的版本。
--disable-avx2 disable AVX2 optimizations 禁用avx2优化
--disable-armv5te disable armv5te optimizations 禁用arm5te优化
--disable-armv6 disable armv6 optimizations 禁用arm6te优化
--disable-armv6t2 disable armv6t2 optimizations 禁用arm6te2优化
v5里的v是version,即arm第五版指令集。 te是thumb enhance,支持16-bit的Thumb指令。
--disable-vfp disable VFP optimizations 禁用vfp优化
arm VFP除了提供浮点数基本运算(加、减、乘、除、开方、比较、取反)提供支持之外,
最有特点是它向量(vectors)功能。它同时支持最多8组单精度4组双精度浮点数的运算
--disable-neon disable NEON optimizations 禁用none优化
ARM
? NEON? 通用 引擎可有效处理当前和将来的多媒体格式,从而改善用户体验。
NEON 技术可加速多媒体和信号处理算法(如视频编码/解码、2D/3D 图形、游戏、音频和语音处理、图像处理技术、电话和声音合成),其性能至少为 ARMv5 性能的 3 倍,为 SIMD
性能的 2 倍。
通过干净方式构建的 NEON 技术可无缝用于其本身的独立管道和寄存器文件。
NEON 技术是 ARM 处理器的 128 位 SIMD(单指令,多数据)架构扩展,旨在为消费性多媒体应用程序提供灵活、强大的加速功能,从而显著改善用户体验。它具有 32 个寄存器,64 位宽(双倍视图为 16 个寄存器,128 位宽。)
NEON 指令可执行“打包的 SIMD”处理:
-
寄存器被视为同一数据类型的元素的矢量
-
数据类型可为:签名/未签名的 8 位、16 位、32 位、64 位单精度
-
指令在所有通道中执行同一操作
使用 NEON 技术的 ARM 处理器,以及 ARM 的 解决方案可用于,范围从和设备到 。
--disable-vis disable VIS optimizations 禁用vis优化
Visual Instruction Set,
or VIS,是一个用于处理器的。VIS在所有的以及较新的处理器上都有实现
--disable-inline-asm disable use of inline assembler 禁用内嵌汇编优化
--disable-yasm disable use of yasm assembler 禁用汇编优化
--disable-mips32r2 disable MIPS32R2 optimizations 禁用MIPS32R2优化
--disable-mipsdspr1 disable MIPS DSP ASE R1 optimizations禁用MIPS DSP ASE R1优化
--disable-mipsdspr2 disable MIPS DSP ASE R2 optimizations禁用MIPS DSP ASE R2优化
--disable-mipsfpu disable floating point MIPS optimizations禁用浮点MIPS优化
MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的”(Microprocessor
without interlocked
piped
stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福(Stanford)大学Hennessy教授领
导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算
机系统。
MIPS技术公司是美国著名的芯片设计公司,它采用精简计
算结构(RISC)来设计芯片。和英特尔采用的复杂指令系统计算结构(CISC)相比,RISC具有设计更简单、设计周期更短等优点,并可以应用更多先进
的技术,开发更快的下一代处理器。MIPS是出现最早的商业RISC架构芯片之一,新的架构集成了所有原来MIPS指令集,并增加了许多更强大的功能。
MIPS CPU指令长度为32比特,按功能可以分为以下五类:加载和存储指令,算术指令,跳转和分支指令,杂类指令和协处理器指令。下面开始对MIPS常见的汇编指令进行讲解。
1. 加载和存储指令
数据类型
|
CPU
|
协处理器1和2
|
加载无符号数
|
加载有符号数
|
存储
|
加载
|
存储
|
字节
|
MIPS32
|
MIPS32
|
MIPS32
|
|
|
半字
|
MIPS32
|
MIPS32
|
MIPS32
|
|
|
字
|
MIPS32
|
MIPS32
|
MIPS32
|
MIPS32
|
MIPS32
|
双字(FPU)
|
|
|
|
MIPS32
|
MIPS32
|
未对齐字
|
MIPS32
|
|
MIPS32
|
|
|
关联字(原子修改)
|
MIPS32
|
|
MIPS32
|
|
|
具体的见下表:
助记符
|
指令格式
|
指令功能
|
实例
|
LB
|
LB rt , offset (base)
|
加载字节
|
LB a0, 4 (a1)
|
LBU
|
LBU rt , offset (base)
|
加载无符号字节
|
LBU t0 , 7 (t3)
|
SB
|
SB rt , offset (base)
|
存储字节
|
SB a0 , 3 (a3)
|
LH
|
LH rt , offset (base)
|
加载半字
|
LH s2 , 5 (s5)
|
LHU
|
LHU rt , offset (base)
|
加载无符号半字
|
LHU t0 , 6 (t3)
|
SH
|
SH rt , offset (base)
|
存储半字
|
SH s4, 18 (s1)
|
LW
|
LW rt , offset (base)
|
加载字
|
LW v0 ,6 (a1)
|
SW
|
SW rt , offset (base)
|
存储字
|
SW s6 , 1 (t3)
|
LWL*
|
LWL rt , offset (base)
|
加载字头
|
LWL a1 , 3 (t0)
|
LWR*
|
LWR rt , offset (base)
|
加载字尾
|
LWR s2 , 5(a2)
|
SWL*
|
SWL rt , offset (base)
|
存储字头
|
SWL s5 , 3 (t4)
|
SWR*
|
SWR rt , offset (base)
|
存储字尾
|
SWR a3 , 8 (a0)
|
LL*
|
LL rt , offset (base)
|
加载关联
|
LL t1 , 0 (t0)
|
SC*
|
SC rt , offset (base)
|
条件存储
|
SC t2, 0 (t0)
|
MIPS加载和存储指令的命名规则如下:
1) 首字母L表示加载(Load),S表示存储(Store)
2) 首字母U表示无符号(Unsigned),其余默认为有符号(Signed)
3) 尾字母R表示右(Right),L表示左(Left)
4) 字母B示字节(Byte),H表示半字(Halfword),W表示字(Word)
--(待续:由于时间关系先就写到这里,晚上接着写)
从
现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如MMX(Multi Media Extended)、SSE、
SSE2(Streaming-Single instruction multiple data-Extensions
2)、SEE3和3DNow
fma!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。我们通常会把CPU的扩展指令集称为CPU的指
令集。
阅读(10089) | 评论(0) | 转发(0) |