软硬件融合,是对这些矛盾体之间相互作用的一个概括的叫法。软硬件融合的过程,就是不断“权衡”矛盾的过程。
1 个体和系统
凯文·凯利在他的《失控》中提到了一个非常有意思的概念“涌现”,简单来说,就是众多个体的集合会涌现出超越个体特征的某些更高级的特征。例如,通过把个体的计算机连接到一个网络,“涌现”出互联网这个新兴事物,深刻的改变了我们生活的方方面面。
谷歌通过搜索引擎链接了所有的互联网内容,成为互联网事实上的入口;脸书和腾讯通过社交软件链接了人与人,改变了我们的社交习惯;亚马逊和阿里巴巴通过电商平台链接了人与商品,改变了我们的购物方式。
亚马逊AWS通过大规模的云计算数据中心,改变了互联网和IT基础设施。云计算不仅仅重构着互联网技术生态,而且持续推动着整个传统行业逐渐演进成更高阶的产业互联网。物联网通过链接无数的传感器和智能化设备,成就了智慧家庭、智慧工厂、智慧城市。人工智能则是是通过更复杂更“深度”的神经网络算法以及更多大数据的训练,“涌现”出了智能,能够帮助我们人类做部分决策。
无数个体融汇成系统,个体和系统,如此不同却又相互关联。我们在研究宏观系统的时候,需要考虑微观个体的特点;与此同时,我们在研究微观个体的时候,也需要考虑宏观系统的需求。
互联网公司运营着能够支持数以万、亿计用户的云系统,需要考虑更宏观系统的事情。云计算公司服务成千上万有互联网应用需求的公司,再考虑到不同云计算厂家的个性化业务,因此形成了对硬件很多非常不同的需求。但传统的IC公司受限于距离市场和用户太远,并且由于自身技术和商业策略的原因,无法完全满足这些需求。
2 内涵和外延
服务器是数据中心基本的节点,通过不同层级的交换机把服务器连接到一起。在这个网络中,单个物理的服务器节点就是一个基本的系统。它包含了芯片、主板、板卡、电源以及机箱等硬件,也包含运行于硬件之上的软件,还包括根据场景而运行的各种算法和策略,以及要进行处理和存储的数据等等。
我们把硬件、软件、算法、数据等比作一个点,把硬件、软件、算法和数据连接到一起的系统比作一条线,那么组成互联网业务的服务器集群则构成一张网、一个宏系统。进一步的,数据中心里多种业务交互共存的体系则是多种宏系统的叠加。我们要考虑的不仅仅是网内的节点之间相互影响,还要考虑不同的网之间的跨网相互影响。
例如,数据中心规模非常庞大,假设单个服务器每天万分之一的故障率,那么整个数据中心每天将有数百起故障发生,硬件层面的稳定性和高可用设计则是解决这一问题的关键。再例如,AWS当前有400多万台(估算,可能还在动态增加中)服务器,加上虚拟化的支持,数千万个计算节点,需要把这千万级的节点划分到数以十万计的VPC里,并且要考虑跨VPC、跨域访问的问题,还要考虑VPC动态变更的问题,千万级服务器的动态虚拟网络系统将是一个巨大的挑战。
一旦和宏观的规模相联系,需求就不单单是个体系统内涵的业务场景,还包括个体系统的外延约束。需要在更宏观的高度,系统性的思考业务场景,并落实到个体系统以及“线”、“点”的设计中去。
3 简单和复杂
产品经理经常说的一句话:“产品设计要学会做减法,给用户极致的简单”。在如何做减法上面,需要有很多的思考和权衡。从技术的角度分析这个问题,可以这样说,当我们给用户提供的产品越简单,在产品背后所隐藏的技术细节就会越复杂。如“冰山一角”,用户所能看到的只是海面上一个小冰尖(交互接口),看不到的是海面以下整个冰山的全貌(技术实现)。如果我们给用户提供的产品功能丰富,融合多种技术于一体,我们需要考虑如何将这些复杂功能和技术融合成一个整体,并且为上层用户提供足够简单的接口来访问。
我们通过分层的纵向划分,以及同层不同组件的横向划分,每个层次、每个组件把复杂的功能实现封装在内部,而把对外实现的功能接口却尽可能的简单。每一层依赖于下层提供的服务接口来实现自己的功能,同时为上层提供服务接口。每个组件通过跟其他组件通信,来实现自身功能的处理,以及与其他组件的协作。
分层、分组件需要在整个系统层次规划,而不是 “各自为政”,不仅仅要考虑与上下层间、左右模块间接口的交互,更要全面的考虑整个系统的功能划分,避免造成不必要的功能浪费或缺失,也要考虑某个功能放置在某个层的合理性等。如何定义分层、分组件的功能划分,如何封装层级、组件的具体功能实现,提供哪些足够简洁的交互接口,是系统设计最关键的价值所在。
简单和复杂既相互矛盾又和谐统一。云计算给用户呈现出一个分层的琳琅满目的产品体系,基于硬件基础设施,支撑IaaS、PaaS以及SaaS的上层服务。每一层不仅使用下一层不同组件提供的服务,并且与同一层的其他服务协作,共同为上一层的服务提供支持。
4 开放和封闭
在谷歌的Android生态里,系统、硬件、应用、分发都是完全开放的,群雄并起,野蛮生长。起步晚于苹果的iOS,但快速的占领了智能手机端绝大部分市场份额。而苹果的iOS,除了应用,其他三项是完全的掌控在苹果的手里,虽然市场份额不占优势,但苹果获取了整个智能手机市场的绝大部分利润。
回顾半导体产业的发展历史。第一阶段,是一个封闭的阶段,以Intel、TI为代表的半导体公司自己设计并制造芯片,这一时期的半导体产业是一个非常高门槛的事情。于是TSMC扛起了开放的大旗,创建了只做生产不涉足设计的Foundry模式,开启了半导体产业的第二阶段。以TSMC的创立为标志,大量Fabless公司如雨后春笋般诞生,这里的典型代表如Qualcomm、NVIDIA、MTK等。
时光流转,如今互联网云计算正进入一个新的时代,互联网巨头开始切入芯片领域。谷歌的TPU,亚马逊的NITRO、Graviton、Inferentia等;国内的华为有鲲鹏、昇腾等,阿里的平头哥则刚刚发布了含光800 AI芯片。
互联网云计算公司开始整合软硬件设计整体方案,又开始形成了各自一套封闭的体系,以此来获取更大的差异化价值。像苹果在智能手机领域一样,在互联网云计算领域,除了面向用户的接口是标准化的、开放的,隐藏在用户接口“冰山一角”之下的庞大冰山,却又是各家封闭的。行业未来的走向,是封闭还是开放?
5 快与慢
古人云,“天下武功,唯快不破”。这个说法用来形容互联网的发展,非常贴切。微信刚开始研发的时候,在腾讯内部要跟其他团队抢机会,在外部也要跟其他很多类似的社交软件竞争。2011年1月微信正式发布,只允许用户发送文本和照片;2011年5月微信推出了"语音消息";2011年7月,微信增加了基于位置的服务"附近的人"、"漂流瓶"和"摇一摇";2012年3月,微信用户数突破1亿大关,距离微信第一版推出仅433天。
古人又云,“重剑无锋,大巧若工”,这个说法同样非常有道理。Intel在1971年发布了第一款处理器4004,随着上世纪80年代PC的爆发,Intel成为了IT行业的基石,50年持续的投入,也持续推动着行业迅猛发展。华为“数十年如一日”聚焦于通信领域,积跬步以至千里,逐步领先全球。
被称为“币圈”的以比特币为首的各种虚拟币圈子,有“币圈一天,世间一年”的说法,这是当前让慢变快的极致典范。各种虚拟币的买卖,涨跌不仅快速而且幅度惊人。超快的节奏,剧烈影响着矿机市场的技术发展。各家矿场和矿工们为了抢得先机获取更多的利润,超快节奏的进行着矿机的升级换代。挖矿平台从CPU、GPU到FPGA,再到ASIC,仅仅经历了3年多的时间。并且,一个性能领先的ASIC矿机型号保鲜期也就半年而已,半年后基本上就无法再赚到钱了,需要更换更高性能的ASIC矿机。
云计算,需要快与慢的交融。互联网软件,足够灵活,快速迭代优化;底层硬件,足够高效,逐步加速和卸载系统的功能。软件具有灵活性,性能虽“慢”,但却“快”速迭代;硬件具有更高的执行效率,性能够“快”,开发却“慢”。软件的“快”和硬件的“快”可否合二为一?既想要软件的灵活性和快速开发,又想要硬件的性能和效率,鱼和熊掌可否兼得?
6 通用和专用
听到通用,通常想到的是CPU和软件,平台唾手可得,开发简单灵活,但性能相对较低,能效比也较低;听到专用,通常想到的是基于FPGA或ASIC的定制硬件,软硬件开发门槛都很高,但性能更加强劲,能效比也更高。
通用的CPU因为其灵活性、平台化的特点,不仅仅覆盖非常广泛的领域,而且在新兴领域,想要快速实现想法,CPU是首选的平台。CPU存在于我们生活和工作的方方面面,云端的服务器、办公的台式机和笔记本电脑,甚至我们的智能手机终端,其操作系统和上层应用都运行在通用的CPU上。
专用的FPGA或ASIC,软硬件开发门槛都特别高,当一个领域逐步走向成熟,需要更加快速、更加庞大的计算能力,并且这个领域具有一定的规模,那么,开发专用的FPGA或ASIC来代替CPU的工作,则是一个显而易见的做法。定制的FPGA或ASIC同样舞台宽广:例如移动通信基带,基站侧因为规模的原因,通常会使用FPGA多于ASIC,终端侧则更多的使用基带ASIC单元,因为终端侧功耗敏感却又规模庞大;例如人工智能领域,因为算法复杂计算密集,基于FPGA和ASIC的方案也层出不穷;再例如虚拟货币的区块链,激烈而快速的完成了从CPU到ASIC的过渡。
没有绝对的通用,也没有绝对的专用。通用的CPU加入了扩展指令的协处理器,例如Intel的AVX,ARM的NEON。专用的FPGA或ASIC也在向通用的方向回调,例如这些年流行的DSA架构,例如用于网络包处理软件可编程的PISA架构。像GPU、DSP、ISP等处理器,则处于通用和专用之间。NVIDIA提供了基于GPU的编程框架CUDA,封装了GPU的很多细节,提供类似CPU平台的编程友好性,并且针对很多特定领域开发了功能丰富并且强大的函数库,使得GPU得到广泛应用。
通用和专用,是手段不是目的。选择通用或专用的计算平台,不仅仅考虑性能和开发门槛,还需要考虑很多因素的综合影响。随着系统越来越庞大,通用和专用的界限也越来越模糊,互相学习互相借鉴,系统评价的标准只有一个:更优综合性能的同时更低的综合成本。
7 集中与分布
在IC领域,SOC(System on Chip,片上系统)和NOC(Network on Chip,片上网络)的趋势是典型的集中式单系统设计,比如智能手机芯片,集成了应用处理器、通信基带、无线WiFi、GPU、ISP甚至AI处理器等。但在一些功耗、成本敏感的场合,例如IOT场景,节点只完成非常简单的功能,例如数据采集,然后把数据传输到云端处理、存储,甚至分析决策,最后把决策后的指令下发终端执行。终端节点只构成系统的“触角”,整个大的系统是由很多简单的微小系统组成。
云计算的出现,通过超大规模的数据中心,集中的为用户提供服务,数据的处理和存储都主要集中在数据中心各种形态的服务器中。我们登陆电商APP,本地的终端主要是浏览商品、下单以及支付的请求等;而对服务器端而言,同一时间会有数以千万计的访问,这些巨量的处理都需要在庞大的云端后台完成。但是,集中式的云计算服务无法覆盖所有场景,例如自动驾驶,需要数据的快速分析并决策执行。随着数据量的快速增加,集中式的云计算无法满足这些处理需求,于是边缘计算开始流行。
在数据中心内部,计算通常都是在CPU执行,我们通常称之为集中式的以计算为核心(Compute Centric)。但随着CPU性能提升的放缓,而数据量还在大幅度增加,为了解决大数据处理分析的挑战,不得不转换成分布式的以数据为核心(Data Centric)的处理。于是出现了很多新的技术架构,去卸载和加速各种原本在CPU中的工作任务。对数据的处理,也更加的靠近数据存储或传输侧,大量的计算分散在靠近数据的地方,减轻了主机CPU的压力。
以计算为核心,数据量越来越大,使得存储的分层也越来越多。但大数据量的处理却使得数据局部性失效,存储分层的作用大打折扣。整个体系结构越来越复杂,CPU越来越不堪重负。站在数据中心整个系统的层次,以数据为核心,用效率或性能更高的加速单元,分散在靠近数据的地方完成数据的大部分处理工作,是一个重要的趋势。
8 量变和质变
以前的互联网系统规模都不大,只有几十台几百台服务器,加上虚拟化的支持,可以虚拟出数千台的服务器,已经算是一个很大的系统了。随着互联网业务的急剧增大,出现了很多超级大系统。例如阿里巴巴运营着世界上最大、最繁忙的电子商务平台,包括C2C零售市场淘宝、B2C市场天猫等在线市场,服务超过6亿活跃消费者,2018财年的商品交易总额超过7680亿美元。
而云计算的出现,更是将规模的问题放大到了极致。因为云计算要服务成千上万的互联网用户,每个用户都会有一个或多个互联网系统。全球最大的云计算公司,亚马逊AWS,现已在全球 22个地理区域内运营着69个可用区。以每个可用区5万台服务器估算,AWS大概拥有400万台左右服务器用于为全球用户提供云计算服务。
当一个互联网系统规模较小的时候,几百台左右服务器,这个时候只能采用通用服务器。如今,云计算厂家数百万台服务器的规模。云计算厂家为用户提供超过上百种各式各样的产品服务,应用于各种不同的应用场景。但从底层技术来看,这些服务场景会归约于比较集中的一些软硬件功能集。因此,在规模和特定场景的推动下,非常有必要进行针对性的软硬件优化。
云计算进入下半场,云计算(特别是IaaS层)的产品服务越来越趋于成熟,云计算厂家的服务器规模越来越大,以及面向特定场景的产品和服务,迫切需要深层次软硬件重构,需要为产品服务定制优化软硬件,以此来提升性能并且降低成本。
9 软件和硬件
软件和硬件,通常的定义是:运行于CPU、GPU等平台的程序为软件,而作为载体的CPU、GPU等平台则为硬件。这跟我们常说的“某个任务软件实现,某个任务硬件加速”的理解有一些区别。我们说的某个任务CPU软件实现,说的是整个任务都是基于CPU指令的程序实现,完全运行在CPU上。而任务的硬件加速,则是把任务的关键部分运行在一个硬件加速器上,而CPU主要是承担数据交互和加速器运行控制等简单的不需要太多性能的任务部分。通过硬件加速可以进一步提升任务处理的性能,同时也能够提升运行效率和降低综合成本。
通常,软件开发和硬件开发是割裂的两个部分。比如,Intel和AMD等CPU厂家定义好了指令集体系结构,然后专注于某个具体CPU的微架构和具体实现,而软件开发工程师,则基于CPU上各种开发环境开发自己的软件程序。再比如,芯片厂家研发一款SOC,虽然有系统架构师会做好软硬件规划,但依然和用户的业务场景在细节上有很大的差别。芯片厂家给开发者用户提供SOC芯片、相关的驱动以及参考设计等,而开发者基于这些已有的框架平台再开发自己想要的上层业务功能。硬件平台是“条条框框”,软件开发只能在这些“条条框框”的范围内发挥而无法跳出这些“条条框框”,也不可能自己来定义“条条框框”,更难做到优雅的与“条条框框”共舞。
“软件定义硬件”代表了一种趋势:要从系统层次,主动的来定义个体的硬件。但“软件定义硬件”的描述更多的强调系统,容易忽略个体的特点。站在系统层面,可以“站得高,看得远”,代表了宏观的、整体的思考,能够更好的资源统筹,更好的定义系统功能。而站在个体的层面,个体是本源,代表了事物本质的特征。事物受客观规律的约束,具有特定的发展规律。
“软件和硬件融合”,更好的协调了系统和个体的关系。站在系统的角度,更好的定义硬件,也更好的定义驾驭硬件的软件。没有既定“条条框框”的约束,有的只是各种各样软件和硬件的“积木”。我们可能需要重新设计或改造一些“积木”,和已有的“积木”一起,随心所欲,搭出属于自己的系统。在这个系统里,软件里面可能会包含硬件,硬件里面也可能会包含软件,软件和硬件深度融合,密不可分。最终,实现功能强大的、深度优化的,并且可持续快速迭代的系统平台。
作者:Chaobowx
来源:https://mp.weixin.qq.com/s/nkd3DtxkIk\_7F9GmvLj0dw
作者微信公众号
相关文章推荐
更多软硬件技术干货请关注软硬件融合专栏。