【新智元】丛京生院士深度解读可定制计算的设计自动化:自动将代码转换成电路描述,解决开发人员最大难题( 三 )


【新智元】丛京生院士深度解读可定制计算的设计自动化:自动将代码转换成电路描述,解决开发人员最大难题
本文插图
FPGA有多种不同的方式与服务器进行连接[9] 。 最简单的方式是将单块FPGA直接插在PCI-E上 。 也有将多块FPGA连在总线上的方法 。 有HARP这种考虑到内存一致性的插板方式 , Intel的FPGA则是可以放在QPI总线上 。 总的来说把FPGA和通用CPU连在一起工作并不是一件很难的事情 。 在UCLA我们很早就已经把FPGA放进了计算集群(Cluster)里 。 微软是在数据中心使用FPGA的领航者 。 早在2014年他们就把FPGA插进了服务器并且用于Bing的搜索服务 。 之后微软的架构可以将所有的FPGA连到同一块交换机 , 并且再和上层交换机进行交互 。 这样使海量FPGA执行大规模的AI计算成为了可能 。 亚马逊的AWS现在也有了F1专门为FPGA加速提供服务 。 我在UCLA教课时就要求学生使用亚马逊F1来完成他们的FPGA加速作业 。
【新智元】丛京生院士深度解读可定制计算的设计自动化:自动将代码转换成电路描述,解决开发人员最大难题
本文插图
我们可以看到 , 把FPGA放进当下各种规模的计算机系统已经不成问题 。 那对于一个开发人员来说剩下的问题在哪呢?我觉得最大的问题在于:有这么一个超强的计算器件 , 你可以利用它得到非常好的结果 , 但是你不知道怎么去编程来驾驭这个怪物 。 特别是FPGA这样的异构计算器件对于一个软件工程师而言完全是陌生的 。 将软件工程师C代码自动转换成对应的电路描述 大约在15年前 , 我们开始了一项新的工作叫做高层次综合(High-Level Synthesis , HLS) [10] 。 软件工程师可能没有办法直接设计硬件电路 , 但是他们会写C代码 。 我们的工作可以帮助他们将C代码自动转换成对应的电路描述 。 这项工作我认为我们做的比较成功 。 当时LLVM编译架构刚刚问世不久 , 我们觉得它有很好的中间表示 , 于是立刻在它上面进行开发 。 用户的代码经过LLVM-IR优化之后直接通过我们自己拓展的后端生成硬件描述 。 我们将这项工作成功转化成了商业产品AutoPilot , 并在2006年成立了AutoESL公司 。 在2011年, 赛灵思(Xilinx)收购了AutoESL , 并把AutoPilot改名成为了大家熟知的Vivado HLS 。 也许你们中的一些人用过Xilinx Vivado HLS , 这其实是一项从UCLA开始 , 并从AutoESL成长起来的产品 。 赛灵思在收购AutoESL之前对我们的高层次综合工具做了大量评估 。 他们通过对比大量已有的手工设计来检验高层次综合是否能得到令人信服的结果 。 实际评估后赛灵思发现我们的高层次综合工具做出来的结果在维持最优的时钟周期的同时 , 还可以有更低的资源消耗 。
【新智元】丛京生院士深度解读可定制计算的设计自动化:自动将代码转换成电路描述,解决开发人员最大难题
本文插图
【新智元】丛京生院士深度解读可定制计算的设计自动化:自动将代码转换成电路描述,解决开发人员最大难题
本文插图
高层次综合是电子设计自动化的一项非常令人激动的进步, 因为它使得从C语言到硬件电路成为了可能 。 赛灵思在收购我们的工具之后也维护的很好 。 现在我的课上学生可以选择使用HLS来设计电路 , 学生们的反馈也很好 。 在Google搜索”Vivado HLS”的科研文章可以搜到超过4000篇 。 它在工业界有着数以万计的用户 。以上对于高层次综合来说是很好的消息 , 但是不好的消息是光靠高层次综合其实是不够的 。 为什么这么说呢?这里有两个问题 。 第一个问题是CPU和FPGA之间程序抽象的区别越来越大了 。 用高层次综合当然可以从简单的C/C++变成电路 , 但是从下图我们可以看见软件标准和发展的曲线正在变得越来越陡峭 。 新兴的特定域计算语言 , 比如人工智能的语言 , 正在快速进化和发展 。
【新智元】丛京生院士深度解读可定制计算的设计自动化:自动将代码转换成电路描述,解决开发人员最大难题
本文插图
第二个问题在于 , 实现相同功能但使用不同写法和风格的C/C++程序 , 通过高层次综合会跑出不同结果 。 有的结果甚至大相径庭 , 以至于比CPU的结果还要差 。 所以写出好的HLS C/C++代码是要受过训练的 。 我实验室的学生在学习的第一年很少有人能写出比CPU跑的还好的HLS C/C++代码 。 在这里我想举一个例子 , 我的两位研究生在学习的第一年针对生物信息学的Needleman-Wunsch序列匹配算法进行加速 。 当他们写完程序之后发现高层次综合两分钟就给了他们对应的电路设计 , 他们非常开心 。 但是实测发现他们的设计性能比CPU慢了100倍 。 如果我们仔细看这个电路到底发生了什么我们就会发现:1)输入每次只读了8比特, 而FPGA的总线宽度有512比特 。 2)这个电路没有做缓存 , 所以每次输入都是从片外存储器读进来的 , 这样的延时很高 。 3)所有的循环是顺序执行 。 4)所有的计算逻辑都在读写相同的片上数据 , 而FPGA的每个片上存储单元只有两个端口 。 同一时钟周期内存储单元每次只能接受两个数据访问请求 , 得不到数据的计算逻辑需要等待 。 这是影响性能的最大瓶颈 。 所以这样的高层次综合设计是不可能好于CPU的性能的 。 但当他们受过一年训练之后 , 就知道怎么利用编译指令(pragma)来控制各种粗细粒度的流水和并行 , 怎么把数组进行分块等等 。 这样的设计结果就会远远好于使用通用CPU 。 然而还有一个问题是 , 最后性能优化的HLS C/C++代码可能会很长 , 甚至和原始代码相比面目全非 。