numpy 点乘_斯坦福CS217(六)Spatial点乘示例

本节课主要介绍点乘的软件实现以及使用Spatial的硬件实现

0cce542b75c1c0ba362bf0f1f2f86746.png

本节课内容包括

点乘回顾、点乘的软件实现、点乘的硬件设计、点乘的优化以及如何理解性能

304e866f5fa9844e9ac851efa8c68955.png

点乘就是两个等长序列的累加和,它的几何意义就是计算cos(a,b)

55f31aef388151c8de5694a1b14b1104.png

用软件来仿真可以看到比较简单,numpy包提供了自带点乘函数dot来实现功能,它的计算结果和上面写的遍历累加和的结果一致。

用Spatial语言实现更加简单,用zip的方法让矩阵aIn和bIn,先每一项相乘(_*_),再将每一个乘积结果累加(_+_),这样写是scala语言的特性。

03073100a41e5af73f34128f095f7e4e.png

用Spatial进行硬件设计该如何设计呢,最直观的方法是:

首先是工作在整型矩阵的T,然后需要实现两个矩阵a和b从片外存储拷贝到片内存储,所以片外存储为a,b,用setMem的方法将aIn和bIn矩阵拷贝到片外存储DRAM a和b中;片内存储为aTile和bTile。从片外DRAM拷贝到片内SRAM需要控制逻辑,这里实现了一个寄存器用来存储累加和accum,先用并行处理的方法将DRAM的每个条目拷贝到片内,然后将片内存储进行累加和处理结果保存到accum寄存器。最后将accum寄存器给result寄存器,用argOut的方法输出给Host处理器。

a84a541e090d6ff44163238c129b7532.png

回想一下我们是不是必须要使用序列控制器来实现点乘?因为点乘可以看做是一个缩减的操作,数据之间使用没有依赖关系,我们可以用流水的方式进行处理。

e9af2b86f0df678839272e3433fd8959.png

将sequential语句改成reduce语句

320f2389c85140c77e136dfd33a18ee2.png

得到硬件设计框图如上图所示。再考虑一下如何对该硬件结果进行优化?

并行处理是一个重要的思路,代价是增加加法器和乘法器的开销。首先是对计算内积进行并行处理,并行度为4

26bfaee11f0161e0e759da30f7960a0e.png

得到的硬件结构为:

7303bce42659dd27794c9843018b51de.png

可以看到并行执行使用了4套加法器和乘法器逻辑。

也可以对累加缩减进行并行处理,并行度为2,得到硬件结构如下所示

069f5a45958033014aa1a4f05b830bb2.png

相比于内积并行,累加缩减并行少用了乘法器,但增加了寄存器的用量,并且增加了计算延迟。不过内积并行对于片上存储带宽要求很高,出数宽度等于原始数据宽度乘以并行度,这样会带来一定的开销(线开销,以及存储器面积的变化)

52a730f40567db64d014b72b1ef9d05e.png

最后思考一下性能分析,我们关心的一个是完成计算的拍数,第二个就是资源利用率

7fcb6811ae01f5c8a04dc505af07b713.png

从完成拍数上看,使用reduce流水的方法相比于序列串行实现的提升效果明显,并行能够缩减1倍的延迟是因为并行使用了reduce(2,4)并行,限制在2倍并行。但并行对操作个数提升很大,提升了6倍多

假设使用一个更大的并行度,外层并行度为2,内积并行度为128,tilesize并行度为256

79c42cb1ba9ad8d38d0a0d88d9141faf.png

得到的性能如下表所示

f02e2f2a04ce7113f66d452e53821522.png

如此大的并行度对延迟的减少并不明显,对操作吞吐量的提升很大,但是存储容量也爆炸增长。

089015025ac0800794a717350d8b5c8b.png

从以上实验结果分析可以基本得出:

tilesize的大小和片上BRAM的容量直接相关

并行度和操作吞吐量直接相关

延迟受外层并行度制约。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值