最近在学习NVIDIA的CUDA通用并行计算架构, 该架构是利用NVIDIA的GPU进行计算密集型、高度并行化的计算. 有兴趣的读者可以参见NVIDIA CUDA中文网或英文网.
在学习的过程中,该并行架构的编程原理给我的感觉还算好理解, 主要的流程就是:
- Host (aka. CPU) 进行初始化程序及Host上的内存数据
- Host 将其内存区上的数据拷贝到Device (aka. GPU)的内存区
- 执行Device上的代码 (aka. Kernal函数)进行并行计算
- Device上的计算结束后,再将Device的内存区的数据拷贝回Host的内存区
- Host再进行后续代码工作
因此Host与Device之间的数据传输将是一个关键点,因为这是一个相对比较耗时的操作,直接影响整个程序的性能. 如果数据传输加Device上并行执行的时间开销要大于原本只需在Host上串行执行的时间开销的话,那这个并行架构就没有任何意义了.
对于视频编解码程序而言,这个数据传输的问题相对而言并不是一个很大的问题.
对于编码器而言,由于编码的复杂度相对比较高,大部分时间都集中编码过程,因此数据传输的开销相对比例很小,而且利用CUDA的page-locked memory来实现异步并行传输方式或DMA传输方式.
对于解码器而言,由于解码器相对简单,数据传输的开销比例可能会因此变得相对较大. 幸运的是,多数解码器的直接输出为屏幕显示,即解码器的本身就需要将解码后的图像数据拷贝到显卡(Device or GPU)的内存区,因此利用CUDA编程时,从Device的内存区回拷到Host的内存区这一步骤可以省去,因此相应的数据传输的开销可以说并没有增加.
综上所述, CUDA通用并行计算架构是很适合视频编解码技术的并行算法的实现.
本文来自: NVIDIA CUDA通用并行计算架构
发表评论