异构计算的软硬件分割没有最好,只有更好的详细资料概述

描述

我们有飞机、汽车、轮船、自行车、地铁、高铁、公交车、双腿等各种交通工具,各自有优缺点,举个例子,阿呆从上海出差去北京卖书,整个流程是:

1. 打车到虹桥高铁站:灵活机动,运量小,24小时运营,经常堵车;

2. 坐高铁到北京南站:高速,运量大,路线、时间和起始站点有限制,建设周期长;

3. 从北京南站坐地铁到奥林匹克公园地铁站:市内速度稳定,运量大,时间和起始站点有限制,建设周期长;

4. 从地铁站走路到国家会议中心新书签售:慢,但是方便,两条腿,没有路都能走出一条路。

可以看出,一次旅行,其实结合了各种交通工具的优点。随着摩尔定律的失效和CPU在AI等并行计算方面的缺陷,目前数据中心的计算机,已经不仅仅是CPU一种计算芯片,还要结合GPU和FPGA做异构计算体系。

CPU是出租车,方便灵活,但是要等红绿灯,市区内道路多,有限速,运量小,车多了还堵车;FPGA是高铁和地铁,运量大,但是建设周期长,只能部署在人流量最大的线路上。

我们做异构计算的软硬件分割也是遵循同样的思想,普通的控制程序还是交给CPU执行,把计算量最大、最耗时间的任务转移到FPGA上执行,达到硬件加速的目标。

软硬件最佳分割方案:理论上无解

如下图,一个程序,通过对程序进行分割,把任务分解到CPU和FPGA、GPU、AI芯片等加速器执行。如果我们把程序分成N段,那么每一段都有两个选择:软件或者硬件,最后N段程序有2^N种分割方案,所以,最终要分段程序,寻找分配到软硬件的最佳方案是一个数学上有名的NP难题,解不出来。。。

我们没办法算出一个理论上的最佳方案,只能是不断逼近,没有最好,只有更好。

gpu

我们希望有一天能做到像下面这张图一样,我们写好的C/C++/Java等代码,编译后,自动分解成软硬件执行的程序,软件的交给CPU执行,硬件的让FPGA执行。尽管很难,但是还是要有梦想,万一实现了呢?

gpu

阿姆达尔定律

现在有很大一批人,对新的产品和技术比较排斥,觉得很low,没有技术含量。可是,任何一个新东西,刚出来的时候就是很简单,慢慢才变得复杂。比如区块链、深度学习、量子通信这些热门的技术,一开始实践的时候并不是很复杂。

1967年,有一位IBM的计算机科学家叫做阿姆达尔(Amdahl),他写了一个很简单的公式,却成了并行计算领域的基本定律。阿姆达尔定律说,一个程序能被硬件加速多少倍,其实取决于不能被硬件加速的那段程序。比如四分之三的程序可以通过并行计算、流水线等技术被硬件加速,但是有四分之一的程序还是得顺序执行,那么加速最大的倍数就是四分之三的程序几乎不花时间就算完了,用了四分之一的时间执行剩下不能加速的程序,最终可以加速4倍。

我们也知道这叫短板效应,木桶的容积是最短的那块板决定的。我们中国现在高铁、电视、冰箱、移动支付、共享单车、轮船都能做到世界第一,但就是芯片不能造,导致国家还是受制于人(美帝)。

当然,这个程序的占比不是按照代码的长短算的,而是按照程序执行的时间划分。为了达到最好的硬件加速效果,我们要把最占时间的程序都放到FPGA去。

关于这个定律的详细解释请参考科大陈国良院士的《并行计算机体系结构》一书2.3.1节。

90%/10%定律

gpu

上面这张图是对一个程序中执行最多的的10段代码占用时间的累计,符合90%/10%定律:10%的代码执行占用了90%的程序运行时间。

所以我们很幸运,不需要操心那么多软件代码,只需要把最关键的10%代码转移到FPGA就可以了。

软硬分割的考虑因素

我们在对一个程序做软硬分割时,需要回答以下几个问题:

1. 程序分段粒度多大?

2. 分割方案的评估

3. 每段分区有哪些实现方案?

4. 软硬件如何交互?

5. 计算占用的面积。

程序分段粒度多大?

其实就是要把程序里的哪几段代码下放到硬件去,开小灶。这个代码段要分到多细?如果太粗,那么操作比较简单,花的时间少,但是最终效果可能没那么好。分的太细,又太花时间,每一段都要分析和推算,考虑软硬件交互,甚至需要专门的工具去做。

最简单的办法就是挑几个关键的函数、算法或者for/while循环放到硬件去加速。

分割方案的评估

如果我们要确定软件和硬件分工的方案,就需要评估和对比几个方案,从性能、成本、功耗等几个方面来评价。项目一开始,其实做不了太精确的评估,只能是粗糙的做一个估算,看看到底要用到多少LUT、RAM和乘法器、硬件IP等资源,再估算性能和延迟。

等到大体确定了一个目标方案,就可以写代码,用综合工具做一个综合,就能得到比较精确的资源占用情况。

不同的实现方案怎么选择?

对于每一段要硬件加速的软件程序,硬件上都有不同的实现方案。如下图,是100个乘法的例子,有三个方案:

(a)方案用了100个乘法器,性能最强,用的资源也最多;

(b)方案用了1个乘法器,要排队乘100次才能算完,性能最差,用的资源最少;

(c)方案用了10个乘法器,每个用10次,性能和资源都比较折中。

gpu

所以,最终采用什么方案要根据实际的需求和FPGA的大小来确定,FPGA不是ASIC,资源没有那么多,能省则省。

软硬件如何交互?

本来是一个顺序执行的软件程序,我们拆出了一部分放到FPGA去执行,所以就涉及到软硬件交互的问题。如下图(a),

左边是同步方案,软件干完,就让FPGA干,软件在旁边等,这样交替干活。这种方案比较傻瓜式,简单易行。而且性能不一定差,因为硬件计算快,软件可能等一会儿就好了。

右边是异步方案,软件和硬件各干各的,同时工作,效率高,但是控制比较复杂,毕竟涉及到一些共享的数据,处理起来比较麻烦。如果硬件计算时间长,软件等得久,就可以考虑这种模式。

gpu

另外,还要考虑软硬件的通信方式,如上图(b),是各种通信方案,有的通过共享内存,有的是通过CPU直连、共享缓存,还有像牛郎织女一样搭一座桥互联。还有几个硬件加速器之间绑定在一起和CPU通信,还是分开,都需要考虑到。

用AI辅助软硬件划分

传统的硬件加速项目流程如下:

1. 确定要加速的软件程序;

2. 架构师通过评估和统计数据、性能计算确定软硬件分离方案和硬件架构;

3. 工程师开始写代码、仿真、验证、测试。

但是,也有一些自动化工具来智能评估软硬件分割方案。前面说过,理论上是找不到最佳方案的,因为计算量是个天文数字,我们只能不断逼近。逼近的方法如下:

1. 把程序切分成几段,给出软件和硬件时间、硬件资源,算出一个评估结果。

2. 再随机把程序分段,算出一个评估结果,看看是不是更好,如果更好,就用这个方案。

3. 继续迭代。

上面的方法采用了随机数的方法,不断找到更优解。但是,如今随着AI的日渐成熟,我们相信,也会有人会用AI技术来寻找更好的自动化软硬件分离方案。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分