numpy 点乘_斯坦福CS217(六)Spatial点乘示例
本節(jié)課主要介紹點乘的軟件實現(xiàn)以及使用Spatial的硬件實現(xiàn)
本節(jié)課內(nèi)容包括
點乘回顧、點乘的軟件實現(xiàn)、點乘的硬件設計、點乘的優(yōu)化以及如何理解性能
點乘就是兩個等長序列的累加和,它的幾何意義就是計算cos(a,b)
用軟件來仿真可以看到比較簡單,numpy包提供了自帶點乘函數(shù)dot來實現(xiàn)功能,它的計算結果和上面寫的遍歷累加和的結果一致。
用Spatial語言實現(xiàn)更加簡單,用zip的方法讓矩陣aIn和bIn,先每一項相乘(_*_),再將每一個乘積結果累加(_+_),這樣寫是scala語言的特性。
用Spatial進行硬件設計該如何設計呢,最直觀的方法是:
首先是工作在整型矩陣的T,然后需要實現(xiàn)兩個矩陣a和b從片外存儲拷貝到片內(nèi)存儲,所以片外存儲為a,b,用setMem的方法將aIn和bIn矩陣拷貝到片外存儲DRAM a和b中;片內(nèi)存儲為aTile和bTile。從片外DRAM拷貝到片內(nèi)SRAM需要控制邏輯,這里實現(xiàn)了一個寄存器用來存儲累加和accum,先用并行處理的方法將DRAM的每個條目拷貝到片內(nèi),然后將片內(nèi)存儲進行累加和處理結果保存到accum寄存器。最后將accum寄存器給result寄存器,用argOut的方法輸出給Host處理器。
回想一下我們是不是必須要使用序列控制器來實現(xiàn)點乘?因為點乘可以看做是一個縮減的操作,數(shù)據(jù)之間使用沒有依賴關系,我們可以用流水的方式進行處理。
將sequential語句改成reduce語句
得到硬件設計框圖如上圖所示。再考慮一下如何對該硬件結果進行優(yōu)化?
并行處理是一個重要的思路,代價是增加加法器和乘法器的開銷。首先是對計算內(nèi)積進行并行處理,并行度為4
得到的硬件結構為:
可以看到并行執(zhí)行使用了4套加法器和乘法器邏輯。
也可以對累加縮減進行并行處理,并行度為2,得到硬件結構如下所示
相比于內(nèi)積并行,累加縮減并行少用了乘法器,但增加了寄存器的用量,并且增加了計算延遲。不過內(nèi)積并行對于片上存儲帶寬要求很高,出數(shù)寬度等于原始數(shù)據(jù)寬度乘以并行度,這樣會帶來一定的開銷(線開銷,以及存儲器面積的變化)
最后思考一下性能分析,我們關心的一個是完成計算的拍數(shù),第二個就是資源利用率
從完成拍數(shù)上看,使用reduce流水的方法相比于序列串行實現(xiàn)的提升效果明顯,并行能夠縮減1倍的延遲是因為并行使用了reduce(2,4)并行,限制在2倍并行。但并行對操作個數(shù)提升很大,提升了6倍多
假設使用一個更大的并行度,外層并行度為2,內(nèi)積并行度為128,tilesize并行度為256
得到的性能如下表所示
如此大的并行度對延遲的減少并不明顯,對操作吞吐量的提升很大,但是存儲容量也爆炸增長。
從以上實驗結果分析可以基本得出:
tilesize的大小和片上BRAM的容量直接相關
并行度和操作吞吐量直接相關
延遲受外層并行度制約。
總結
以上是生活随笔為你收集整理的numpy 点乘_斯坦福CS217(六)Spatial点乘示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 米兔积木机器人能飞吗_米兔积木机器人AP
- 下一篇: 自定义曲线_完美动力小课堂:Animat