Random Posts
Tags
Categories
Recent Comments
- 小肥 on GDB 从裸奔到穿戴整齐
- flandre on 异步事件模型的 Self-pipe trick
- inv on 异步事件模型的 Self-pipe trick
- skywind on 异步事件模型的 Self-pipe trick
- skywind on 异步事件模型的 Self-pipe trick
Links
Meta
Monthly Archives: December 2015
如何写一个视频编码器演示篇
先前写过《视频编码原理简介》,有朋友问光代码和文字不太真切,能否补充几张图片,今天我们演示一下: 这是第一帧画面:P1(我们的参考帧) 这是第二帧画面:P2(需要编码的帧) 从视频中截取的两张间隔 1-2 秒的画面,和实际情况类似,下面我们参考 P1 进行几次运动搜索: 搜索演示1:搜索 P2 中车辆的车牌在 P1 中最接近的位置(上图 P1,下图 P2) 这是一个演示程序,鼠标选中 P2 上任意 16×16 的 Block,即可搜索出 P1 上的 BestMatch 宏块。虽然车辆在运动,从远到近,但是依然找到了最接近的宏块坐标。 (点击 more 阅读剩下内容)
内存拷贝优化(3)-深入优化
今天继续在原来内存拷贝代码上优化: 1. 修改了小内存方案:由原来64字节扩大为128字节,由 int 改为 xmm,小内存性能提升 80% 2. 修改了中内存方案:从4个xmm寄存器并行拷贝改为8个并行拷贝+prefetch,提升20%左右 3. 去除目标地址头部对齐的分支判断,用一次xmm拷贝完成目标对齐,性能替升10%。 4. 增加测试用例:为贴近实际,增加了随机访问,10MB空间内(绝对大于L2尺寸)随机位置和长度的测试 为避免随机数生成影响结果,提前生成随机数,最终平均性能达到gcc4.9配套标准库的2倍以上: https://github.com/skywind3000/FastMemcpy 最新代码测试结果(可以对比老的表看新版本性能是否有所提升):
内存拷贝优化(2)-全尺寸拷贝优化
四年前写过一篇小内存拷贝优化:http://www.skywind.me/blog/archives/143 纠结了一下还是把全尺寸拷贝优化代码发布出来吧,没啥好保密的, 如今总结一下全尺寸内存拷贝优化的要点: 1. 策略区别:64字节以内用小内存方案,64K以内用中尺寸方案,大于64K用大内存拷贝方案。 2. 查表跳转:拷贝不同小尺寸内存,直接跳转到相应地址解除循环。 3. 目标对齐:64字节以上拷贝的先用普通方法拷贝几个字节让目标地址对齐,好做后面的事情。 4. 矢量拷贝:并行一次性读入N个矢量到 sse2 寄存器,再并行写出。 5. 缓存预取:使用 prefetchnta ,提前预取数据,等到真的要用时数据已经到位。 6. 内存直写:使用 movntdq 来直写内存,避免缓存污染。 部分理论,见论文:《Using Block Prefetch for Optimized Memory Performance》 但论文考虑问题比较单一,所以实际代码写的比论文复杂不少,目前在各个尺寸上基本平均能够加速 40%,比较GCC 4.9, VS2012的 memcpy,不排除未来的 libc, crt库继续完善以后,能够达到下面代码的速度。但我看libc和crt的 memcpy代码已经很久没人更新了,不知道他们还愿意继续优化下去么? 行了,具体实现各位读代码吧,需要 SSE2 … Continue reading