2.2.1 ASIC的硬件定义
SOC是CPU、GPU、各种加速处理引擎(ASIC)以及接口模块(ASIC)的集成。
智能手机使用电池供电,同时又要提供足够强大的性能。如此苛刻的应用条件,使得智能手机处理器通常都选用集成度非常高的SOC。上图是高通手机SOC处理器骁龙810芯片,可以看到此芯片主要包括:
- 通用CPU:ARM Cortex-A57和Cortex-A53,CPU主要用于运行Android等智能手机操作系统以及APP程序;
- 特定场景处理器:Adreno 430 GPU、Hexagon DSP、ISP、多媒体处理器等,GPU主要用于3D游戏等场景,DSP主要用于传感器算法处理;
- 特定功能子系统:支持4G LTE的通信基带处理、GPS/北斗等的定位模块等;
- WiFi、USB、蓝牙等连接模块;
- 安全处理模块;
- 其他一些外围模块。
于是,手机系统就形成了如下表格的分层:
应用层 | 应用程序 |
---|---|
系统层 | 操作系统Android/iOS等 |
驱动层 | Driver和HAL |
硬件层 | 通用CPU;GPU、DSP、ISP等处理引擎;4G、GPS等子系统;WiFi、USB、蓝牙等连接模块;安全模块;其他。 |
2.2.2 GPU的硬件定义
GPU由数以千计的CUDA核组成,要想对数以千计的CPU内核进行编程,把这么多核的计算性能发挥出来,是非常大的挑战。
GPU编程有一个最重要的约束是在同一个并行线程组里运行的是相同的程序,也称之为“齐头并进”。即使如此,GPU的编程难度依然相当的大。
于是,为了提升GPU编程易用性和快捷性的CUDA编程框架应运而生了。
2006年NVIDIA推出了CUDA,这是一个通用的并行计算平台和编程模型,利用NVIDIA GPU中的并行计算引擎,以一种比CPU更高效的方式解决许多复杂的计算问题。CUDA提供了开发者使用C++作为高级编程语言的软件环境。也支持其他语言、应用程序编程接口或基于指令的方法,如FORTRAN、DirectCompute、OpenACC。
CUDA是NVIDIA成功的关键,它极大的降低了用户基于GPU并行编程的门槛,在此基础上,还针对不同场景构建了功能强大的开发库和中间件,逐步建立了GPU+CUDA的强大生态。
2.3 总结
2.3.1 系统业务逻辑的实现形式,决定了软硬件定义
三类典型的平台:
- CPU,因为是完全细粒度的指令,可以非常灵活的组织出来想要的程序。
- ASIC,ASIC是把系统的业务逻辑固化到硬件中。优势在于,完全定制ASIC实现了最精简的晶体管资源占用,实现最极致的性能。当一个系统功能非常固定,并且未来也不会有非常频繁的更新的情况下,ASIC是几乎最优的选择。
- GPU,则介于CPU和ASIC之间,具有一定性能的同时,具有一定的灵活性。
根据系统业务逻辑的具体实现:
- CPU是一个完全灵活无约束的可编程平台,系统运行于CPU,则说系统是完全软件定义的。也既是说,可以通过软件编程的方式,完全自由的定义自己需要的系统业务逻辑。
- 系统运行于ASIC,则说系统是完全硬件定义的。也即是说,ASIC的整个系统逻辑都是硬件写死的,软件只是一些简单的初始化配置和运行控制。
- GPU,则是介于软件定义和硬件定义之间。
2.3.2 软件依赖于硬件平台而存在
ASIC实现的是整个SOC大系统中的一个子系统,整个子系统的业务逻辑基本上是在ASIC模块硬件中完成(有时候需要控制面软件来控制ASIC模块的运行),因此,其性能相对CPU和GPU较高。
当我们设计一个ASIC硬件模块或加速器的时候,需要提供相应的驱动,如果是要接入OS等标准接口,还需要有一层HAL层负责把不同接口映射到OS的标准接口。应用程序根据ASIC硬件提供的功能接口使用硬件。
GPU平台,硬件的GPGPU提供接口给CUDA,CUDA再提供接口给应用。每一代具体的GPU,给上层提供的是不同的访问接口, CUDA框架有特定的驱动和HAL屏蔽不同GPU的实现细节;并且CUDA为了向前兼容和维护生态,最终映射到标准的库。这些标准的库,提供了标准的接口给上层的CUDA应用程序。
即使CUDA映射成标准的库API接口,CUDA程序依然是要依赖于CUDA提供的接口来设计应用软件。
总结一下,软件依赖于硬件平台存在,体现在两个方面:
- 软件只能根据硬件提供的功能来完成系统实现,系统的业务逻辑是在硬件实现;
- 软件依赖硬件提供的接口访问硬件,硬件提供什么样的接口,软件就使用什么样的接口,主动权在硬件。
3 软件定义硬件
3.1 系统又开始从硬件逐步到软件
上一节我们讲到,系统从起始发展,到逐步稳定,系统的运行平台逐步从CPU演进到ASIC。那么,ASIC是不是所有系统最终的运行平台?
答案是否定的。原因主要如下:
- 软件更新换代很快。新的热点技术层出不穷,已有的技术领域的更新迭代速度仍在快速增加。硬件的迭代周期过长,无法跟上软件迭代的节奏。
- 定制的ASIC设计,把所有功能都在硬件实现。在复杂的云计算、自动驾驶等场景,芯片公司对用户的场景理解可能不够深入,会导致设计偏差。另一方面,也会限制用户自身的主观能动性,让用户有想法也很难在ASIC平台去实现自己想要的功能。
- ASIC因为功能固定,为了适配更多场景,确保芯片的大量出货,势必需要实现功能超集。例如,某ASIC芯片支持10个功能,但实际用户场景,都是只需要2-3种功能。这样,ASIC实现实际上也是低效的。并且,这些功能因为紧耦合的缘故,系统复杂度反而更高。
这样,在许多场景,我们根据实际的场景需求,除ASIC,也开始选择DSA、FPGA、GPU甚至CPU等处理引擎。
3.2 软件定义网络
最典型的一个案例就是SDN(Software Defined Network)的发展。经过几十年的发展,网络芯片已经演进到了完全ASIC的实现,这意味着基于ASIC芯片的网络设备其功能是确定的,用户只能根据厂家实现的确定功能来使用网络设备。
然而,随着云计算、4G/5G移动通信等的发展,新的网络协议和网络功能层出不穷,纯ASIC实现的网络系统遇到了挑战。
如上图所示,IETF(Internet Engineering Task Force,互联网工程任务组)的RFC(Request for Comments,请求意见稿,即网络协议)数量一直在爆炸式的增长,应用于各种新型网络场景的新协议层出不穷。但是,传统的网络处理芯片都是封闭的、特定的设计,用于特定协议处理。想要增加新的协议非常困难,并且对新协议的支持受到不同供应商的约束。定制的网络处理芯片,对新协议的支持不足以及缺乏有效的灵活性,这使得要想在网络系统增加新的功能非常困难,限制了客户的网络创新能力。
客户希望能够快速便捷的对网络进行配置和管理;客户希望能够快速的进行网络协议创新。这样,ASIC的功能固定越来越成为网络创新的约束。于是,SDN开始了两个方面的创新:
- 第一步,网络控制面和数据面分离,控制面可编程。把网络控制面从数据面分离处理,形成了控制面可编程的Openflow协议。
- 第二步,进一步的,网络数据面也可以编程,用户可以定义自己的协议。形成了数据面可编程的P4语言和P4交换机相继出现。
3.2.1 运行于CPU的软件虚拟交换机
OVS(Open Virtual Switch)是Apache 2许可下的开源的软件交换机。OVS的目标是实现一个生产环境的交换机平台,支持标准管理界面,并为程序扩展和控制开放转发功能。OVS非常适合在VM环境中用作虚拟交换机,除了向虚拟网络层公开标准控制和可见性接口之外,它还旨在支持跨多个物理服务器的分发。OVS支持多种基于Linux的虚拟化平台,包括Xen、KVM等。
最新的OVS版本支持以下功能:
- 具有主干和接入端口的标准的802.1Q VLAN模型;
- NIC绑定在上行交换机上,可以支持LACP也可以不支持;
- 通过NetFlow,sFlow®和镜像来增强可视性;
- QoS(服务质量)配置以及策略;
- Geneve, GRE, VxLAN, STT和LISP隧道;
- 802.1ag连接故障管理;
- OpenFlow 1.0以及众多扩展;
- 支持C和Python的事务配置数据库;
- 基于Linux内核的高性能转发模块。
如图,OVS答题可以分为三层:
- 管理层,即:ovs-dpctl、ovs-vsctl、ovs-ofctl、ovsdb-tool。
- 业务逻辑层,即:vswitchd、ovsdb。
- 数据处理层,即:datapath。
3.2.2 数据面可编程的网络交换机DSA
上图为PISA(Protocol Independent Switch Architecture,协议无关的交换架构)架构交换机的流水线,PISA是一种支持P4数据面可编程包处理的流水线引擎架构,通过可编程的解析器、多阶段的可编程的匹配动作以及可编程的逆解析器组成的流水线,来实现数据面的编程。这样可以通过编写P4程序,下载到处理器流水线,可以非常方便的支持新协议的处理。
当实现了完全可编程的流水线之后,在P4工具链的支持下,就可以通过P4编程的方式来实现自定义的流水线,来达到对自定义协议的支持。
如图所示,P4定义的Parser程序会被映射到可编程的解析器,数据、包头定义、表以及控制流会被映射到多个匹配动作阶段。图 6.25中把L2处理、IPv4处理、IPv6处理以及访问控制处理分别映射到不同的匹配动作处理单元进行串行或并行的处理,来实现完整的支持各种协议的网络包处理。
3.3 软件定义接口:Virtio
Virtio旨在提供一套高效的、良好维护的通用的Linux驱动,实现虚拟机应用和不同Hypervisor实现的模拟设备之间标准化的接口。Virtio作为类虚拟化的I/O设备接口,广泛应用于云计算虚拟化场景,某种程度上,Virtio已经成为事实上的I/O设备的接口标准。
因为软件定义了标准化的Virtio接口,因此,如上图所示,在SmartNIC和DPU中,offload虚拟化和Workload的最关键部分就是要把Virtio硬件化。
如上图所示,站在虚拟化角度,把Virtio卸载,可以看做是从软件到硬件。但是,如果从硬件接口的角度,从一个完全硬件定义的接口(例如NV自定义的SR-IOV接口)过渡到软件定义的接口(Virtio接口),则可以算是从硬件到软件。
3.4 可跨平台的软件定义:Intel oneAPI
英特尔oneAPI是一个开放、可访问且基于标准的编程系统,支持开发人员跨多种硬件架构参与和创新,包括 CPU、GPU、FPGA、AI 加速器等。这些处理引擎具有非常不同的属性,因此用于各种不同的处理——oneAPI试图通过将它们统一在同一个模型下来简化这些操作。
即使在今天,开发人员面临的一个持续问题是我们日益数字化的世界提供的编程环境的数量。不同的编程环境使代码重用等节省时间的策略失效,并成为软件开发人员的真正障碍。作为其软件优先战略的一部分,英特尔在 2019 年的超级计算活动中推出了oneAPI。该模型标志着英特尔的雄心是拥有统一的编程框架作为限制专有编程平台的解决方案。oneAPI 使开发人员能够在不厌倦使用不同语言、工具、库和不同硬件的情况下工作。
Intel oneAPI可以实现:设计一套应用,根据需要,非常方便的把程序映射到CPU、GPU、FPGA或者AI-DSA/其他DSA等不同的处理器平台。
3.5 扩展:软件定义“一切”
软件定义是一个非常宏大并且非常热点的话题,除了软件定义网络之外,还有很多软件定义的热点领域:
- 软件定义存储,是一种能将存储软件与硬件分隔开的存储架构。不同于传统的网络附加存储(NAS)或存储区域网络(SAN)系统,SDS一般都在行业标准系统上执行,从而消除了软件对于专有硬件的依赖性。
- 软件定义数据中心,把数据中心基础设施通过抽象化、资源池化以及自动化来实现基础设施即服务(IAAS)。软件定义的基础设施可让IT管理员使用软件定义的模板和API轻松配置和管理物理基础设施,以定义基础设施配置和生命周期运维,并实现自动化。
- 软件定义无线电,是一种无线电广播通信技术,它基于软件定义的无线通信协议而非通过硬连线实现。频带、空中接口协议和功能可通过软件下载和更新来升级,而不用完全更换硬件。
- 软件定义汽车,通过软件实现新的车载体验和功能,并通过无线 (OTA) 提供更新和服务。从而使得汽车从高度机电一体化的机械终端,逐步转变为一个智能化、可拓展、可持续迭代升级的移动电子终端。
软件定义存储和软件定义无线电还主要是技术的范畴,而软件定义数据中心和软件定义汽车,则是把软件定义的思路和理念更加深化和拓展,应用于更广阔的领域。
4 软硬件相互定义
4.1 软件定义也存在一些挑战
4.1.1 基于CPU的摩尔定律失效
软件定义XX,最本质的做法还是把整个系统重新从硬件实现变成偏软件的实现。随着这势必对CPU的性能提出了更高的要求。
然而,如上图所示,随着CPU的性能提升逐渐停滞,已经无法满足数字经济时代对算力持续提升的要求。
因此,还是要再轮回,“硬件”加速。
4.1.2 DSA只解决了部分问题
支持P4的网络数据面可编程引擎,属于DSA的范畴,专门用于网络包处理的加速,性能跟ASIC相当,但其具有非常好的软件可编程能力。
标准的P4程序,有P4前端编译器把P4程序编译成一个中间态的程序(类似Java编译器)。然后特定硬件实现的后端编译器负责把中间态的程序映射到具体的硬件实现(有点像Java虚拟机,但P4是静态)。
P4 DSA引擎预先配置好P4程序之后,P4-DSA就成了执行特定协议处理的网络包处理引擎。然后需要和已有的网络程序进行适配,实现网络任务的数据面offload。
P4的整个系统栈跟之前CPU、GPU、ASIC最大的不同在于先定义了标准的P4,然后各厂家根据标准的P4去实现各自不同的P4处理引擎。
CPU虽然现在有三大架构(x86、ARM和RISC-v),但就具体的架构而言,其定义的ISA是非常明确的。特别是在RISC-v生态下,大家遵循一致的ISA,已有的程序可以非常方便的在不同Vendor的RISC-v CPU上运行。
但是在DSA领域,目前还看不到这一点。
可以说,当前所有的DSA,包括P4 DSA,都还没有实现接口的软件定义,接口依然是硬件定义的,可以说是不完全的软件定义XX。
4.2 更理想的跨平台框架
我们把oneAPI模型框架再增强一下,如上图所示。这样,跨平台,不仅仅是在CPU、GPU、FPGA和DSA的跨平台,更在于是不同Vendor的不同处理器的跨平台。
4.3 接口的软硬件互相定义
不管是软件定义硬件还是硬件定义软件,接口(这里接口是泛指,ISA是接口,IO设备的数据访问接口也是接口,GPU等加速器呈现的访问接口也是接口)都是非常关键的角色,因为是通过接口给对方呈现自己的功能和如何访问。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-n2cM7EoE-1713067926493)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!