【星空介绍页源码】【海口商城源码】【呼吸检测源码】copy 源码剖析

来源:oa源码论坛

1.如何学好C++呢?源码
2.xfs文件系统:layout与架构、源码分析
3.视频和视频帧:Intel GPU(核显)的剖析编解码故事

copy 源码剖析

如何学好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的ios改源码说明即出自该文。

       最后,总结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卡设计。

       感谢因《视频和帧》系列文章结识的朋友,热心指出文章描述不准确的地方。文中如有不严谨之处,欢迎指正。

文章所属分类:热点频道,点击进入>>