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的下载的arduino源码空闲情况动态分配,并通过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,java练手的源码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卡设计。
感谢因《视频和帧》系列文章结识的朋友,热心指出文章描述不准确的地方。文中如有不严谨之处,欢迎指正。
2024-11-29 22:232241人浏览
2024-11-29 22:192404人浏览
2024-11-29 21:452515人浏览
2024-11-29 21:431836人浏览
2024-11-29 21:231485人浏览
2024-11-29 21:18918人浏览
今天上午,第二届海峡两岸食品交易会暨第五届闽台泉州)食品交易会以下简称食交会)在晋江SM国际展览中心及佰翔世纪酒店开幕。除了来自世界各地的美食之外,科技创新也是本次展会的一大亮点。展会规模日益提升据悉
中国消费者报南宁讯兰晓孟记者顾艳伟)今年以来,广西壮族自治区龙胜县市场监管局着力强化医疗器械经营者的诚信守法经营意识,提高器械安全管理水平,以分级监管制+“诚信经营”、信用建档