当前位置: 首页 > 编程日记 > 正文

FPGA技术的未来发展:谁与AI平分秋色

640?wx_fmt=jpeg

参加 2019 Python开发者日,请扫码咨询 ↑↑↑


作者 | 老石

来源 | 老石谈芯(公众号id:gh_5ce1d0cb1568)

责编 | Jane


任何科学技术的发展和进步都离不开两个主要的推动力量,一个是相关领域各大公司的研发,另一个就是各大高校与科研院所的科学研究。这两者往往是相互补充、相互促进的关系,既能涵盖短期的实用性研究,又有长期技术难题的攻关与突破。

 

这样的技术发展模式,FPGA行业也不例外。除了英特尔、赛灵思等大公司的研发投入之外,世界上各大顶尖高校对于FPGA的研究也在不断帮助FPGA技术取得新的成就。

 

在诸多决定着FPGA技术发展的新成就里,那些最为突出的成果,也就是所谓的“皇冠上的明珠”,都会集中发表在一年一度的“FPGA国际研讨会”上(简称ISFPGA)。从1993年举办至今,ISFPGA一直是FPGA领域的旗舰级顶会,没有之一。在ISFPGA上发表的文章,都代表着FPGA最前沿和最优秀的研究成果,也被业界人士看成是预测FPGA今后发展方向的风向标。


在2019年2月结束的ISFPGA会议上,再一次涌现出了诸多崭新的研究成果。从整体上看,业界的研究方向主要集中在两个方面:


  • 一个是和人工智能和机器学习相关的各个领域,比如FPGA微架构、FPGA编程工具与编程语言,以及FPGA在AI的各种应用等。

  • 另一个是FPGA的高层次综合(High-Level Synthesis,HLS),也就是使用高层语言,如C++/OpenCL/Python等,对FPGA进行有效的编程和使用。


其中,这届会议中与AI相关的文章有8篇,与高层次综合相关的文章有6篇,占会议接收的全部24篇论文的超过一半。

 

老石在之前详细介绍过赛灵思在这次会议上发表的有关ACAP架构的论文。在今天的这篇文章中,老石又挑选了另外五篇具有代表性的论文,为各位逐一点评和解析。同时,我也会简单介绍论文主要作者的背景和代表性研究,方便各位把握当前最新的FPGA发展动态。


一、FPGA微架构:低精度乘加单元


640?wx_fmt=png


  • 一句话总结


随着软硬件技术的不断发展,DNN算力的瓶颈已逐渐从内存带宽转向乘加(MAC)操作效率,因此本文提出了面向英特尔FPGA的全新低精度乘加单元微架构。


  • 对行业发展的影响和意义


显著提升了FPGA低精度乘加操作的性能与资源利用率,是针对DNN应用的“杀手级”微架构创新。提出的新架构专为英特尔FPGA设计,预计会带来巨大的竞争优势。


  • 技术细节


本论文来自多伦多大学的Vaughn Betz课题组。多伦多大学的FPGA研究一直被公认是世界顶尖水平,归功于这里的一群大牛教授,比如Jonathan Rose, Vaughn Betz, Jason Anderson, Paul Chow等。他们的研究基本涵盖了FPGA的各个层面,包括架构、工具、应用等各个领域。


他们很多人都曾经担任过FPGA公司高管,有多年的工业界一线研发经历,转向学术界后仍然与工业界结合非常紧密,这使得他们的研究有着极强的实用性,对于FPGA行业发展有着很重要的推动作用。


640?wx_fmt=jpeg


这篇论文研究的大背景,是当前在DNN中使用低精度算术运算可以取得极大的性能提升。DNN中的两类核心算法:CNN和LSTM,都可以在很大程度上受益于低精度的乘加运算。为了实现这种低精度的DNN数据通路,FPGA往往是超越CPU和GPU的第一选择,因为它在灵活性和性能等方面有着很好的平衡。例如,微软的脑波项目就使用了自定义的低精度(8~9位)浮点数表示。

 

另一方面,作者指出随着FPGA器件和云端部署等技术的发展,内存带宽已经逐渐不再是DNN的算力瓶颈,取而代之的是单周期可以完成的乘加操作数量,这其实是一个非常新颖的观点。

 

作者发现,传统的FPGA架构在执行乘加操作时,会浪费大量逻辑资源,进而导致性能无法达到最优。因此本文提出了三种针对英特尔Stratix 10 FPGA的微架构创新,以提升DNN里乘加操作的性能和资源使用率。例如,一种方法是在传统ALM结构里增加一条额外的进位链,如下图所示。这样避免了使用多余的ALM完成最后一级加法操作,从而节省了逻辑资源,也减少了ALM间的传输延时。


640?wx_fmt=png


使用这种方法,乘加操作的平均延时会缩短21%,乘加单元的面积会减小35%。文中提出的另外两种微架构在这里不再详述,这篇文章的文笔很棒,可读性很强,推荐有兴趣的读者看看。


二、名为HetroCL的可重构计算编程语言框架


640?wx_fmt=png


  • 一句话总结


基于Python的FPGA编程模型与编译工具,为DNN应用而优化。


  • 对行业发展的影响和意义


降低了FPGA的编程难度,有效解决了一些当前高层次综合存在的问题与痛点。相比传统的FPGA开发与编程模型,这个新提出的名为HetroCL的领域专用语言和编程框架兼顾了性能与开发效率,使开发者可以专注于算法实现,而无需考虑FPGA底层逻辑的实现与优化。


  • 技术细节


这篇文章由康奈尔大学的张志如副教授、以及UCLA的丛京生教授及两位的团队合作完成,并获得了本次大会的最佳论文奖。这两位也是FPGA领域的顶级学者,主要专注于FPGA的高层次综合等领域,而丛教授也是张教授的博士导师。在博士研究期间,二人创办了AutoESL公司,并随后被赛灵思收购,其主要软件产品也正是赛灵思Vivado HLS的前身。


640?wx_fmt=png


FPGA的高层次综合(High-Level Synthesis)指的是将诸如C++、OpenCL等高层语言,通过特定编译工具直接转化成FPGA上可以运行的硬件代码。有关HLS的研究一直是学术界和工业界的研究热点,英特尔和赛灵思都有各自的HLS工具和开发套件。

 

然而,使用HLS并没有想象中那么简单。虽然算法和模型可以使用高层语言编写,但为了达到最优的硬件性能,开发者仍然需要清楚的了解底层FPGA的硬件架构,并通过特殊的预处理指令指导HLS编译器生成期望的硬件结构。这也使得HLS在很多时候并没有体现出它的便利性优势。

 

例如,一个简单的点积函数的HLS描述如下图所示,可以看到算法部分包含很多与底层硬件相关的#pragma,用以指导特定的编译器行为,严重影响开发效率与代码可读性。


640?wx_fmt=png


为了解决这个问题,这篇论文提出了一种基于Python的领域专用语言(Domain Specific Language),名为HeteroCL。它的最主要特点是能将算法描述与底层硬件结构进行完全解耦,使得算法设计师不需要关心底层硬件的数据类型、计算单元实现以及存储器架构优化等,如下图所示。


640?wx_fmt=png


关于HeteroCL的语法和语义在这里不再详述,有兴趣的读者可以自行查阅论文原文。


三、使用P4语言编程FPGA


640?wx_fmt=png


  • 一句话总结


使用高层语言“P4”构建网络算法和应用,并直接映射到FPGA上执行。


  • 对行业发展的影响和意义


这是一种快速开发FPGA的新方法。与基于RTL的传统FPGA开发方法、以及基于C/C++的高层次综合HLS相比,这种方法在性能和灵活性达到了很好的平衡。P4适用于诸如网络数据包处理等算法和应用,使用者不需要掌握Verilog或VHDL等硬件描述语言,就可以快速完成网络算法的建模与FPGA硬件实现。


  • 技术细节


这篇论文的作者来自斯坦福大学、赛灵思和剑桥大学,作者之一的Nick McKeown教授就是P4语言的发明者。这篇论文主要介绍了如何使用P4编写计算机网络算法,并如何通过新提出的软件工具将其自动映射到FPGA上。

 

P4语言的全名为“Programming Protocol-independent Packet Processors”。与C/C++/Python等通用语言不同,P4是一种领域专用语言,主要被设计用来描述各类网络算法与应用,如数据包处理、分类、查找、路由等等。顾名思义,P4语言的主要设计目标有以下三点:


  • 协议无关:即P4语言及其底层硬件可以支持各类网络协议

  • 现场可编程:即部署后仍然具有可编程能力

  • 可扩展:即P4可以在多种硬件平台上使用


与ASIC相比,FPGA在性能上有着大约一个量级的差距。即便如此,FPGA有着很好的灵活性,能够实现多种网络算法并在其中灵活切换,因此被广泛用于网络数据处理的场合,例如之前讲过的智能网卡等等。

 

然而,FPGA对于非硬件工程师而言有着很大的开发难度,因此使用P4这种领域专用语言进行FPGA的高层次开发就成了十分自然的考虑。

 

这篇论文提出的开发流程如下图所示。简单来说,就是将P4程序,借助赛灵思的P4和SDNet编译器生成底层的Verilog模块,然后映射到名为“NetFPGA”的参考设计上。


640?wx_fmt=png


在生成Verilog模块的过程中,使用了定义好的模块库和元组。因此这种方法本质上是一种FPGA虚拟化方法,即在FPGA底层硬件之上,增加了一层虚拟的模块层,并可以通过P4语言直接映射。



四、将DNN模型映射到FPGA云的开源架构


640?wx_fmt=png


  • 一句话总结


一个开源的工具链,用于将训练完成的CNN模型映射到亚马逊AWS FPGA云服务上运行。


  • 对行业发展的影响和意义


这篇论文与微软脑波项目(Project Brainwave)完成的工作非常类似,不同之处在于采用了高层次综合HLS的方法,针对公有云的FPGA服务,并且开源。因此为从事云端DNN加速研究的相关人员和机构提供了应用平台与经验借鉴。


  • 技术细节


这篇论文的作者来自新加坡和美国伊利诺伊厄巴纳-香槟分校(UIUC),作者之一来自UIUC的陈德铭教授是硬件加速器研究领域的知名学者。

 

这篇论文与微软脑波项目完成的目标非常类似,只是实现方法有所不同。之前介绍过,脑波项目将训练好的DNN模型转化成数据流图表示,然后根据单一FPGA的资源情况,对数据流图进行拆分,并映射到FPGA的软核NPU上。


在这篇论文中,直接使用HLS工具对DNN模型进行综合,见下图,这在很大程度上减少了开发的难度,但与脑波方案相比,不可避免的会有较大的性能差距。同时,这个工作只支持Caffe,而不支持其他DNN框架。


640?wx_fmt=png


在脑波项目中,FPGA基础架构是源于Catapult项目的大规模FPGA互联和资源池,而本论文主要面向的是亚马逊AWS-F1实例的FPGA公有云。这样的好处是能为广大AWS开发者或其他希望进行FPGA DNN加速的用户提供参考平台和经验借鉴,但同样的也会有明显的性能限制。

 

相比CPU而言,使用FPGA对DNN进行硬件加速仍然可以取得可观的性能提升。比如在这篇论文中,针对不同的DNN模型,使用FPGA可以取得47倍~104倍的加速性能。


五、多线程代码的高层次综合工具:EASY


640?wx_fmt=png


  • 一句话总结


使用形式化(formal)方法,有效减少高层次综合多线程代码时使用的内存仲裁器数量与逻辑复杂度。


  • 对行业发展的影响和意义


极大的提高了FPGA的高层次综合工具的性能,尤其是对多线程代码有了更好的支持。


  • 技术细节


这篇论文由伦敦帝国理工大学的George Constantinides教授团队和多伦多大学的Jason Anderson教授团队合作完成。这两位都是FPGA学术界鼎鼎大名的人物,George Constantinides有着很深的数学功底,研究方向主要集中在针对FPGA内存优化的高层次综合,以及和数学相关的FPGA字长优化,还有近年兴起的近似计算等领域。


帝国理工大学在FPGA研究领域也处于世界顶尖水平,除了George之外,还有Peter Cheung和Wayne Luk两位华裔教授,这两位对于现代FPGA技术的发展做出了举足轻重的贡献,本文不再展开。


640?wx_fmt=png


这篇论文研究的主要问题是,当对多线程代码进行FPGA的高层次综合时,多个线程之间对内存的读写需要额外的仲裁机制,这主要用来判断某块内存会被哪些线程所访问。而这个仲裁机制在硬件实现上会有很大的额外开销,对性能也有很大的消极影响,如下图所示。


640?wx_fmt=png


不过作者注意到,线程往往不会访问所有内存块,因此很多情况下仲裁器不需要支持全部的线程-内存块映射,这样就大大减少了仲裁器的逻辑复杂度,从而提高了系统性能。

 

为了判断某个线程是否会访问某个内存块,作者使用了形式化方法,通过将多线程代码转换成一种单线程的形式化描述语言Boogie,并通过形式化工具证明某个线程与内存块的访问关系,这样就能完全确定仲裁器需要支持的线程与内存块的映射。

 

这个思路十分简洁但有效,它的完整流程图如下图所示。这篇文章使用这种方法取得了高达39%的性能提升,以及高达87%的面积缩减。


640?wx_fmt=png


六、结语


展望2019年FPGA技术的发展趋势,人工智能与高层次综合必将是两大值得关注的重点领域。随着新技术的不断涌现,FPGA的易用性和性能都将得到极大提升。在这其中,人工智能和数据中心将会是作者持续关注的重中之重。

(注:本文仅代表作者个人观点,与任职单位无关。)


--【本文完】--

(*本文为AI科技大本营转载文章,转载请联系作者,观点属作者个人)


推荐阅读:

  • 顶会论文9篇,又斩获百度奖学金!哈工大NLP“新生代”正崭露头角

  • Google用更少标签生成图像,还提出一个用于训练评估GAN的库

  • 如何用TF Object Detection API训练交通信号灯检测神经网络?

  • Google首页玩起小游戏,AI作曲让你变身巴赫

  • 特斯拉起诉小鹏汽车员工窃取商业机密,何小鹏回应

  • 提升效率,这十个Pandas技巧必不可少!

  • 超常用的Python代码片段 | 备忘单

  • 工作量不断增加的微软Azure,正缩小与亚马逊AWS的差距

  • 理工男的网红生意, 6000万月活50万条日更的背后, 内容链还能这样操作?

  • 曝光!月薪 5 万的程序员面试题:73% 人都做错,你敢试吗?

640?wx_fmt=png

点击“阅读原文”,查看历史精彩文章。

相关文章:

一体化设计让容灾变简单

容灾很难实现吗?容灾不仅包括技术方面的问题,而且涉及数据保护策略、投入产出比等方面的问题。从这个角度讲,对于大多数的中小型用户来说,容灾的实施确实比较困难。不过,爱数软件副总裁李基亮认为,容灾的实…

深度研究自然梯度优化,从入门到放弃 | Deep Reading

参加 2019 Python开发者日,请扫码咨询 ↑↑↑作者 | Cold Marie Wild译者 | 刘畅责编 | Jane出品 | AI科技大本营(公众号id:rgznai100)【导语】根据自然梯度的支持者提出一种建议:我们不应该根据参数空间中的距离来定义…

【Qt】QtCreator中关于Style Plugin Example没有效果的修改方法

1、问题描述 在QtCreator练习QStylePlugin的例子时,没有效果,原因是QPalette使用不当造成。 详见:https://blog.csdn.net/u010168781/article/details/88250451 2、解决方法 解决方法很简单,我们只是为了演示QStylePlugin的效果,然而QPushButton不能通过QPalette来改变…

最大公约数和最小公倍数的欧几里得算法

最大公约数的算法竟然如此简单&#xff0c;不说了&#xff0c;见代码 #include <stdio.h> int gcd(int a, int b) { if(b 0) return a; return gcd(b, a%b); } 简化后如下&#xff1a; int gcd(int a, int b) { return (b0 ? a: gcd(b, a%b)); } 而最小公倍数的也就为&a…

如何查看CISCO FWSM上ACL分区的空闲资源

在CISCO防火墙模块上有的时候在做策略NAT的时候会碰到如下的错误信息&#xff1a;输入:nat (inside) 1 access-list XYZ错误提示:ERROR: Unable to add Policy Rulesaccess-list XYZ 可以在配置的ACL中显示尤其在添加一些基于策略的NAT的时候&#xff0c;因为其可能会产生大量的…

强烈推荐一款Python可视化神器!

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑翻译 | Lemon来源 | Plotly出品 | Python数据之道 &#xff08;ID&#xff1a;PyDataRoad&#xff09;Plotly Express 入门之路Plotly Express 是一个新的高级 Python 可视化库&#xff1a;它是 Plotly.py 的高级封装&am…

【Qt】QIcon::fromTheme:从系统主题中获取图标

1、简介 函数原型 QIcon QIcon::fromTheme(const QString &name) QIcon QIcon::fromTheme(const QString &name, const QIcon &fallback)上述两个函数可以从系统主题中获取图标&#xff0c;后者可以在主题中找不到图标时&#xff0c;再使用自己定义的图标&#x…

检验EIGRP

路由器必须与其邻居建立邻接关系&#xff0c;EIGRP 才能发送或接收更新。EIGRP 路由器通过与相邻路由器交换 EIGRP Hello 数据包来建立邻接关系。 使用 show ip eigrp neighbors 命令来查看邻居表并检验 EIGRP 是否已与其邻居建立邻接关系。对于每台路由器&#xff0c;您应该能…

【Qt】通过QtCreator源码学习Qt(十):多国语言支持

1、获取系统支持的语言 QStringList uiLanguages;uiLanguages = QLocale::system().uiLanguages();2、从设置中获取想要显示的语言,尝试覆盖默认的 QString overrideLanguage = settings->value(QLatin1String("General/OverrideLanguage")).toString();if (!ove…

吴恩达最新斯坦福课程《深度学习》全部视频已送达,请签收!

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑责编 | Jane出品 | AI科技大本营&#xff08;公众号id&#xff1a;rgznai100&#xff09;【导语】2018 年秋季&#xff0c;吴恩达教授在斯坦福新开了一门 CS230《深度学习》课程&#xff0c;近期&#xff0c;该课程的视频…

mysql 5.7 修改root 密码

前言 MySQL5.7为了加强安全性&#xff0c;yum 安装后为root用户随机生成了一个密码&#xff0c;同时修改root密码上&#xff0c;也增加了一些校验&#xff0c;会报 Your password does not satisfy the current policy requirements 错误。 安装 rpm -ivh http://repo.mysql.co…

2-7-PatchesAdministration

/cdrom/sol_10_305_x86/s2/Solaris_10/Product 下是包含系统自带的补丁包 该目录下的包需要复制到/var/spool/pkg目录下再使用pkgadd才可以被安装cp -r SUNWi15cs /var/spool/pkgpkgadd SUNWi15cs2-7系统补丁管理补丁类型&#xff1a;standard patchesrecommended patchesfirmw…

【Qt】通过QtCreator源码学习Qt(十一):Utils::Icon,根据不同主题、不同状态变换图标

1、简介 在QtCreator中Utils::Icon封装的图标可以根据主题变换,还可以设置不同状态下的图标的颜色。不同状态下的颜色变换,由QIcon::addPixmap函数实现: void QIcon::addPixmap(const QPixmap &pixmap, Mode mode = Normal, State state = Off)2、源码分析 src/libs/…

Python_赋值和深浅copy

Python中赋值和深浅copy存储变化     在刚学python的过程中&#xff0c;新手会对python中赋值、深浅copy的结果感到丈二和尚。经过多次在网上查找这几个过程的解释说明以及实现操作观察&#xff0c;初步对这几个过程有了浅显的认识。以下内容仅是我在学习过程中遇到的问题&…

萌新养成 | AI科技大本营实习生招募计划

金三银四跳槽季这个时候需要做好准备的可不仅仅只有在职或者离职的萝卜尚未毕业的萌新也需要提早做准备了毕竟把自己修炼成一个优秀的萝卜也不是一件容易的事所以&#xff0c;放下你找对象、刷副本、世界游的想法加入我们为你量身定制的人才培养计划加入营长的团队&#xff0c;…

踏上云旅程 存储准备好了吗

在云计算的概念刚出现时&#xff0c;人们习惯将原始数据存在本地&#xff0c;而将备份数据放到云中。随着云计算技术和应用逐渐走向成熟&#xff0c;人们可能会把原始数据存在云中&#xff0c;而把备份数据放在本地。全球存储网络工业协会&#xff08;SNIA&#xff09;主席Wayn…

UCloud与NTT达成合作,提供可靠跨地域混合云服务

近日&#xff0c;UCloud宣布与NTT Communications东亚地区总部NTT Com Asia (以下简称“NTT Com Asia”) 达成合作伙伴协议。双方将发挥各自优势&#xff0c;通过UCloud云服务与NTT Communications企业级 Enterprise Cloud 服务互联互通&#xff0c;为国内企业以及进入中国的跨…

ICCV 2019论文投稿数破纪录,中科院、清华名列前茅,苹果垫底

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;昨日&#xff0c;作为计算机视觉领域里顶级会议这一的 International Conference on Computer Vision &#xff08;ICCV&#xff09;公布了 2019 年…

【linux】在CentOS7上更改端口号时报错:Job for sshd.service failed because the control process exited with error

1、问题描述 在在CentOS7上更改端口号时报错&#xff1a; Job for sshd.service failed because the control process exited with error code.See “systemctl status sshd.service” and “journalctl -xe” for details. 2、修改ssh端口号的方法 修改&#xff1a;$ sudo …

硅谷风投押注计算机网络安全市场

今天&#xff0c;新浪转载了一篇外媒报道&#xff0c;称随着一系列安全事件的集中爆发&#xff0c;风险投资家们业从计算机安全领域看到了机会&#xff0c;希望加大对这一市场的投资。 文章最后指未来几年可能上市的公司包括&#xff1a;梭子鱼、Proofpoint、Palo Alto Network…

Tensorflow框架是如何支持分布式训练的?

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | 杨旭东转载自知乎《算法工程师的自我修养》专栏Methods that scale with computation are the future of AI. —Rich Sutton, 强化学习之父大数据时代的互联网应用产生了大量的数据&#xff0c;这些数据就好比是石…

【linux】SELinux工具:semanage的安装和使用

1、安装 在ubuntu14.04上安装 sudo apt-get install policycoreutils在CentOS7上安装 sudo yum -y install policycoreutils-python2、semanage命令行参数 $ semanage --help semanage用于配置SELinux策略的某些元素&#xff0c;而不需要对策略源进行修改或重新编译。 位置…

在阿里云Kubernetes容器服务上打造TensorFlow实验室

简介 Jupyter notebook是强大的数据分析工具&#xff0c;它能够帮助快速开发并且实现机器学习代码的共享&#xff0c;是数据科学团队用来做数据实验和组内合作的利器&#xff0c;也是机器学习初学者入门这一个领域的好起点。 而TensorFLow是深度学习和机器学习最流行的开源框架…

PagedGeometry 笔记03

1. 创建草 PagedGeometry *grass new PagedGeometry(mCamera,50); grass->addDetailLevel<GrassPage>(100); // 在100单位内绘草。 GrassLoader *grassLoader new GrassLoader(grass); grass->setPageLoader(grassLoader); grassLoader->setH…

【Qt中文手册】QSortFilterProxyModel

1、说明 QSortFilterProxyModel类继承自QAbstractProxyModel是一个代理类,存在于另一模型Model和视图View之间,将另一个模型排序或者过滤后在视图上显示。 2、简单示例 没有使用代理的项视图模型代码如下 QTreeView *treeView = new QTreeView; MyItemModel *model = new…

吴恩达的Landing.ai又迎来一位AI大牛

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;近日&#xff0c;吴恩达在Twitter发消息称&#xff0c;欢迎王冬岩加入Landing.ai&#xff0c;负责公司的客户对接及战略伙伴合作&#x…

synchronize

1。synchronize方法的产生与vcl的局限性有关,因为vcl控件在同一时刻只能被单线程访问&#xff0c;如果多个线程同时访问vcl,vcl会出现问题。所以问了安全地访问vcl,Tthread类提供了一个方法叫synchronize&#xff0c;他可以让线程中的方法在主线程中执行&#xff0c;所以我们可…

Google BBR拥塞控制算法背后的数学解释 | 深度

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | 赵亚转载自CSDN网站杭州待了一段时间&#xff0c;回到深圳过国庆假期&#xff0c;无奈温州皮鞋?厂老板过节要回温州和上海&#xff0c;不在深圳&#xff0c;也就没有见着&#xff0c;非常遗憾&#xff01;国庆节…

【Linux】linux使用mplayer播放摄像头

1、安装mplayer 1.1 在ubuntu上安装mplayer sudo apt-get install mplayer1.2 在Centos7上安装mplayer 安装软件包&#xff1a; sudo yum localinstall http://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm安装mplayer&#xff1a; sudo yum ins…

leetCode刷题 2. 两数相加

原题链接&#xff1a; leetcode-cn.com/problems/ad… 题目描述 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储&#xff0c;它们的每个节点只存储单个数字。将两数相加返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 示例&…