Open ysh329 opened 5 years ago
发掘 ARM GPU 的全部深度学习性能,TVM 优化带来高达 2 倍性能提升 - 云+社区 - 腾讯云 https://cloud.tencent.com/developer/article/1063193
Mali Midgrad GPU
我们将使用带有 Mali-T860 MP4 的 Firefly-RK3399 作为我们的测试环境,所以我们下面主要关注 Mali T8xx。
架构
图 1 是 T860 和 T880 上的 Mali 架构图。GPU 可扩展到 16 个连通着色器核心(Coherent shader cores)。在每个着色器内核中,有 2 或 3 条运算流水线(Arithmetic pipelines),1 条加载 / 存储流水线(所谓的 TriPipe)。每个运算流水线中的 ALU 有四个 128 位向量单元和一个标量单元。我们使用 OpenCL 进行 GPU 计算。映射到 OpenCL 模型时,每个着色器核心负责执行一个或多个工作组。并且每个着色器核心最多支持 384 个并发执行的线程。OpenCL 中的每个工作项通常映射到 Mali GPU 上的单个线程。Mali GPU 使用 VLIW(超长指令字,Very Long Instruction Word)架构。每个指令字包含多个操作。Mali GPU 也可以使用 SIMD,因此大多数运算指令会在多个数据元素单元(Multiple data elements)上同时运行。[1]
图 1. Mali T860 和 T880(来源 [2])
与英伟达 GPU 相比的不同点
与英伟达 GPU 相比,下面是我们在为 Mali GPU 编写 OpenCL 代码时需要关注的一些区别点。
Mali GPU 使用统一的全局内存。在英伟达的 GPU 中,我们通常会将数据复制到共享内存中,因为英伟达的 GPU 在物理层面上将全局内存、共享内存和寄存器区分开了。在 Mali,这个复制操作并不会提高计算性能,因此可以移除这项操作。另外,Mali GPU 通常与 CPU 共享全局内存,所以 CPU 和 GPU 之间不需要数据的转移复制。 Mali Midgrad GPU 是基于 SIMD(单指令多数据)而设计的,并且需要显性地进行向量化。在英伟达的 CUDA 中,并行性是通过 SIMT(单指令多线程)实现的,不需要显性地进行向量化。但是也要注意,较新的 Mali Bitfrost GPU 是基于四式矢量(Quad-style vectorization),并不需要显性地进行向量化。 Mali GPU 中的所有线程都有独立的程序计数器。这意味着 warp 的大小为 1,所以分支发散(Branch divergence)不是一个大问题。
优化:以卷积操作为例
卷积层是大多数深度神经网络的核心,并且占用了大部分的计算时间。所以我们以卷积为例,说明如何在 TVM 中应用打包(Packing)、平铺(Tiling)、展开(Unrolling)和向量化(Vectorization)等常用技术。
使用 GEMM 实现 Im2Col
众所周知的卷积层算法是 im2col,它的原理是将小的 3D 输入立方体转换成矩阵的列并执行 GEMM 算法。这么做的优点在于,转化为矩阵运算之后可以使用高度优化的 BLAS 库。但是内存冗余问题(3x3 卷积存在 9 倍的内存冗余)也是相当可怕。
空间填充(Spatial Packing)
相反,我们采用另一种方法来计算卷积,并逐步应用一些优化技术。使用 VGG-16 中的卷积层作为微调样例,其配置如下所示。这里我们假设批量的大小为 1。
作为基准,我们还列出了 Arm Compute Library 中该层的性能。
声明计算过程:平铺和打包
平铺(Tiling)和打包(Packing)操作是用于更好地实现内存访问的两种方法。平铺操作将整个计算分成多个小块,以获得更好的数据重用(Data reuse)性能。包装操作则根据平铺重新排列输入矩阵,以便我们可以顺序地访问存储器,从而降低缓存未命中率。
ARM GPU Mali底层架构 - 王大牛 - 博客园 https://www.cnblogs.com/damumu/p/7320331.html
Midgard的计算性能也需要关注。Midgard打算通过同时支持Android RenderScript框架和OpenCL 1.2,并积极成为这个领域的一个强有力的竞争者。OpenCL目前在移动计算领域做得并不算太好,主要原因在于操作系统都没有对它提供一致性的支持,比如iOS,而安卓也是最近才开始支持,即使某些硬件支持OpenCL,但在支持的功能上也存在差异,最终限制了开发人员使用这项技术。在这一点上,ARM已经明确表示,他们的Midgard将完全支持这方面的GPU计算。 在分析Midgard的架构时,本文将从一个比较高的视角来观察它。下文给出了Midgard的着色器核心架构,尽管名称上被称之为“着色器”,但是实际上其中的内容非常丰富:“着色器”在本文中包含的内容不仅仅是一个普通着色器中所包含的“三管线(tri-pipe)”设计,还包含了三角形Setup模块、光栅化模块、Z轴消隐模块、ROP单元、tiling模块以及专门为通用计算和“三管线”而设计的一些线程控制模块。在之前的会议上曾经被提出过来,并明确说明不会支持曲面细分、几何着色器。一个Midgard的着色器,实际产品诸如Mali-T760,由于要充分考虑设计上的可扩展性,因此即使这个着色器包含了一个GPU的绝大部分内容,但是它依旧不能算作一个完整的GPU—因为部分周边部件并没有被放置在目前所介绍的着色器中。ARM设计了一个可扩展的、带有绝大部分功能的着色器,同时给出了一系列的共享硬件,厂商可以根据需要选择不同数量的着色器搭配共享模块,最终获得合适的GPU方案。Midgard支持从1个到16个“着色器”的设计方案,这也是最强悍的Mali-T760MP16的来源。Midgard的共享部分主要是一些管理模块,比如任务调度管理器等,其次是L2高速缓存、可以访问内存或者CPU缓存的内存控制器,最后还有系统总线AMBA 4 ACE-Lite。对于最强悍的Mali-T760MP16而言,ARM的设计方案中配置了一个任务管理单元和内存控制器,而为了满足16个核心的计算资源需求,ARM设计了两组L2高速缓存和总线接口。
说完了外围和全局设计,下面来看看核心本身,尤其是最重要的三管线设计。这个模块是整个GPU计算的核心,它由多个ALU单元、读/写单元和纹理单元组成。虽然很多的GPU设计基础部分都需要这三个模块,但是ALU可变设计着实非常少见—在不同型号的GPU上,ARM在相同的架构中使用了不同的ALU。 这句话听起来有点拗口。举例来说,在Mali-T760上,每个“三管线”包含了2个ALU,这也是Midgard中最常见的配置。此外,Midgard也拥有每个“三管线”中包含1个ALU和4个ALU的方案,前者比如Mali-T720,后者比如Mali-T678,此外还有Mali T628和Mali-T760一样都是每个“三管线”内含2个ALU。当然,在不同的“三管线”中使用不同数量的ALU带来了一些连锁效应,ARM调整了ALU和纹理单元、读/写单元之间的比率以获得相应的性能。比如Mali-T678,每个着色器采用4 ALU设计,因此这颗GPU的内部指标和其它的产品都有所不同,在纹理单元上为了配合增多的ALU也相应增加了。实际上ARM在Midgard上尝试了多种不同的配置方案,最终确定了在Mali-T760上使用每“三管线”2个ALU、以及在定位低端的Mali-T720上使用每“三管线”1个ALU的方案,并进一步优化了这样的设计。Midgard的设计使得GPU的每一个计算管道在任何情况下都有自己独立的线程,这和目前比较常见的超标量架构有明显不同,常见的超标量架构的一些附加计算单元可以在一个线程中用于执行进一步的无阻塞指令,而Midgard的设计可能会消除一些瓶颈效应从而带来效率的提升。
在看完了有关ALU的内容,下面来分析一下纹理单元。Midgard的纹理单元可以在一个时钟周期中处理一次双线性计算,或者在两个时钟周期内完成一次三线性计算。需要注意的是,这里分析的是内容是基于Mali-T760的ROP单元和纹理单元比例,另外,在任何情况下Midgard中的纹理单元和像素单元的比例都是1∶1。接下来的内容在图表中没有画出来,也就是曲面细分单元。要知道Mali-T760宣称支持Direct3D 11.1,但是为什么在架构中没有硬件的曲面细分模块呢?这并非遗漏或者ARM在吹牛,这是Midgard的一个独特设计。 Midgard可以执行曲面细分,但是它没有使用固定的功能来完成几何创建的过程。Midgard使用了着色器硬件的部分来执行曲面细分,不仅仅是在Hull和域着色器阶段,实际的几何生成过程也发生在着色器中。这和之前我们看到的几乎所有的硬件都完全不同,因为迄今为止还没有出现不使用专门的曲面细分硬件但同时又完成曲面细分功能的产品出现,Midgard首个这样设计的方案。
【未完待续】
一小时教你学会 ARM 架构 - GitChat技术杂谈 - CSDN博客 https://blog.csdn.net/GitChat/article/details/78410083
基于ARM在cpu上做神经网络加速 https://blog.csdn.net/deng497/article/details/69258081
嵌入式平台做深度学习算法,不可不重视的4件事 https://www.cnblogs.com/nwpuxuezha/p/6624106.html
arm从大的架构分为三个领域
目前能搞深度学习推理的也就Cortex-A系列(虽然Cortex-M4也行,但是片上内存太少,只能跑cifar10……),展开介绍Cortex-A,分两个方向:
1. 位宽
2. 架构
armv7a:A5、A7、A8、A9、A12、A15、A17 arm64-v8a:A35、A57、A72、A73、A75、A76
3. 深度学习最新支持
armv8.3指令集支持int8 dot指令集,A55、A76
4. 大小核
为了考虑功耗,平台待机、刷网页用小核心,打游戏、跑网络用大核心