本节主要介绍斯坦福提出的Spatial语言,Spatial语言是内嵌与scala的领域特定语言(DSL),用来实现硬件设计。
本节的阅读材料有:
1.Spatial的论文
https://stanford-ppl.github.io/website/papers/pldi18_koeplinger.pdfstanford-ppl.github.io2.Aladdin
Proceeding of the 41st annual international symposium on Computer architecuturedl.acm.org3.高性能低功耗线性代数架构的协同设计探索
Codesign Tradeoffs for High-Performance, Low-Power Linear Algebra Architecturesieeexplore.ieee.org首先思考一下机器学习硬件设计的一些关注点:
1.流水:流水是为了更好地性能,让硬件能够尽量保持在工作状态。
2.内存分层:为特定的访存模式匹配对应内存层级和容量的划分。
3.有限的物理计算资源和内存资源:有限的资源和巨大的计算需求之间的分配
4.设计空间参数探索:不同机器学习应用有不同的瓶颈,需要设计好硬件参数能减轻或者消除部分瓶颈。
再来看一下现有的语言分类,从高级的面向特定应用的语言(SQL、Spark等)到低级的面向处理器架构的语言(C语言、R语言),中间还存在着python、java、scala等通用语言。根据编程目的的不同,编程语言也有各自的特点。
此外对于可重构架构(如FPGA)的编程,相对的硬件描述语言较少。
一个硬件语言需要考虑性能、可移植性和生产效率三个方面。
性能就是指能产生出高效的硬件;生产效率就是指编程人员的劳动成本和实际语言效果,当成本大于效果时,这个语言就是生产效率低下的;可移植性指是不是语言只能在特定平台运行。
传统的硬件描述语言像用的最多的verilog,VHDL以及近些年来比较热的Chisel等,注重性能,能直接产生任何RTL代码,但是生产效率和可移植性是较差的,因为这些语言没有高层次抽象的概念。
高层次综合工具(HLS)现在在FPGA上用的比较多,但它的性能不高,因为不能实现内存分层,也不能直接划分流水线,不能直接生成想要的RTL代码。在生成效率方面,HLS可以较好的解决循环嵌套的问题,但是不好调试,对于分块、循环展开(映射到硬件实现)等问题需要有经验的人员进行额外注记,要不然转换为硬件的效果不好,HLS具有可移植性。所以很多时候HLS只应用在硬件设计的算法正确性验证上,因为不用考虑性能。
斯坦福提出的Spatial语言,支持内存分层和任何流水划分,但不能生成任意的RTL代码;在生产效率方面对循环嵌套、自动内存划分、支持循环展开/分块等隐式设计参数,以及设计自动调整;它也具有可移植性。
Spatial是为了简化加速器设计的编程语言,它具有以下特点:
1.管理Host和加速器通信的接口非常简单;
2.支持内嵌构造并行通路扩展、片上存储等
3.自动功能性和节拍级精度的模拟器。
Spatial语言关注与加速器数据通路、控制逻辑等这些加速器硬件设计时的核心关注点。
Spatial语言的好处如上所示,看上去很美哈哈。
Spatial语言配套的编译器可以支持:
1.插寄存器站台调节时序;
2.控制调度:目前只支持内层循环还,即将支持外层循环
3.多端口的内存和buffer生成:内存多端口一致性访问保证和buffer深度及流水站台设计。
4.多方面的硬件优化
5.自动设计调优(即将支持)
暂时不支持的有:
1.自动循环/数据分块处理
2.自动分配任务,切分计算任务分别在host和加速器上执行
3.循环融合,合并存在元素依赖关系的循环或消除循环之间的内存访问。
下面通过简单的例子来引出Spatial语言具体如何进行硬件设计。
Spatial语言是内嵌于scala语言实现的(chisel也是内嵌于scala实现的),而scala是java核心的。scala语言结合了面向对象的编程语言和函数式的编程语言,每个值都是对象。
Scala 教程 | 菜鸟教程www.runoob.com简单的例子讲完了,应该有个初步的印象。