1.å¦ä½å¦å¥½C++å¢?源码
2.xfs文件系统:layout与架构、源码分析
3.视频和视频帧:Intel GPU(核显)的剖析编解码故事
å¦ä½å¦å¥½C++å¢?
æè¿éæäºç»éªï¼å¸æå¯¹ä½ æ帮å©ï¼
1.æC++å½æä¸é¨æ°çè¯è¨å¦ä¹ ï¼åC没å¥å ³ç³»ï¼ççãï¼ï¼
2.çãThinking In C++ãï¼ä¸è¦çãC++åææ»ç¸ãï¼
3.çãThe C++ Programming LanguageãåãInside The C++ Object Modelã,ä¸è¦å 为ä»ä»¬å¾é¾èæ们èªå·±æ¯åå¦è æ以就ä¸çï¼
4.ä¸è¦è¢«VCãBCBãBCãMCãTCçè¯æ±æè¿·æââä»ä»¬é½æ¯éæå¼åç¯å¢ï¼èæ们è¦å¦çæ¯ä¸é¨è¯è¨ï¼
5.ä¸è¦æ¾è¿ä»»ä½ä¸ä¸ªçä¸å»å¾ç®åçå°ç¼ç¨é®é¢ââä»ä»¬å¾å¾å¹¶ä¸é£ä¹ç®åï¼æè å¯ä»¥å¼ä¼¸åºå¾å¤ç¥è¯ç¹ï¼
6.ä¼ç¨Visual C++ï¼å¹¶ä¸è¯´æä½ ä¼C++ï¼
7.å¦class并ä¸é¾ï¼templateãSTLãgeneric programmingä¹ä¸è¿å¦æ¤ââé¾çæ¯é¿æåæå®è·µåä¸éä½åçåè§ç¾¤ä¹¦ï¼
8.å¦æä¸æ¯å¤©æçè¯ï¼æ³å¦ç¼ç¨å°±ä¸è¦æ³ç©æ¸¸æââä½ ä»¥ä¸ºä½ åå°äºï¼å ¶å®ä½ çC++水平并没æåä½ éå ³çè½åä¸èµ·åé«ââå ¶å®å¯ä»¥æ¶å»è®°ä½ï¼å¦C++æ¯ä¸ºäºç¼æ¸¸æçï¼
9.çVisual C++ç书ï¼æ¯å¦ä¸äºC++è¯è¨çï¼
.æµ®èºç人容æ说ï¼XXè¯è¨ä¸è¡äºï¼åºè¯¥å¦YYï¼ââæ¯ä½ èªå·±ä¸è¡äºå§ï¼ï¼
.æµ®èºç人容æé®ï¼æå°åºè¯¥å¦ä»ä¹ï¼ââå«é®ï¼å¦å°±å¯¹äºï¼
.æµ®èºç人容æé®ï¼XXæé±éåï¼ââå»ºè®®ä½ å»æ¢é¶è¡ï¼
.æµ®èºç人容æ说ï¼æè¦ä¸æçï¼æè±æä¸è¡ï¼ââä¸è¡ï¼å¦åï¼
.æµ®èºç人容æé®ï¼XXåYYåªä¸ªå¥½ï¼ââåè¯ä½ å§ï¼é½å¥½ââåªè¦ä½ å¦å°±è¡ï¼
.æµ®èºç人å两ç§ï¼a)åªè§æèä¸å¦ç人ï¼b)åªå¦èä¸åæç人ï¼
.ææ¶é«¦çææ¯æå¨å´è¾¹ï¼è¿ä¸å¦æè¿æ¶çææ¯è®°å¨å¿éï¼
.C++ä¸ä» ä» æ¯æ¯æé¢å对象çç¨åºè®¾è®¡è¯è¨ï¼
.å¦ä¹ ç¼ç¨æ好çæ¹æ³ä¹ä¸å°±æ¯é 读æºä»£ç ï¼
.å¨ä»»ä½æ¶å»é½ä¸è¦è®¤ä¸ºèªå·±æä¸ç书已ç»è¶³å¤äºï¼
.请é 读ãThe Standard C++ Bibleã(ä¸æçï¼æ åC++å®å ¸)ï¼ææ¡C++æ åï¼
.çå¾æç书ï¼è¯·ä»ç»çï¼çä¸æç书ï¼è¯·ç¡¬ç头ç®çï¼
.å«ææç第ä¸é书就è½è®°ä½åææ¡ä»ä¹ââ请ç第äºéã第ä¸éï¼
.请çãEffective C++ãåãMore Effective C++ã以åãExceptional C++ãï¼
.ä¸è¦åçå¨éæå¼åç¯å¢çæ篮ä¸ï¼è¦å¦ä¼æ§å¶éæå¼åç¯å¢ï¼è¿è¦å¦ä¼ç¨å½ä»¤è¡æ¹å¼å¤çç¨åºï¼
.åå«äººä¸èµ·è®¨è®ºææä¹çC++ç¥è¯ç¹ï¼èä¸æ¯äºåµXXè¡ä¸è¡æè YYä¸ZZåªä¸ªå¥½ï¼
.请çãç¨åºè®¾è®¡å®è·µãï¼å¹¶ä¸¥æ ¼çæç §å ¶è¦æ±å»åï¼
.ä¸è¦å 为CåC++ä¸æä¸äºè¯æ³åå ³é®åçä¸å»ç¸åï¼å°±è®¤ä¸ºå®ä»¬çæä¹åä½ç¨å®å ¨ä¸æ ·ï¼
.C++ç»ä¸æ¯æè°çCçâæ©å âââå¦æC++ä¸å¼å§å°±èµ·åå«Zè¯è¨ï¼ä½ ä¸å®ä¸ä¼æCåZè¯è¨èç³»å¾é£ä¹ç´§å¯ï¼
.请ä¸è¦è®¤ä¸ºå¦è¿XXè¯è¨åæ¹å¦C++ä¼æä»ä¹é®é¢ââä½ åªä¸è¿åå¨å¦ä¸é¨å ¨æ°çè¯è¨èå·²ï¼
.读å®äºãInside The C++ Object Modelã以ååæ¥è®¤å®èªå·±æ¯ä¸æ¯å·²ç»å¦ä¼äºC++ï¼
.å¦ä¹ ç¼ç¨çç§è¯æ¯ï¼ç¼ç¨ï¼ç¼ç¨ï¼åç¼ç¨ï¼
.请çæä¸å书ç±ï¼ãC++é¢å对象é«æç¼ç¨ï¼C++ Effective Object-Oriented Software Constructionï¼ããé¢å对象软件æé (Object-Oriented Software Construction)ãã设计模å¼ï¼Design Patternsï¼ããThe Art of Computer Programmingãï¼
.è®°ä½ï¼é¢å对象ææ¯ä¸åªæ¯C++ä¸æçï¼
.请æ书ä¸çç¨åºä¾å亲æè¾å ¥å°çµèä¸å®è·µï¼å³ä½¿é å¥å çä¸ææºä»£ç ï¼
.æå¨ä¹¦ä¸çå°çææä¹çä¾åæ©å ï¼
.请éè§C++ä¸çå¼å¸¸å¤çææ¯ï¼å¹¶å°å ¶åå®çè¿ç¨å°èªå·±çç¨åºä¸ï¼
.ç»å¸¸å顾èªå·±ä»¥ååè¿çç¨åºï¼å¹¶å°è¯éåï¼æèªå·±å¦å°çæ°ç¥è¯è¿ç¨è¿å»ï¼
.ä¸è¦æ¼æ书ä¸ä»»ä½ä¸ä¸ªç»ä¹ é¢ââè¯·å ¨é¨åå®å¹¶è®°å½ä¸è§£é¢æè·¯ï¼
.C++è¯è¨åC++çéæå¼åç¯å¢è¦åæ¶å¦ä¹ åææ¡ï¼
.æ¢ç¶å³å®äºå¦C++,就请åæå¦ä¸å»ï¼å 为å¦ä¹ ç¨åºè®¾è®¡è¯è¨çç®çæ¯ææ¡ç¨åºè®¾è®¡ææ¯ï¼èç¨åºè®¾è®¡ææ¯æ¯è·¨è¯è¨çï¼
.就让C++è¯è¨çåç§å¹³å°åå¼åç¯å¢å»æ¿ççç«äºå§ï¼æ们è¦ä»¥å¦ä¹ C++è¯è¨æ¬èº«ä¸ºä¸»ï¼
.å½ä½ åC++ç¨åºåå°ä¸åå´åç°èªå·±ç¨çæ¹æ³å¾æå£æ¶ï¼è¯·ä¸è¦é©¬ä¸åæï¼è¯·å°½å¿«å°ä½ä¸çé¨åç²ç¥çå®æ以ä¿è¯è¿ä¸ªè®¾è®¡çå®æ´æ§ï¼ç¶ååæèªå·±çé误并éæ°è®¾è®¡åç¼åï¼åè§ï¼ï¼
.å«å¿æ¥ï¼è®¾è®¡C++çclassç¡®å®ä¸å®¹æï¼èªå·±ç¨åºä¸çclassåèªå·±çclass设计水平æ¯å¨ä¸æçç¼ç¨å®è·µä¸å®åååå±çï¼
.å³ä¸è¦å 为ç¨åºâå¾å°âå°±ä¸éµå¾ªæäºä½ ä¸çç»çè§åââå¥½ä¹ æ¯æ¯å¹å »åºæ¥çï¼èä¸æ¯ä¸æ¬¡è®°ä½çï¼
.æ¯å¦å°ä¸ä¸ªC++é¾ç¹çæ¶åï¼å°è¯ç对å«äººè®²è§£è¿ä¸ªç¥è¯ç¹å¹¶è®©ä»ç解ââä½ è½è®²æ¸ æ¥æ说æä½ ççç解äºï¼
.è®°å½ä¸å¨åå«äººäº¤æµæ¶åç°çèªå·±å¿½è§æä¸ç解çç¥è¯ç¹ï¼
.请ä¸æç对èªå·±åçç¨åºæåºæ´é«çè¦æ±,åªæä½ çç¨åºçæ¬å·ä¼åæVersion .XXï¼
.ä¿åå¥½ä½ åè¿çææçç¨åºââé£æ¯ä½ æ好ç积累ä¹ä¸ï¼
.请ä¸è¦åæµ®èºç人ï¼
.请çç±C++!
xfs文件系统:layout与架构、源码分析
本文由腾讯工程师aurelian撰写,源码深入解析Linux内核中xfs文件系统的剖析layout与架构,结合源码剖析其工作原理。源码首先,剖析手机版钓鱼源码xfs的源码layout包括超级块、AGF管理(空闲空间追踪)、剖析AGI管理(inode管理)、源码AGFL(空闲链表)以及B+树结构等组成部分,剖析每个部分都有其特定功能,源码如超级块用于存储关键信息,剖析B+树用于快速查找空间。源码
在文件操作方面,剖析xfs支持iops、源码fops和aops三个操作集,分别负责inode元数据、内存级读写和磁盘级读写。创建文件时,会检查quota并预留空间,通过一系列函数如xfs_trans_reserve_quota和xfs_dir_ialloc进行操作。分配inode时,会依据agi信息和ag的协议栈源码调试空闲情况动态分配,并通过xfs_iget确保inode在核心内存中可用。
磁盘级inode分配涉及agi信息的获取和B+树的查找,xfs_ialloc_ag_alloc会根据空闲inode情况完成连续或非连续的分配。写操作涉及内存和磁盘级别,buffer io通过page cache管理,直接io和DAX write则有特定的处理方式。xfs的映射关系和data区域树管理对于高效读写至关重要。
工具方面,mkfs.xfs用于格式化,xfs_fsr、xfs_bmap、xfs_info等用于维护和监控文件系统,xfs_admin和xfs_copy用于系统参数调整和数据复制,xfs_db则是用于调试的工具。希望本文能帮助读者理解xfs的复杂性,如需了解更多详情,可关注鹅厂架构师公众号。
视频和视频帧:Intel GPU(核显)的编解码故事
一般提及基于“显卡或多媒体处理芯片对视频进行解码”为硬解码,本文将探讨如何利用Intel的核显,即集成GPU实现硬解码。提及QSV,全称为Quick Sync Video,爱丁堡离伦敦源码Intel在年发布Sandy Bridge CPU时,一同推出了这项基于核显进行多媒体处理,包括视频编解码的技术。集成核显,官方称HD Graphics,最早在Sandy Bridge前一代制程已推出,但性能提升及充分发挥在Sandy Bridge时期。Haswell及后续制程发布更高级的Iris架构。最近Intel宣布将开发独立显卡,核显发展具体走向未知。
接手QSV项目时,预期会有很多相关资料,实则相反。因此,将记录自己学习过程。
本文将介绍:
I. Intel的核显(集成GPU):
了解核显很有必要,几个月前,作者对CPU的认识还停留在“南北桥”架构。以下内容若有不准确之处,欢迎指正。
查看Gen CPU结构图,首先看CPU核心部分。短视频源码加持在整块CPU芯片中,核显占比不小,算力不容小觑。在没有独立显卡的笔记本上,可以运行大量大型游戏,虽偶有卡顿、掉帧情况,整体表现已相对不错。
接下来,看官方给出的GPU内部结构图。GPU内部远比图上所示复杂,图中介绍的仅为部分Subslice芯片结构。GPU分为Slice部分和Un-Slice部分,Slice部分已介绍,接下来介绍Un-Slice部分。
作者找到了一张图,展示了在MFF上进行视频处理的流程:1) 首先在MFX/VDBOX模块上进行编解码;2) 接着送到VQE/VEBOX上做图像增强和矫正处理;3) 然后送到SFC上做scale和transcode;4) 最后送出到显示屏上展示。是否完全正确,作者这里做个记录。
推荐知乎文章《转》Intel Gen8/Gen9核芯显卡微架构详细剖析,深入浅出,关于thread dispatch的高清版传奇源码说明即出自该文。
最后,总结Intel集成GPU/核显结构图。
注意,这是skylake架构下的GT2/GT3/GT4 GPU结构图,X数字越大,集成的Slice和Unslice芯片更多,能力越强,价格也更高。
II. Quick Sync Video(QSV)技术:
QSV是Intel推出的将视频处理任务直接送到GPU上进行专门负责视频处理的硬件模块处理的软件技术。与CPU或通用GPU上的视频编码不同,QSV是处理器芯片上的专用硬件核心,这使得视频处理更为高效。
要了解QSV如何驱动GPU的MFF,首先看官方Intel® Video and Audio for Linux上的图。在介绍QSV之前,提及Intel在FFmpeg上提供的插件,包括ffmpeg-qsv、ffmpeg-vaapi和ffmpeg-ocl。详细描述如下:
· FFmpeg-vaapi提供基于低级VAAPI接口的硬件加速,在VA API标准下在Intel GPU上执行高性能视频编解码器、视频处理和转码功能。
· FFmpeg-qsv提供基于Intel GPU的硬件加速,基于Intel Media SDK提供高性能视频编解码器、视频处理和转码功能。
· FFmpeg-ocl提供基于工业标准OpenCL在CPU/GPU上的硬件加速,主要用于加速视频处理过滤器。
接下来,介绍QSV在ffmpeg2.8及以上版本的支持,经过MSDK、LibVA、UMD和LibDRM。分层进行分析:
· MSDK:Intel的媒体开发库,支持多种图形平台,实现通用功能,可用于数字视频的预处理、编解码和不同编码格式的转换。源码地址为Intel® Media SDK,在Linux平台上编译使用。
· VA-API:Video Acceleration API,提供类unix平台的视频硬件加速开源库和标准。Intel源码地址在Intel-vaapi-driver Project,在Linux平台上使用。
· UMD:User Mode Driver的缩写,指VA-API Driver。Intel提供了两个工具:intel-vaapi-driver 和 intel-media-driver,推荐使用后者。
· LibDRM:Direct Rendering Manager,解决多个程序协同使用Video Card资源问题,提供一组API访问GPU。与VA-API,LibDRM是一套通用的Linux/Unix解决方案。
· Linux Kernel:Intel的Kernel是i driver,描述了libDRM和Kernel Driver之间的关系。
至此,整个关系图较为清晰。
III. FFMPEG+QSV解码:
QSV硬解的任务主要包括:
关于3-4步操作的详细实现,底层库会帮助完成。但作为一个优秀的工程师,研究FFMPEG源码依然十分重要。接下来,介绍如何使用FFmpeg API中的h_qsv解码器插件。
提及FFmpeg命令行使用方法,推荐阅读官方资料《QuickSync》或《Intel_FFmpeg_plugins》。
关于示例代码,作者曾遇到许多坑,总结为:多数中文博客不可靠,官方demo最可信。官方代码提供了两份可用:qsvdec.c和hw_decode.c。作者最早使用的是第一段代码,核心部分如下:
然而,这段代码存在问题。测试发现,对于赛扬系列一款CPU,在p视频上MSDK达到fps,理论上h_qsv平台上限也应为fps,但实际测试不到fps。排查后发现是av_hwframe_transfer_data()性能较弱。
最终,与Intel一起解决了性能问题。那么,性能提升方案为何是GPU-COPY技术做Memory-Mapping?
解释GPU和CPU渲染图像的过程,包括坐标系转化、纹理叠加等,仅需了解两点:
后者的数据组织方式能充分利用GPU的并行特性,加速图像处理、渲染。尽管存在一些纹理叠加的技术难题,但性能提升足以补偿。
接下来,解释Memory-Mapping:从Intel CPU架构图中可见,GPU和CPU位于同一芯片上,各自寄存器/缓存区有限,视频数据主要存储在内存上。GPU和CPU的数据组织方式不同,同一帧数据存于内存同一位置,数据格式不同,因此需要做Memory-Mapping。Memory-Mapping相较于Memory-Copy,减少了数据从内存区域A移动到区域B的操作,已经是优化。进一步优化:GPU完成Memory-Mapping以及数据从GPU到内存和CPU的操作。
在av_hwframe_transfer_data()内部,Memory-Mapping由CPU完成,性能受限于CPU,只能并行。修改后,整体性能从不到fps提升至fps,虽然与理想fps仍有差距,但满足性能需求。
据悉,Intel将在FFmpeg 4.3开源出这个解决方案。
写在后面:
了解GPU底层对应用开发人员帮助不大,毕竟了解芯片布线的重新设计、制程工艺提升、GPU-COPY技术的数据I/O提升等,也不能做什么。最终,芯片架构是芯片工程师的事,底层逻辑实现是嵌入式工程师的事。应用开发人员无法做出实质贡献,但作为知识库扩充或休闲阅读,了解也无妨。
希望有机会接触CUDA的编解码,深入学习N卡设计。
感谢因《视频和帧》系列文章结识的朋友,热心指出文章描述不准确的地方。文中如有不严谨之处,欢迎指正。