Metal矩阵乘法的方案对比

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
Metal矩阵乘法的方案对比_第1张图片
iPad耗时对比.png
Metal矩阵乘法的方案对比_第2张图片
iPhone6耗时对比

结果可以看出,在92 x 2052 * 2052 x 1的矩阵相乘中,BLAS的速度最快,但并不能说明GPU处理速度没有CPU快,GPU适合处理大矩阵运算。
运算耗时取决于运算的次数,一般来说,运算次数计算如下:

rowsA × columnsB × (columnsA + (columnsA - 1))

在测试中发现,数量级大于1e10的时候,建议使用MatrixMultiplication,这个数值的大小跟CPU,GPU的性能有关,不同的设备临界值会有差异。

Demo

参考文章

Matrix Multiplication with Metal Performance Shaders
Metal

你可能感兴趣的:(Metal矩阵乘法的方案对比)