iOS上矩阵乘法方案
1.基于CPU的加速框架BLAS
2.基于GPU的MPS框架中的MPSMatrixMultiplication库
3.基于GPU的MPS框架中的MPSCNN框架,这个主要用于CNN神经网络方面的,CNN的全连接可以近似为特殊的矩阵相乘
Metal简介
Metal 是针对 iPhone 和 iPad 中 GPU 编程的高度优化的框架。其名字来源是因为 Metal 是 iOS 平台中最底层的图形框架 (意指 "最接近硬件")。
该框架被设计用来实现两个目标: 3D 图形渲染和并行计算。这两者有很多共同点。它们都在数量庞大的数据上并行运行特殊的代码,并可以在 GPU 上执行。
Metal使用场景
目前,Metal 的资源非常有限,并且仅限于搭载了 64 位处理器的 iPhone 和 iPad。但另外一方面,因为 OpenGL 的限制,其性能与 Metal 相比并不占优势,毕竟后者是专门用来解决这些问题的。
如果想要一个 iOS 上高性能的并行计算库,答案非常简单。Metal 是唯一的选择。OpenCL 在 iOS 上是私有框架,而 Core Image (使用了 OpenCL) 对这样的任务来说既不够强大又不够灵活。
MPSMatrixMultiplication使用步骤
1.初始化数组,然后该数组放置到MTLBuffer中
2.构造矩阵,Matrix = MTLBuffer + 描述信息
3.创建运算内核
4.编码内核到command Buffer中
5.提交计算
MPSMatrixMultiplication VS BLAS
- BLAS处理小型矩阵快,MPSMatrixMultiplication处理大矩阵快,临界值取决于设备,运算数据等条件
- BLAS是直接操作数组,MPSMatrixMultiplication处理数组时,需要把数据load到MTLBuffer中,取出结果需要copy或者使用指针,另外MTLBuffer大小为256MB
- BLAS使用Double类型,MPSMatrixMultiplication使用float32类型,BLAS精度更高
- BLAS对方阵有优化,即使矩阵很大,速度可能比MPSMatrixMultiplication快
- MPSMatrixMultiplication在矩阵列为4的倍数时候,性能最佳
MPSMatrixMultiplication VS 全连接
- 全连接运算速度很快,使用float16,所以精度损失了一些,实际上做的是矩阵乘法的近似运算,在三种方案中,误差是最大的
- 全连接运算在每次创建全连接对象后,权重矩阵不能更改,对于有相同的权重矩阵的运算来说,是比较合适的
实现
真机测试
- iPad Air 2 Wi-Fi
参数:苹果 A8X芯片,处理器三核, GPU八核 - iPhone 6
参数:苹果 A8+M8协处理器,双核,GPU是四核增强版PowerVR GX6450
结果可以看出,在92 x 2052 * 2052 x 1的矩阵相乘中,BLAS的速度最快,但并不能说明GPU处理速度没有CPU快,GPU适合处理大矩阵运算。
运算耗时取决于运算的次数,一般来说,运算次数计算如下:
rowsA × columnsB × (columnsA + (columnsA - 1))
在测试中发现,数量级大于1e10的时候,建议使用MatrixMultiplication,这个数值的大小跟CPU,GPU的性能有关,不同的设备临界值会有差异。