EventSimulator

less than 1 minute read

Published:

Sources: Simpy, Gem5, Structural Simulation Toolkit (SST)

Event Simulator

Event-driven Simulation是一种新的系统设计思想,与时钟驱动相比更加贴近实物对象,使开发更加容易,尽可能接近人类认识世界、解决现实问题的方法和过程。(我想到一个很恰当的比方:event-driven vs clock-driven == OOP(面向对象编程) vs POP(面向过程编程) )它使得系统设计时不再拘泥与每个clock在干什么,而是聚焦与各个对象之间的信息交互,也就是event。

下面是几个相关的模拟器介绍。

Simpy

Simpy是一个基于Python的事件驱动模拟器,核心是Python里的生成器,环境env使用next方法在时间表(wall clock)的记录下驱动事件,yield关键字负责分割事件的不同阶段。该模拟器最擅长对于共享资源的竞争使用的模拟。下表揭示了几个关键的概念。

pic1

Environment是模拟的大背景,process和event都是依赖env存在的。所以其实也可以创建多个env形成多个event queue。

Event是一个标志,在没有触发的时候闲置,触发后加入时间队列,等到规定时间调用所有回调函数(包括唤醒所属process的函数,也包括自定义的函数)。

Process经常是作为一个无限循环的状态机,由许许多多的Event间隔状态,在yield关键字使用后进入挂起状态,直到被event回调唤醒,也可以认为最上层的event就是process。

Event有三种状态:

  • might happen (not triggered)
  • is going to happen (triggered)
  • has happened (processed)

这三种状态可以从母Process中调度并trigger,也可以单独在event列表中使用trigger()方法来做。

Resource是可抢夺资源,使用前需要使用with语句块请求使用。

Simpy也支持实时模拟,即将一个time step绑定到一个实时的秒数上,可以模拟场景,并在模拟时有与人的IO,成为RealtimeSim。具体功能和示例可以看下面的ppt和官网。

simpy-ep14.pdf

Overview — SimPy 4.0.2.dev1+g2973dbe documentation

Python SimPy 仿真系列 (1) - 知乎 (zhihu.com)

Python SimPy 仿真系列 (2) - 知乎 (zhihu.com)

总的来说Simpy作为入门级的小型模拟器来说还是非常不错的,可以了解Event-driven sim的一些基本概念,来做一些更广义的模拟比如排队模型模拟。但是由于其缺乏对于实际硬件系统的支持,模拟SOC还是不太可行。

Structural Simulation Toolkit

SST 是用于 HPC 架构探索的开放式、模块化、并行、多目标、多尺度仿真框架。它本质上是各个模拟器的打包,包含许多组件:处理器、内存模型、网络组件和存储模型,以及多个功率模型,允许多目标设计空间探索。

pic2

pic3

该软件包的好处

  • 完全模块化的设计,可以对单个系统参数进行广泛的探索,而无需对模拟器进行侵入性更改。
  • 基于MPI的并行仿真环境。这提供了高水平的性能和查看大型系统的能力。
  • 众多成熟模拟器的集成,可以非常方便的调用。
  • 自定义功能块也很轻松。

编辑模块需要四个文件 (感觉风格很像gem5,都是即插即用):

  • Project Driver (.py)
  • C++ implementation
  • C++ header
  • makefile

下面是官网和油管教学视频:

SST 模拟器 (sst-simulator.org)

SST Training - YouTube

Gem5

我倾向于用gem5来模拟SOC,因为它完整统一的系统级模型和统计手段很完备,而且可以很好的模拟SOC整体性能。缺点就是有点复杂不够简洁,这点可能SST做的更好。

gem5-aladdin做了一个systolic array的clock-driven的加速器,可以参考这个设计来做一个event-driven的加速器

gem5: gem5 documentation

Comment

现阶段对于模拟器的选择,我更偏向于gem5的通用性和完整性,但是SST等新型的模拟工具包也有相关的可取之处,可以后续探索。