英特尔® 软件网络博客- 中文» 提高Media SDK效率之内存选择篇

作者: (9 篇文章) 日期: 一月 21, 2010 在 8:52 下午

Media SDK使用内存缓冲来输入/输出视频数据,内存缓冲的不同种类将会直接影响编解码的效率。内存缓冲可以是一块在系统内存中的连续块(通过malloc或者new来分配),也可以是显卡内存的连续块(通过Microsoft Direct3D9 Surface函数来分配)。那么内存缓冲的种类由谁来决定呢?本篇文章就是以此为基础,讨论在不同情况下程序如何选择内存缓冲种类的问题。

在讨论内存缓冲对编解码影响之前,笔者先讨论下面三种情况下的内存数据传送问题。
- 系统内存间数据如何传送?
对于程序员而言,这个是最为简单的日常编程事项。一般的使用方式是memcpy,在一些数据较大情况下(超过L3的cache尺寸时候,用movntqa等指令)。不管何种方式,都是CPU-BASED的代码,在SIMD下效率很高。

- 显存间数据是如何传送的?
它类似于系统内存之间的数据传送,并且显存的带宽和速率都很高,传送速度更快。

- 显存和系统内存间数据是如何传送的?
通过DMA方式传送内存数据,速度依赖于DMA的带宽和速率(比如,DMA一般在100MB/s)。相比与上述两种情况,它的传送速度明显慢。

从上面的三种情况可以看出,程序一定要尽量避免出现系统内存和显存之间的数据传送,那么Media SDK在什么配置下会出现此类尴尬状态呢?

在中,程序通过MFX_IMPL_AUTO参数根据当前平台来自动选择硬件或软件编解码,并能通过mfxStatus MFXQueryIMPL(mfxSession session, mfxIMPL *impl)函数来获取当前平台的编解码方式。根据当前平台的使用方法,下面再进行分别讨论。

a)使用硬件编解码方式
硬件编解码方式主要是通过显卡的硬件加速达到高效编解码的作用,也就是说它的核心是显卡。如果我们使用系统内存为其提供缓存,会出现什么情况呢?显然,在数据输出/输出时,程序必将会有显存和系统内存之间的数据传送作用,效能将受到严重影响。在此情况下,程序的{zh0}选择就是显存,否则必将受到性能惩罚!

b)使用软件编解码方式
很显然,软件编解码的核心是CPU。如果我们使用显存作为其缓冲,那么必将导致显存和系统内存之间的数据交互,也就会导致速度低下的程序出现,故此,系统内存是它的xxxx!

【小结】
Media SDK中内存类型的选择分两步走:
1. 使用MFXQueryIMPL函数来查询当前的编解码方式。
2. 根据编解码方式(MFX_IMPL_SOFTWARE为软件;MFX_IMPL_HARDWARE为硬件)来决定内存选用类型。为了便于日后方便查询,笔者建立了一个小表格,如表1所示,以供参考。

                                表1 编解码内存选取
此外,笔者对Media SDK的两种不同内存类型在解码器下做了一个简单的比较。在软件解码方式下,显存选取要比内存选取慢了近1倍,这个是相当可观的数字!切忌,正确选取内存是高效程序的基本点!

分类: ,

 评论 (1)

 引用 (0)


 写评论  

姓名 (必填)*

电子邮件 (必填,不在本页面显示)*

您的 URL (可选)


评论*

郑重声明:资讯 【英特尔® 软件网络博客- 中文» 提高Media SDK效率之内存选择篇】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——