website: Add 'gem5-22.1 Released!' blog post

Change-Id: I30261c4c7c795078bd29f714c953b3cf2a6a5970
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5-website/+/67174
Reviewed-by: Bobby Bruce <bbruce@ucdavis.edu>
Maintainer: Bobby Bruce <bbruce@ucdavis.edu>
Tested-by: Bobby Bruce <bbruce@ucdavis.edu>
diff --git a/_posts/2022-12-30-gem5-22-1.md b/_posts/2022-12-30-gem5-22-1.md
new file mode 100644
index 0000000..ae7e98b
--- /dev/null
+++ b/_posts/2022-12-30-gem5-22-1.md
@@ -0,0 +1,359 @@
+---
+layout: post
+title:  "gem5-22.1 Released!"
+author: Bobby R. Bruce
+date:   2022-12-30
+categories: project
+---
+
+The latter half of 2022 saw 500 commits submitted to gem5, from 48 unique contributors
+
+Our top 10 contributors for the v22.1 release were:
+
+- Bobby R. Bruce (143 commits)
+- Giacomo Travaglini (63 commits)
+- Gabe Black (53 commits)
+- Matthew Poremba (49 commits)
+- Jason Lowe-Power (19 commits)
+- Yu-hsin Wang (18 commits)
+- Zhantong Qiu (11 commits)
+- Earl Ou (10 commits)
+- Tiago Mück (9 commits)
+- Quentin Forcioli (9 commits)
+
+We wish to thank all of the gem5 community who made this gem5 release possible.
+We look forward to your continued support for the upcoming v23.0 release.
+
+The latest version of gem5 can be obtained by pulling the latest version of the gem5 git repo `stable` branch:
+
+```shell
+git clone https://gem5.googlesource.com/public/gem5
+
+# or, within the gem5 repo
+
+git switch stable
+git pull
+```
+
+## Major New Features
+
+Several new features were included in the v22.1 release.
+Here we outline some key highlights and how to use them.
+For a more comprehensive list of contributions, please consult the [Release Notes](https://gem5.googlesource.com/public/gem5/+/refs/tags/v22.1.0.0/RELEASE-NOTES.md).
+
+### Multiple ISA Compilations
+
+Prior to v22.1 users of gem5 could only compile a single ISA target into a gem5 binary.
+E.g., `scons build/X86/gem5.opt` would create a gem5 binary with the X86 ISA but no other.
+In gem5 v22.1 users can compile any combination of ISAs into a gem5 binary.
+The `build_opts` directory includes `ALL` which can be used to compile a binary containing all ISA targets with `scons build/ALL/gem5.opt`.
+
+With multi-ISA binaries the ISA used in simulation specified via which core is used.
+For example, using an `X86TimingSimpleCPU` will use the X86 ISA.
+When using the standard library API, you can carry out simulations as before by specifying the ISA to setting up the system processor.
+
+Below is a simple ARM program in SE mode:
+
+```python
+from gem5.isas import ISA
+from gem5.utils.requires import requires
+from gem5.resources.resource import Resource
+from gem5.components.memory import SingleChannelDDR3_1600
+from gem5.components.processors.cpu_types import CPUTypes
+from gem5.components.boards.simple_board import SimpleBoard
+from gem5.components.cachehierarchies.classic.no_cache import NoCache
+from gem5.components.processors.simple_processor import SimpleProcessor
+from gem5.simulate.simulator import Simulator
+
+# This ensures that the ARM ISA is compiled into the binary.
+requires(isa_required=ISA.ARM)
+
+cache_hierarchy = NoCache()
+memory = SingleChannelDDR3_1600(size="32MB")
+
+# Here we must specify the ISA we are using via the `isa` parameter.
+processor = SimpleProcessor(cpu_type=CPUTypes.TIMING, isa=ISA.ARM, num_cores=1)
+
+board = SimpleBoard(
+    clk_freq="3GHz",
+    processor=processor,
+    memory=memory,
+    cache_hierarchy=cache_hierarchy,
+)
+
+board.set_se_binary_workload(Resource("arm-hello64-static"))
+
+simulator = Simulator(board=board)
+simulator.run()
+```
+
+This can be run with `build/ALL/gem5.opt` and ARM ISA will automatically be used as it was specified via the `isa` parameter when setting `SimpleProcessor`.
+
+### API to set tick-based Exit Events
+
+It is common when running gem5 to want the simulation to Exit at a particular simulation tick.
+The typical manner in which this is achieved is by moving the `MAX_TICK` value of the simulation but this is limiting as it only allows for a single tick to be specified as en exit event.
+Until v22.1, the API for specifying exits at others ticks was not well exposed and difficult to use.
+As such the following functions have been added to the `m5` Python module:
+
+- `setMaxTick(tick)` : Used to to specify the maximum simulation tick.
+- `getMaxTick()` : Used to obtain the maximum simulation tick value.
+- `getTicksUntilMax()`: Used to get the number of ticks remaining until the maximum tick is reached.
+- `scheduleTickExitFromCurrent(tick)` : Used to schedule an exit exit event a specified number of ticks in the future.
+- `scheduleTickExitAbsolute(tick)` : Used to schedule an exit event as a specified tick.
+
+The `setMaxTick` function provides a cleaner interface for setting the maximum tick the simulation is to run to.
+When reached a `MAX_TICK` exit event is returned by the simulator.
+The `scheduleTickExit` functions allow for the scheduling of any number of tick exit events.
+When reached a `SCHEDULED_TICK` exit event is returned by the simulator.
+The `scheduleTickExitFromCurrent` function schedules the exit event N ticks in the future, with N being provided by the user.
+The `scheduleTickExitAbsolute` function allows for the scheduling at a specific simulation tick (e.g., at Tick 1,000).
+
+Below is a simple simulation showing the scheduling of `SCHEDULED_TICK` exit events at 100, 1000, 10000, and 100000 ticks in the future.
+
+```python
+from gem5.resources.resource import Resource
+from gem5.isas import ISA
+from gem5.components.memory import SingleChannelDDR3_1600
+from gem5.components.boards.simple_board import SimpleBoard
+from gem5.components.cachehierarchies.classic.no_cache import NoCache
+from gem5.components.processors.simple_processor import SimpleProcessor
+from gem5.components.processors.cpu_types import CPUTypes
+from gem5.simulate.simulator import Simulator
+from gem5.simulate.exit_event import ExitEvent
+
+import m5
+
+board = SimpleBoard(
+    clk_freq="3GHz",
+    processor=SimpleProcessor(
+        cpu_type=CPUTypes.TIMING,
+        isa=ISA.X86,
+        num_cores=1,
+    ),
+    memory=SingleChannelDDR3_1600(),
+    cache_hierarchy=NoCache(),
+)
+board.set_se_binary_workload(Resource("x86-hello64-static"))
+
+
+def scheduled_tick_generator():
+    while True:
+        print(f"Exiting at: {m5.curTick()}")
+        yield False
+
+
+simulator = Simulator(
+    board=board,
+    on_exit_event={ExitEvent.SCHEDULED_TICK: scheduled_tick_generator()},
+)
+
+m5.scheduleTickExitFromCurrent(100)
+m5.scheduleTickExitFromCurrent(1000)
+m5.scheduleTickExitFromCurrent(10000)
+m5.scheduleTickExitFromCurrent(100000)
+
+simulator.run()
+```
+
+In this script the Simulator's `on_exit_event` parameter is utilized to handle the exit event by printing the tick number at exit, then continuing the simulation.
+The output of this simulation will be:
+
+```shell
+Exiting at: 100
+Exiting at: 1000
+Exiting at: 10000
+Exiting at: 100000
+```
+
+### The RISCVMatchedBoard
+
+For some time there has been a desire to distribute SimObjects, stdlib components, and systems with "known-good" properties.
+That is, configurations capable of running simulations with reasonable fidelity to their real-world counter parts.
+While still early days, the `RISCVMatchedBoard` is our first step into this endeavor.
+
+The `RISCVMatchedBoard` is based on SiFive's [HiFive Unmatched board](https://www.sifive.com/boards/hifive-unmatched): a RISC-V, 64 bit Linux development platform with a SiFive Freedom U740 multi-core processor.
+Research at UC Davis sat down with the HiFive Unmatched board and carefully benchmarked its properties, then translated this to a gem5 design.
+The design has been incorporated into the gem5 Standard Library and can be found at "src/python/gem5/prebuilt/riscvmatched/riscvmatched_board.py".
+
+Below is an example of using the `RISCVMatchedBoard` to run a Full-System simulation.
+
+```python
+from gem5.prebuilt.riscvmatched.riscvmatched_board import RISCVMatchedBoard
+from gem5.utils.requires import requires
+from gem5.isas import ISA
+from gem5.simulate.simulator import Simulator
+from gem5.resources.workload import Workload
+
+requires(isa_required=ISA.RISCV)
+
+board = RISCVMatchedBoard(
+    clk_freq="1.2GHz",
+    l2_size="2MB",
+    is_fs=True,
+)
+
+workload = Workload("riscv-ubuntu-20.04-boot")
+board.set_workload(workload)
+
+simulator = Simulator(board=board)
+simulator.run()
+```
+
+Work is still on-going to fine tune the parameters of this board to have it more-so emulate the real-world board's behavior and details will be published in the future to highlight our overall success.
+We will continue to develop "known-good" systems for gem5 and incorporate them as part of future gem5 releases.
+
+### SimPoints
+
+An API for [SimPoints](https://doi.org/10.1145/885651.781076) has been added.
+SimPointing is a technique to substantially improve simulation time.
+It works by only sampling representative parts of a simulation then extrapolating statistical data accordingly.
+By doing this remaining parts of a simulated program can be skipped.
+
+In combination with gem5 Workloads (see the [section below](#workloads) for more information on Workloads) we can distribute binaries with SimPoint information and gem5 Checkpoints.
+These can then be executed via the SimPoint API, thus producing faster simulation runs.
+
+Examples of using SimPoints with gem5 can be found in “configs/example/gem5_library/checkpoints/simpoints-se-checkpoint.py” and “configs/example/gem5_library/checkpoints/simpoints-se-restore.py”.
+
+We are going to continue to expand and fine-tune this API.
+Of note, we are going to incorporate [LoopPoints](https://doi.org/10.1109/HPCA53966.2022.00051) into the gem5 framework, which will allow for SimPoints to work in multi-core simulations (a current limitation of the SimPoints framework).
+
+### Workloads
+
+As an expansion of the gem5-resources infrastructure, the concept of a  `Workload` has been introduced.
+The gem5-resources infrastructure has, for several major releases, provides resources.
+As an example:
+
+```python
+from gem5.resources.resource import Resource
+
+image = Resource("x86-npb")
+kernel = Resource("x86-linux-kernel-5.4.49")
+binary = Resource("x86-print-this")
+
+...
+
+board.set_se_simpoint_workload(
+    binary=binary,
+    arguments=["hello", 1500]
+)
+```
+
+Here we three resources are requested.
+"x86-npb" is an X86 disk image containing the NAS Parallel Benchmark suite built atop the Ubuntu operating system, "x86-linux-kernel-5.4.49" is the v5.4.49 Linux Kernel, and "x86-print-this" is a binary which accepts two arguments: a string to be printed, and the number of times to print it".
+The board is then set to run the "x86-print-this" binary with the arguments "hello" and "1500".
+
+While powerful, obtaining resources in this manner has some limitations.
+First of all, running a simulation may require multiple resources to be maintained.
+Some resources will almost always require other resources to run.
+For example, our "x86-npb" disk image resource is useless without a kernel.
+
+The other issue beyond obvious couplings of resources is resources may require particular parameters to be passed to be useful.
+For example, the "x86-npb" contains a suite of benchmark applications but specific command line parameters must be passed to specify what benchmark with what input is to be run.
+In efforts to simplify usage of gem5, we want users to simply specify what they want their simulated system to run.
+For example, "x86-npb-FS-input-A".
+
+The solution to these problems are Workloads.
+Workloads allow for the bundling of resources and any input parameters.
+User's need only specify the workload they wish to run and the gem5 Standard Library, interfacing, with the gem5-resources infrastructure, will setup the simulation to run correctly.
+
+```python
+from gem5.prebuilt.demo.x86_demo_board import X86DemoBoard
+from gem5.resources.workload import Workload
+from gem5.simulate.simulator import Simulator
+
+board = X86DemoBoard()
+
+board.set_workload(Workload("x86-ubuntu-18.04-boot"))
+
+simulator = Simulator(board=board)
+simulator.run()
+```
+
+"kernel" : "x86-linux-kernel-5.4.49",
+                "disk_image":"x86-ubuntu-18.04-img"
+
+Below we show using the "x86-ubuntu-18.04-boot" workload.
+This workload will use the "x86-linux-kernel-5.4.49" resource for the simulation kernel and the "x86-ubuntu-18.04-img" resource for the disk image.
+Upon boot completion the simulation will exit.
+
+Another example would be the "x86-print-this-15000-with-simpoints" Workload.
+This specifies an SE workload running the "x86-print-this" binary resource, passing the parameters "print this" and "1500" with the "x86-print-this-1500-simpoints" simpoint resource.
+
+At the time of writing the following Workloads are available to use:
+
+- "x86-ubuntu-18.04-boot" : Runs an X86 Ubuntu 18.04 boot.
+- "riscv-ubuntu-20.04-boot" : Runs an RISC-V Ubuntu 20.04 boot.
+- "arm64-ubuntu-20.04-boot" : Runs an ARM-64 Ubuntu 20.04 boot.
+- "x86-print-this-15000-with-simpoints" : Runs the "print-this" binary, print 15000 "print this" string to the terminal, with SimPoints.
+- "x86-print-this-15000-with-simpoints-and-checkpoint" : Runs the "print-this" binary, print 15000 "print this" string to the terminal, with SimPoints and checkpoints.
+
+More Workloads will be added overtime to provide the gem5 community with a rich variety of workloads they may plug into their simulations.
+
+### pre-commit checks for developers
+
+In order to help gem5 developers adhere to the gem5 style guide, we have added the [pre-commit framework](https://pre-commit.com) to the gem5 repository.
+The pre-commit framework manages git hooks for the repository.
+We use this to run a suite of checks on code users wish to submit to code-review via a hook run when the `git commit` command is executed.
+
+In particular, we now utilize the [black Python code formatter](https://github.com/psf/black) on all Python code submitted to the gem5 repository.
+
+In v22.1, when compiling gem5, the user will be asked if they wish to install the pre-commit hook if not already installed.
+With consent from the user, the hook will be installed.
+If a user wishes to install the hook manually they may do so by running the following in the gem5 repository:
+
+```shell
+pip install -r requirements.txt
+./util/pre-commit-install.sh
+```
+
+Once installed, any staged code will be processed when `git commit` is executed.
+Users may also run the pre-commit on any file or directory they wish by using the following command:
+
+```shell
+pre-commit run --files path/to/file/or/directory
+```
+
+**We strongly advise users to install the pre-commit hooks**.
+Our code-review pre-submit CI tests have been updated with the pre-commit tests.
+If they fail, users will be unable to incorporate their patches to the code-base until the code is refactored so the pre-commit tests pass.
+
+### GPU Full-System mode
+
+In v21.2 we introduced GPU support with Syscall-Emulation (SE) mode and in v22.0 we laid the early framework for Full-System (FS) Support support.
+In v22.1 we're happy to announce substantially improved support for GPU simulation in FS mode.
+
+Until v22.1, SE mode was preferred due to its relative stability.
+However, GPU SE simulation needed the user to have a very specific environment on their host system, primarily due to the GPU simulator requiring a very specific ROCm software stack for dynamic linking to workloads.
+A Docker container was created to provide this environment this, naturally, required all simulations to be carried out within the container.
+
+The full incorporation of FS mode for GPU simulation removes all host requirements and all SE-mode simulations may be run as an FS mode simulation.
+
+The GPU FS mode has also has improved simulated speed by functionally simulating memory copies, and provides an easier update path for gem5 developers.
+
+For the meantime, we strongly advise users to run GPU FS mode on an X86 host using KVM mode to skip boot and other irrelevant simulation tasks.
+GPU simulation is very resource intensive so care should be taken as to not simulate unnecessary code.
+
+## Community Affairs
+
+In the summer of 2022 we held a gem5 Bootcamp at UC Davis.
+The first of its kind, the Bootcamp was setup to give early-stage computer architecture researchers an opportunity to learn gem5 for an intensive 5 day course.
+With over 80 applicants we selected 50 due to venue constraints and held the Bootcamp in July, hosting all attendees in UC Davis accommodation.
+
+The course was carefully designed to take the researchers, most of who were 1st year PhD students, from a very basic understanding of gem5 through to complex tasks such as adding ISA instructions, developing models, learning about various differences in gem5 CPU models, accelerating simulations, and the gem5 GPU model.
+Leveraging expertise and UC Davis, we were also able to give attendees tailored advice on how to use gem5 for their particular research agendas in special 1-on-1 sessions.
+In a survey taken after the event, it was found that 95% of attendees "strongly agreed" that the Bootcamp was valuable to them in getting starting with gem5 and 100% of attendees were "more likely or "much more likely" to use gem5 in their research.
+
+We have made efforts to archive the events [via our YouTube channel](https://youtube.com/playlist?list=PL_hVbFs_loVSaSDPr1RJXP5RRFWjBMqq3) and have encapsulated teaching materials in the [Bootcamp website](https://gem5bootcamp.github.io/gem5-bootcamp-env/).
+We encourage users to utilize these resources for learning gem5.
+
+### Future events
+
+In the February 2023 we'll be holding a [gem5 Tutorial at HPCA](https://www.gem5.org/events/hpca-2023).
+This tutorial will give attendees a 3-hour crash course in using gem5.
+This will include emphasis on new gem5 features, such as that incorporated into the v22.1 release.
+Based on feedback from previous tutorials, we will also include a short session on using the GPU FS model in gem5.
+
+In July (10th to the 14th), UC Davis will be hosting the 2nd gem5 Bootcamp.
+With similar goals to the Bootcamp held in 2023, this event will give an intensive 5 day course for early-career computer architecture researchers, particularly those in the first two years of a PhD programme.
+Please join the [gem5 announce mailing list](https://www.gem5.org/mailing_lists/) or keep an eye on or [gem5 events page](https://www.gem5.org/events) for upcoming information on registering interest for this event.