本节课主要介绍点乘的软件实现以及使用Spatial的硬件实现
本节课内容包括
点乘回顾、点乘的软件实现、点乘的硬件设计、点乘的优化以及如何理解性能
点乘就是两个等长序列的累加和,它的几何意义就是计算cos(a,b)
用软件来仿真可以看到比较简单,numpy包提供了自带点乘函数dot来实现功能,它的计算结果和上面写的遍历累加和的结果一致。
用Spatial语言实现更加简单,用zip的方法让矩阵aIn和bIn,先每一项相乘(_*_),再将每一个乘积结果累加(_+_),这样写是scala语言的特性。
用Spatial进行硬件设计该如何设计呢,最直观的方法是:
首先是工作在整型矩阵的T,然后需要实现两个矩阵a和b从片外存储拷贝到片内存储,所以片外存储为a,b,用setMem的方法将aIn和bIn矩阵拷贝到片外存储DRAM a和b中;片内存储为aTile和bTile。从片外DRAM拷贝到片内SRAM需要控制逻辑,这里实现了一个寄存器用来存储累加和accum,先用并行处理的方法将DRAM的每个条目拷贝到片内,然后将片内存储进行累加和处理结果保存到accum寄存器。最后将accum寄存器给result寄存器,用argOut的方法输出给Host处理器。
回想一下我们是不是必须要使用序列控制器来实现点乘?因为点乘可以看做是一个缩减的操作,数据之间使用没有依赖关系,我们可以用流水的方式进行处理。
将sequential语句改成reduce语句
得到硬件设计框图如上图所示。再考虑一下如何对该硬件结果进行优化?
并行处理是一个重要的思路,代价是增加加法器和乘法器的开销。首先是对计算内积进行并行处理,并行度为4
得到的硬件结构为:
可以看到并行执行使用了4套加法器和乘法器逻辑。
也可以对累加缩减进行并行处理,并行度为2,得到硬件结构如下所示
相比于内积并行,累加缩减并行少用了乘法器,但增加了寄存器的用量,并且增加了计算延迟。不过内积并行对于片上存储带宽要求很高,出数宽度等于原始数据宽度乘以并行度,这样会带来一定的开销(线开销,以及存储器面积的变化)
最后思考一下性能分析,我们关心的一个是完成计算的拍数,第二个就是资源利用率
从完成拍数上看,使用reduce流水的方法相比于序列串行实现的提升效果明显,并行能够缩减1倍的延迟是因为并行使用了reduce(2,4)并行,限制在2倍并行。但并行对操作个数提升很大,提升了6倍多
假设使用一个更大的并行度,外层并行度为2,内积并行度为128,tilesize并行度为256
得到的性能如下表所示
如此大的并行度对延迟的减少并不明显,对操作吞吐量的提升很大,但是存储容量也爆炸增长。
从以上实验结果分析可以基本得出:
tilesize的大小和片上BRAM的容量直接相关
并行度和操作吞吐量直接相关
延迟受外层并行度制约。