PDOT简介
卷积可以分解成一种名为 im2col 的内存布局转换和矩阵相乘的组合。因此,卷积神经网络中的有效推理问题很大程度上可以看做矩阵乘法的有效实现问题——在线性代数库中也称为 GEMM。
当前的处理器上,这一实现会受到内存和缓存带宽,而不是乘-加单元计算力的限制。但一个小小的修改——同时计算几行 A 和几行 B 的点积——却使得性能大大提升。
修改后的基元加载 A 的 MR 及 B 的 NR 元素,实施 MRxNR 乘积累加运算。所有高性能矩阵乘法实现都建立在这个基元上,该基元通常被称为 PDOT(panel dot product)微内核。
QNNPACK的特殊之处
其他库为更好地利用缓存层次结构而重新编写A和B矩阵,希望在大量计算中摊销包装开销,而QNNPACK则是针对A和B的面板可以适应L1缓存的情况而优化的。
区别点:QNNPACK针对的是L1缓存。
QNNPACK的目的:
- 删除所有计算非必需的内存转换
怎么做的
QNNPACK把矩阵A、B都放进一级缓存 (L1 Cache) ,目标是把所有对运算过程并不非常必要的内存转换 (Memory Transformations) 都删掉。
QNNPACK可以在一次微内核调用 (Microkernel Call) 里,处理A和B。
无需在微内核之外积累 32 位的中间结果,QNNPACK 会将 32 位的中间结果整合进微内核中并写出 8 位值,这节省了内存带宽和缓存占用。
和tflite对比
QNNPACK比TensorFlow Lite几乎快一倍,不论是在高端智能机,还是普通智能机身上。
参考资料
QNNPACK: Open source library for optimized mobile deep learning
对应翻译: 让手机神经网络速度翻倍:Facebook开源高性能内核库QNNPACK