vhdl语言实现小游戏_斯坦福CS217(五)Spatial语言简介

本节主要介绍斯坦福提出的Spatial语言,Spatial语言是内嵌与scala的领域特定语言(DSL),用来实现硬件设计。

本节的阅读材料有:

1.Spatial的论文

https://stanford-ppl.github.io/website/papers/pldi18_koeplinger.pdf​stanford-ppl.github.io

2.Aladdin

Proceeding of the 41st annual international symposium on Computer architecuture​dl.acm.org

3.高性能低功耗线性代数架构的协同设计探索

Codesign Tradeoffs for High-Performance, Low-Power Linear Algebra Architectures​ieeexplore.ieee.org

0982a8bc75ba6eb1c95a65aacadb27d1.png

3fe9950c0af58ddb32d94465c038f13c.png

首先思考一下机器学习硬件设计的一些关注点:

1.流水:流水是为了更好地性能,让硬件能够尽量保持在工作状态。

2.内存分层:为特定的访存模式匹配对应内存层级和容量的划分。

3.有限的物理计算资源和内存资源:有限的资源和巨大的计算需求之间的分配

4.设计空间参数探索:不同机器学习应用有不同的瓶颈,需要设计好硬件参数能减轻或者消除部分瓶颈。

3ad7788f24beae3985a52b95b8aa9a27.png

再来看一下现有的语言分类,从高级的面向特定应用的语言(SQL、Spark等)到低级的面向处理器架构的语言(C语言、R语言),中间还存在着python、java、scala等通用语言。根据编程目的的不同,编程语言也有各自的特点。

3bcf7193ee8024ccfe648816faa71c88.png

此外对于可重构架构(如FPGA)的编程,相对的硬件描述语言较少。

9eae18f04fe2b94ddc03b8a07397ae4a.png

一个硬件语言需要考虑性能、可移植性和生产效率三个方面。

性能就是指能产生出高效的硬件;生产效率就是指编程人员的劳动成本和实际语言效果,当成本大于效果时,这个语言就是生产效率低下的;可移植性指是不是语言只能在特定平台运行。

066ebfdb2883a95d0a40b0c7212cf88b.png

传统的硬件描述语言像用的最多的verilog,VHDL以及近些年来比较热的Chisel等,注重性能,能直接产生任何RTL代码,但是生产效率和可移植性是较差的,因为这些语言没有高层次抽象的概念。

d612a8286e44cf221c77c9fed4a9fb3e.png

高层次综合工具(HLS)现在在FPGA上用的比较多,但它的性能不高,因为不能实现内存分层,也不能直接划分流水线,不能直接生成想要的RTL代码。在生成效率方面,HLS可以较好的解决循环嵌套的问题,但是不好调试,对于分块、循环展开(映射到硬件实现)等问题需要有经验的人员进行额外注记,要不然转换为硬件的效果不好,HLS具有可移植性。所以很多时候HLS只应用在硬件设计的算法正确性验证上,因为不用考虑性能。

73bb947e824f3249b45ec345775b5eb3.png

斯坦福提出的Spatial语言,支持内存分层和任何流水划分,但不能生成任意的RTL代码;在生产效率方面对循环嵌套、自动内存划分、支持循环展开/分块等隐式设计参数,以及设计自动调整;它也具有可移植性。

ed8938c56ef8b7afbc5a5c0b1afa9abe.png

Spatial是为了简化加速器设计的编程语言,它具有以下特点:

1.管理Host和加速器通信的接口非常简单;

2.支持内嵌构造并行通路扩展、片上存储等

3.自动功能性和节拍级精度的模拟器。

Spatial语言关注与加速器数据通路、控制逻辑等这些加速器硬件设计时的核心关注点。

5f10fe3a2207367d445b5b8aea1388be.png

Spatial语言的好处如上所示,看上去很美哈哈。

2322f118cd2a5f6165ebc0df2b7c6586.png

dfba19cbe62b028c5ce7f6551f6bfa49.png

Spatial语言配套的编译器可以支持:

1.插寄存器站台调节时序;

2.控制调度:目前只支持内层循环还,即将支持外层循环

3.多端口的内存和buffer生成:内存多端口一致性访问保证和buffer深度及流水站台设计。

4.多方面的硬件优化

5.自动设计调优(即将支持)

暂时不支持的有:

1.自动循环/数据分块处理

2.自动分配任务,切分计算任务分别在host和加速器上执行

3.循环融合,合并存在元素依赖关系的循环或消除循环之间的内存访问。

下面通过简单的例子来引出Spatial语言具体如何进行硬件设计。

aaf87a13fa34ba7f7060d953d3894768.png

Spatial语言是内嵌于scala语言实现的(chisel也是内嵌于scala实现的),而scala是java核心的。scala语言结合了面向对象的编程语言和函数式的编程语言,每个值都是对象。

Scala 教程 | 菜鸟教程​www.runoob.com
ea01be09b6623cb78911b65b42ad85bd.png

b6f92d924cf23033a8d0c06f87de19cd.png

5070f2c14be89f66fec007355366f224.png
首先要import spatial语言包,可以将spatial看做是scala语言的一个库。

530ee10736d16b5db883d7d87e221bb3.png
scala语言中任何值都是对象

d42dc3e774ff84a4413b12ff52e2adb3.png
对象的名字叫HelloSpatial,而SpatialApp是Spatial语言中已经内嵌定义好的类,可以继承

6d9ae91231aca4175ca01db42ffff1a5.png
在hellpspatial这个类中定义一个函数行为

daffbc6f9a34f26004e904dad0e45ab1.png
函数返回类型是空

9f904f3e3afbf9ad1345b2aab46a7921.png
在函数中定义一个固定量input,val是不能被修改的

c34b6cb5c545c48d37c9fd0fd8b58d01.png
input的类型是整型,但是scala中的值在定义时可以不指定类型

61b7c734ab40e523e69aef8506e041a4.png
编译器会推测出值的类型

fbb1edac72bb13ca89f66a550c8f819c.png
圆括号是指的参数,方括号是类型参数

749342da5bc1af400273e87f9a8acf7d.png
这行代码是spatial的接口命令行,将传入的string类型转换为int型,这是在host中定义的

95f67162af4e12af0289ffb171a2919d.png
新建一个寄存器值in来获得CPU传过来的标量值。

17941213dc7b2d4b08ab851625c9b81e.png
新建一个寄存器值out来输出加速器中的寄存器值给CPU

07f5cc8fa829e4924c6faa5a42862821.png
建立CPU的input值和加速器的标量值in的连接

000604312e469ead8953ac862a15cdf6.png
定义加速器中完成计算,accel括号内部的所有代码都是加速器中实现的

37a9f4fd20ee624d5cd297fd55fe6363.png
accel括号内部的代码需要是可综合的

93373e7ef194f4acd343864109e8cd66.png
accel这个隐藏的含义是包含了一个从CPU到加速器的开始信号和一个从加速器到CPU的完成信号。

a8e23491f63cca1267768149048f389f.png
当前accel内部完成的逻辑操作是从输入寄存器in加4的结果连接到输出寄存器out

3e114c0fb6a93e47148b8b88fca0198f.png
和verilog不一样,这里赋值用:=

aef7c30422e8c878f1157835304dc0e2.png
accel内部保证加速器的完成信号是在accel内部的所有操作完成后才生成的

bd68a74f0872b633090aedd14c377d9f.png
然后getArg表示CPU从加速器中读回对应的寄存器值,建立输出连接

4443f322b678d6bf05bffddbe297e614.png
并在host终端上打印,可以用于调试。

简单的例子讲完了,应该有个初步的印象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值