上一節簡單介紹了多線程的概念,同時也介紹了在使用多線程編程時,對于數據在線程間的切分,應該遵循的一個原則:那就是切分獨立的數據快,而不切分有數據依賴的數據塊。
最后還拋出了一個問題:對于卷積算法而言,你覺的切分哪個維度最合適呢?
卷積的切分
之前花了很多篇幅來介紹卷積算法,可以返回這里的前后文章來復習一下卷積算法。
總的來說,卷積運算的核心是乘累加運算。這里所謂的乘累加運算,就是將卷積核 [kh, kw] 范圍內的數據與對應的 [hi, wi] 范圍的數據在 ci 方向對應位置相乘,然后再累加成一個數據作為最終輸出。
因為要把這些維度的數據最終累加成一個值,因此這些維度的數據就是存在依賴的數據,因此這些維度不好拆分。
如果硬要在 kh, kw, hi, wi, ci 這些維度做拆分,那么顯而易見的是,需要將拆分到多個線程中的數據計算的結果,再進一步累加,得到一個數據作為最終輸出。
有些時候,我會把 kh, kw, hi, wi, ci 這幾個維度,稱為卷積的累加維度,或者叫做 reduce 維度。
無論是做多線程編程,還是利用 GPU 或者其他 AI 芯片做卷積的加速,亦或是做其他算法的優化加速,這些 reduce 維度的數據拆分都是很麻煩的,因此盡量不要去拆這些維度的數據。
那除了這些 reduce 維度之外,卷積運算還有 ho, wo, co 這幾個維度可以考慮。
但是,我們根據卷積的