上一节简单介绍了多线程的概念,同时也介绍了在使用多线程编程时,对于数据在线程间的切分,应该遵循的一个原则:那就是切分独立的数据快,而不切分有数据依赖的数据块。
最后还抛出了一个问题:对于卷积算法而言,你觉的切分哪个维度最合适呢?
卷积的切分
之前花了很多篇幅来介绍卷积算法,可以返回这里的前后文章来复习一下卷积算法。
总的来说,卷积运算的核心是乘累加运算。这里所谓的乘累加运算,就是将卷积核 [kh, kw] 范围内的数据与对应的 [hi, wi] 范围的数据在 ci 方向对应位置相乘,然后再累加成一个数据作为最终输出。
因为要把这些维度的数据最终累加成一个值,因此这些维度的数据就是存在依赖的数据,因此这些维度不好拆分。
如果硬要在 kh, kw, hi, wi, ci 这些维度做拆分,那么显而易见的是,需要将拆分到多个线程中的数据计算的结果,再进一步累加,得到一个数据作为最终输出。
有些时候,我会把 kh, kw, hi, wi, ci 这几个维度,称为卷积的累加维度,或者叫做 reduce 维度。
无论是做多线程编程,还是利用 GPU 或者其他 AI 芯片做卷积的加速,亦或是做其他算法的优化加速,这些 reduce 维度的数据拆分都是很麻烦的,因此尽量不要去拆这些维度的数据。
那除了这些 reduce 维度之外,卷积运算还有 ho, wo, co 这几个维度可以考虑。
但是,我们根据卷积的