首页 > 其他分享 >ZigZag :nested loop 的教科书

ZigZag :nested loop 的教科书

时间:2024-08-04 18:27:58浏览次数:11  
标签:search 映射 ZigZag nested 搜索 memory 维度 loop

ZigZag 在 PE array-memory hierarchy level 上对 nested-loop based 算子数据部署设计策略进行详细分析。文章作者来自鲁汶 MICAS [1]实验室。

软硬件建模

软件上只涉及 MAC-based 的网络算子(Linear、Convolutional),沿用 time-loop [2] 方法使用 nested-loop 建模,从 operand(Input、weight、output)以及不同维度(kernel size、channel size……)俩个角度囊括高维 tensor 算子。

架构上包括计算部分 2D PE array 和存储部分 unbalanced uneven memory hierarchy。Unbalanced-uneven 分别是从硬件架构-映射两个角度对不同 operator 定制化数据流,unbalanced 思想可追溯 14 年 DIANNAO, activation 和 weight buffer 物理上分离以便针对性发挥更自由的控制流,uneven 则是物理架构确定后,就算物理存储架构相同也可以根据 operator 制定不同映射策略。

Memory Model

通过 nested loop 数据被抽象成一组维度的组合,将该数据的不同维度分配到不同的 memory level 的过程称之为部署。算法部署过程要满足计算正确的约束,即维度的循环顺序应当是一直的。通过 nested loop 模型可以导出 memory access 次数以及不同 hierarchy 之间的 datawidth,这之中的设计空间在于 trade-off 不同 operator、不同 hierarchy 之间的 data reuse。具体分析见原文或以前博文[3]不予展开。

搜索空间组成

搜索空间包括硬件参数以及映射策略俩层搜索。二者分层搜索,外层硬件内层软件映射,因此硬件搜索时不会以映射的性能作为 feedback(待考证)。硬件搜索根据 area-constraint 和用户定义的一系列 constraint 搜索出一系列符合要求的硬件参数组合(memory size、 data width ...),接着每个独立进行软件映射搜索。

映射搜索又分作两部分:计算阵列数据流的 Spatial Mapping 以及存储控制流 Temporal Mapping。Temporal Mapping 又分为 loop blocking 以及 loop ordering——先从篮子里挑出要排序的鸡蛋(分配调度维度大小),然后再给鸡蛋排序。

搜索空间剪枝

搜索空间剪枝分为俩种类型:(1)搜索空间中有许多点天然是完全等价的,因此可以无损剪枝减少搜索空间,理论上不会影响搜索结果;(2)另外基于一些先验进行剪枝,需要实验结果验证不影响搜索结果。

文中提及多个搜索策略,实际上他们之间有些并不是互斥而是兼容的(比如 heuristic search v2 就是对 v1 的全覆盖),将每个方法拎出来单独测试起到 sensitivity study 的作用。

  • Spatial Mapping
    • exhaustive search
    • heuristic search v1
    • heuristic search v2
  • Temporal Mapping
    • exhaustive search
    • heuristic search v1
    • heuristic search v2
    • iterative search

Spatial Mapping 剪枝

heuristic v1 利用了 kernel 和 feature 中对于 x、y 方向维度的对称性,这些对称的点理论上性能表现是一样的;heurisitic v2 利用 operand 之间的依赖关系,通过加入 W/I/O 的 Pareto surface 函数关系减少搜索自由度(具体怎么得到 Pareto surface 有待考证)。

Temporal Mapping 剪枝

heuristic v1 则是固定数据(data stationary)提高数据复用度,无关维度应放在向下贴近 memory hierarchy 分界线的地方以扩大数据复用(如果从变量生存周期图上思考,将无关维度放循环最底层将变量调用的点连成了一条线,进而减少 memory access 的次数); heuristic v2 则是若某一个 level 的 memory 映射不存在无关维度,即不存在复用度,那么这个 level 之下的维度没有 ordering 的必要了(因为 DRAM 层包括所有维度一定包括无关维度对此层不成立)。

最后 iterative search 实际上是 rough/fine-grained search 策略,人为给 memory level 设置虚拟的 level 分界线,先搜索底层,得到结果后固定底层映射策略再囊括更高层。

总结

就目前阅读过的文章而言,这篇能够排在前三。本文非常适合 MAC 映射学习,从软件建模、硬件建模到部署策略的分析。当初也是通过阅读此文 get 到了 memory hierarchy 的含义。

此外文章主要是针对 1-layer 层面进行分析,全体网络结果只是简单相加实际,并且只涉及 MAC-based 的数据优化。Application domain 在链图(Path Graph)并且核心计算量在于 MAC 的网络(比如传统卷积 VGG、ResNet、MobileNet),对于图拓扑更加自由以及非线性算子也有相等比重的网络应当再弥补编译器方面的 scheduler problem 讨论。


  1. https://github.com/KULeuven-MICAS ↩︎

  2. https://timeloop.csail.mit.edu/ ↩︎

  3. https://www.cnblogs.com/devil-sx/p/18209577 ↩︎

标签:search,映射,ZigZag,nested,搜索,memory,维度,loop
From: https://www.cnblogs.com/devil-sx/p/18342054

相关文章

  • [米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-16 SPI LOOP环路实验
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 1概述在前面完成了SPI发......
  • 从头理清uboot(3)-main_loop 及 CMD实现
    从头理清uboot(3)-main_loop及CMD实现目录从头理清uboot(3)-main_loop及CMD实现1.main—loop函数2.cmd_process函数分析3.cmd定义流程1.main—loop函数上篇引导启动的分析最后会调用run_main_loop,在其中会循环调用main_loop()函数。见下方:staticintrun_main_loop(v......
  • iOS开发- RunLoop
    RunLoop用于管理事件的循环处理机制。运行循环在应用程序的主线程中自动启动,负责监听和分发各种事件,包括用户交互(如触摸事件)、定时器事件、选择器调用和其他异步回调。运行循环的作用运行循环的主要作用包括:处理输入事件:运行循环监听用户的输入,如触摸、点击和滑动事件,并将它们......
  • netty入门-3 EventLoop和EventLoopGroup,简单的服务器实现
    文章目录EventLoop和EventLoopGroup服务器与客户端基本使用增加非NIO工人NioEventLoop处理普通任务与定时任务结语EventLoop和EventLoopGroup二者大概是什么这里不再赘述,前一篇已简述过。不理解也没关系。下面会简单使用,看了就能明白是什么这篇文章只说NioEvent......
  • 一文彻底搞懂浏览器事件机制、事件委托、事件冒泡、事件循环、Event Loop、react事件
    一、事件是什么?事件模型?事件是用户操作网页时发生的交互动作,比如click/move,事件除了用户触发的动作外,还可以是文档加载,窗口滚动和大小调整。事件被封装成一个event对象,包含了该事件发生时的所有相关信息(event的属性)以及可以对事件进行的操作(event的方法)。事件是用......
  • bluez glib编程 --- main loop(主循环)
    主循环是事件驱动编程的核心概念,广泛应用于图形用户界面(GUI)和其他需要持续处理事件的应用中。它的主要作用是不断地检查和处理事件,如用户输入、网络数据、定时器等。在一个典型的主循环中,应用程序会做以下工作:检查是否有任何事件发生(如鼠标点击、键盘输入)。处理这些事件并执行......
  • iOS开发基础124-RunLoop实现卡顿检测
    利用RunLoop实现卡顿检测的基本思路是通过监听RunLoop的状态变化来判断主线程的执行时长。如果RunLoop在某个状态停留的时间超过了预设的时间阈值,则认为发生了卡顿。在具体实现中,可以利用CFRunLoopObserver来监听RunLoop的状态变化,并记录时间差。一、卡顿检测的基本原......
  • iOS开发基础122-RunLoop
    深入探讨RunLoop的底层实现需要了解CoreFoundation框架中的CFRunLoop以及与RunLoop工作机制紧密相关的操作系统底层API。这些底层实现主要涉及到事件源、定时器和线程的调度机制。本文将深入剖析RunLoop的底层结构及其运行流程。一、RunLoop底层数据结构涉及RunLo......
  • Factory method 'redissonClient' threw exception; nested exception is java.lang.I
    你遇到的这个错误是在Spring框架中常见的,它表示在创建Bean的过程中,有一个依赖关系未能得到满足。在这个特定的情况下,错误发生在创建voucherOrderController和voucherOrderServiceImpl这两个Bean时,其根本原因是无法实例化redissonClient,而redissonClient的创建失败是因为提供的Redi......
  • costas_loop,costas_loop.v
      /*dsp48a1x2dsp48a1x2滤波器阶数4480n抽取倍数27x5x采样率64.8M2.4M......