#!/bin/bash

# Copyright (c) 2021 The Regents of the University of California
# All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met: redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer;
# redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution;
# neither the name of the copyright holders nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

set -e
set -x

dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
gem5_root="${dir}/.."

# The per-container Docker memory limit.
docker_mem_limit="24g"

# The docker tag to use (varies between develop, and versions on the staging
# branch)
tag="latest"

# We assume the first three arguments are the number of threads to use for
# compilation followed by the GPU ISA to test, and finally, the number of
# "run threads", the maximum number of tests to be run at once. By default the
# number of compile threads 1 and the GPU ISA is GCN3_X86. The number of
# "run threads" is equal to the number of compile threads by default.
threads=1
gpu_isa=GCN3_X86
run_threads=1
if [[ $# -eq 1 ]]; then
    threads=$1
    run_threads=${threads}
elif [[ $# -eq 2 ]]; then
    threads=$1
    gpu_isa=$2
elif [[ $# -eq 3 ]]; then
    threads=$1
    gpu_isa=$2
    run_threads=$3
else
    if [[ $# -gt 0 ]]; then
        echo "Invalid number of arguments: $#"
        exit 1
    fi
fi

if [[ "$gpu_isa" != "GCN3_X86" ]] && [[ "$gpu_isa" != "VEGA_X86" ]]; then
    echo "Invalid GPU ISA: $gpu_isa"
    exit 1
fi

# Run the gem5 very-long tests.
docker run -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}"/tests --memory="${docker_mem_limit}" --rm \
    ghcr.io/gem5/ubuntu-22.04_all-dependencies:${tag} \
        ./main.py run --length very-long -j${threads} -t${run_threads} -vv

mkdir -p tests/testing-results

# GPU weekly tests start here
# before pulling gem5 resources, make sure it doesn't exist already
docker run -u $UID:$GID --rm --volume "${gem5_root}":"${gem5_root}" -w \
       "${gem5_root}" --memory="${docker_mem_limit}" \
       ghcr.io/gem5/gcn-gpu:${tag} bash -c \
       "rm -rf ${gem5_root}/gem5-resources"

# delete m5out, Pannotia datasets, and output files in case a failed regression
# run left them around
rm -rf ${gem5_root}/m5out coAuthorsDBLP.graph 1k_128k.gr result.out

# Pull gem5 resources to the root of the gem5 directory -- currently the
# pre-built binares for LULESH are out-of-date and won't run correctly with
# ROCm 4.0.  In the meantime, we can build the binary as part of this script.
# Moreover, DNNMark builds a library and thus doesn't have a binary, so we
# need to build it before we run it.
# Need to pull this first because HACC's docker requires this path to exist
git clone https://github.com/gem5/gem5-resources \
    "${gem5_root}/gem5-resources"


# The following script is to ensure these tests are runnable as the resources
# directory changes over time. The gem5 resources repository stable branch is
# tagged upon the new release for that of the previous release. For example,
# when v22.0 is released, the stable branch will be tagged with "v21.2.X.X"
# prior to the merging of the develop/staging branch into the stable branch.
# This is so a user may revert the gem5-resources sources back to a state
# compatable with a particular major release.
#
# To ensure the v21.2 version of these tests continues to run as future
# versions are released, we run this check. If there's been another release,
# we checkout the correct version of gem5 resources.
#
# Note: We disable this code on the develop branch and just checkout develop.

cd "${gem5_root}/gem5-resources"
git checkout develop
#version_tag=$(git tag | grep "v21.2")
#
#if [[ ${version_tag} != "" ]]; then
#       git checkout "${version_tag}"
#fi
#
cd "${gem5_root}"

# For the GPU tests we compile and run the GPU ISA inside a gcn-gpu container.
# HACC requires setting numerous environment variables to run correctly.  To
# avoid needing to set all of these, we instead build a docker for it, which
# has all these variables pre-set in its Dockerfile
# To avoid compiling gem5 multiple times, all GPU benchmarks will use this
docker pull ghcr.io/gem5/gcn-gpu:${tag}
docker build -t hacc-test-weekly ${gem5_root}/gem5-resources/src/gpu/halo-finder

docker run --rm -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}" --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
    "scons build/${gpu_isa}/gem5.opt -j${threads} --ignore-style \
        || rm -rf build && scons build/${gpu_isa}/gem5.opt -j${threads} \
        --ignore-style"

# Some of the apps we test use m5ops (and x86), so compile them for x86
# Note: setting TERM in the environment is necessary as scons fails for m5ops if
# it is not set.
docker run --rm -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}/util/m5" --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
    "export TERM=xterm-256color ; scons build/x86/out/m5"

# test LULESH
# build LULESH
docker run --rm --volume "${gem5_root}":"${gem5_root}" -w \
       "${gem5_root}/gem5-resources/src/gpu/lulesh" \
       -u $UID:$GID --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "make"

# LULESH is heavily used in the HPC community on GPUs, and does a good job of
# stressing several GPU compute and memory components
docker run --rm -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}" --memory="${docker_mem_limit}" \
    hacc-test-weekly build/${gpu_isa}/gem5.opt configs/example/apu_se.py -n3 \
    --mem-size=8GB --reg-alloc-policy=dynamic \
    --benchmark-root="${gem5_root}/gem5-resources/src/gpu/lulesh/bin" -c lulesh

# test DNNMark
# setup cmake for DNNMark
docker run --rm -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
     "${gem5_root}/gem5-resources/src/gpu/DNNMark" \
     --memory="${docker_mem_limit}" hacc-test-weekly bash -c "./setup.sh HIP"

# make the DNNMark library
docker run --rm -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}/gem5-resources/src/gpu/DNNMark/build" \
     --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
     "make -j${threads}"

# generate cachefiles -- since we are testing gfx801 and 4 CUs (default config)
# in tester, we want cachefiles for this setup
docker run --rm --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}/gem5-resources/src/gpu/DNNMark" \
    "-v${gem5_root}/gem5-resources/src/gpu/DNNMark/cachefiles:/root/.cache/miopen/2.9.0" \
    --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
    "python3 generate_cachefiles.py cachefiles.csv --gfx-version=gfx801 \
    --num-cus=4"

# generate mmap data for DNNMark (makes simulation much faster)
docker run --rm -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}/gem5-resources/src/gpu/DNNMark" \
    --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
    "g++ -std=c++0x generate_rand_data.cpp -o generate_rand_data"

docker run --rm -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}/gem5-resources/src/gpu/DNNMark" hacc-test-weekly bash -c \
    "./generate_rand_data"

# now we can run DNNMark!
# DNNMark is representative of several simple (fast) layers within ML
# applications, which are heavily used in modern GPU applications.  So, we want
# to make sure support for these applications are tested.  Run three variants:
# fwd_softmax, bwd_bn, fwd_pool; these tests ensure we run a variety of ML kernels,
# including both inference and training
docker run --rm --volume "${gem5_root}":"${gem5_root}" -v \
       "${gem5_root}/gem5-resources/src/gpu/DNNMark/cachefiles:/root/.cache/miopen/2.9.0" \
       -w "${gem5_root}/gem5-resources/src/gpu/DNNMark" \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       "${gem5_root}/build/${gpu_isa}/gem5.opt" "${gem5_root}/configs/example/apu_se.py" -n3 \
       --reg-alloc-policy=dynamic \
       --benchmark-root="${gem5_root}/gem5-resources/src/gpu/DNNMark/build/benchmarks/test_fwd_softmax" \
       -c dnnmark_test_fwd_softmax \
       --options="-config ${gem5_root}/gem5-resources/src/gpu/DNNMark/config_example/softmax_config.dnnmark \
       -mmap ${gem5_root}/gem5-resources/src/gpu/DNNMark/mmap.bin"

docker run --rm --volume "${gem5_root}":"${gem5_root}" -v \
       "${gem5_root}/gem5-resources/src/gpu/DNNMark/cachefiles:/root/.cache/miopen/2.9.0" \
       -w "${gem5_root}/gem5-resources/src/gpu/DNNMark" \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       "${gem5_root}/build/${gpu_isa}/gem5.opt" "${gem5_root}/configs/example/apu_se.py" -n3 \
       --reg-alloc-policy=dynamic \
       --benchmark-root="${gem5_root}/gem5-resources/src/gpu/DNNMark/build/benchmarks/test_fwd_pool" \
       -c dnnmark_test_fwd_pool \
       --options="-config ${gem5_root}/gem5-resources/src/gpu/DNNMark/config_example/pool_config.dnnmark \
       -mmap ${gem5_root}/gem5-resources/src/gpu/DNNMark/mmap.bin"

docker run --rm --volume "${gem5_root}":"${gem5_root}" -v \
       "${gem5_root}/gem5-resources/src/gpu/DNNMark/cachefiles:/root/.cache/miopen/2.9.0" \
       -w "${gem5_root}/gem5-resources/src/gpu/DNNMark" \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       "${gem5_root}/build/${gpu_isa}/gem5.opt" "${gem5_root}/configs/example/apu_se.py" -n3 \
       --reg-alloc-policy=dynamic \
       --benchmark-root="${gem5_root}/gem5-resources/src/gpu/DNNMark/build/benchmarks/test_bwd_bn" \
       -c dnnmark_test_bwd_bn \
       --options="-config ${gem5_root}/gem5-resources/src/gpu/DNNMark/config_example/bn_config.dnnmark \
       -mmap ${gem5_root}/gem5-resources/src/gpu/DNNMark/mmap.bin"

# test HACC
# build HACC
docker run --rm -v ${PWD}:${PWD} -w \
       "${gem5_root}/gem5-resources/src/gpu/halo-finder/src" -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly make hip/ForceTreeTest

# Like LULESH, HACC is heavily used in the HPC community and is used to stress
# the GPU memory system
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       ${gem5_root}/build/${gpu_isa}/gem5.opt \
       ${gem5_root}/configs/example/apu_se.py -n3 --reg-alloc-policy=dynamic \
       --benchmark-root=${gem5_root}/gem5-resources/src/gpu/halo-finder/src/hip \
       -c ForceTreeTest --options="0.5 0.1 64 0.1 1 N 12 rcb"

# test Pannotia
# Pannotia has 6 different benchmarks (BC, Color, FW, MIS, PageRank, SSSP), of
# which 3 (Color, PageRank, SSSP) have 2 different variants.  Since they are
# useful for testing irregular GPU application behavior, we test each.

# build BC
docker run --rm -v ${PWD}:${PWD} \
       -w ${gem5_root}/gem5-resources/src/gpu/pannotia/bc -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "export GEM5_PATH=${gem5_root} ; make gem5-fusion"

# # get input dataset for BC test
wget http://dist.gem5.org/dist/develop/datasets/pannotia/bc/1k_128k.gr
# run BC
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       ${gem5_root}/build/${gpu_isa}/gem5.opt \
       ${gem5_root}/configs/example/apu_se.py -n3 --mem-size=8GB \
       --reg-alloc-policy=dynamic \
       --benchmark-root=gem5-resources/src/gpu/pannotia/bc/bin -c bc.gem5 \
       --options="1k_128k.gr"

# build Color Max
docker run --rm -v ${gem5_root}:${gem5_root} -w \
       ${gem5_root}/gem5-resources/src/gpu/pannotia/color -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "export GEM5_PATH=${gem5_root} ; make gem5-fusion"

# run Color (Max) (use same input dataset as BC for faster testing)
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       ${gem5_root}/build/${gpu_isa}/gem5.opt \
       ${gem5_root}/configs/example/apu_se.py -n3 --mem-size=8GB \
       --reg-alloc-policy=dynamic \
       --benchmark-root=${gem5_root}/gem5-resources/src/gpu/pannotia/color/bin \
       -c color_max.gem5 --options="1k_128k.gr 0"

# build Color (MaxMin)
docker run --rm -v ${gem5_root}:${gem5_root} -w \
       ${gem5_root}/gem5-resources/src/gpu/pannotia/color -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "export GEM5_PATH=${gem5_root} ; export VARIANT=MAXMIN ; make gem5-fusion"

# run Color (MaxMin) (use same input dataset as BC for faster testing)
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       ${gem5_root}/build/${gpu_isa}/gem5.opt \
       ${gem5_root}/configs/example/apu_se.py -n3 --mem-size=8GB \
       --reg-alloc-policy=dynamic \
       --benchmark-root=${gem5_root}/gem5-resources/src/gpu/pannotia/color/bin \
       -c color_maxmin.gem5 --options="1k_128k.gr 0"

# build FW
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       ${gem5_root}/gem5-resources/src/gpu/pannotia/fw \
       --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "export GEM5_PATH=${gem5_root} ; make default; make gem5-fusion"

# create input mmap file for FW
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly bash -c\
       "./gem5-resources/src/gpu/pannotia/fw/bin/fw_hip ./gem5-resources/src/gpu/pannotia/fw/1k_128k.gr 1"

# run FW (use same input dataset as BC for faster testing)
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       ${gem5_root}/build/${gpu_isa}/gem5.opt \
       ${gem5_root}/configs/example/apu_se.py -n3 --mem-size=8GB \
       --reg-alloc-policy=dynamic \
       --benchmark-root=${gem5_root}/gem5-resources/src/gpu/pannotia/fw/bin \
       -c fw_hip.gem5 --options="1k_128k.gr 2"

# build MIS
docker run --rm -v ${gem5_root}:${gem5_root} -w \
       ${gem5_root}/gem5-resources/src/gpu/pannotia/mis -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "export GEM5_PATH=${gem5_root} ; make gem5-fusion"

# run MIS (use same input dataset as BC for faster testing)
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       ${gem5_root}/build/${gpu_isa}/gem5.opt \
       ${gem5_root}/configs/example/apu_se.py -n3 --mem-size=8GB \
       --reg-alloc-policy=dynamic \
       --benchmark-root=${gem5_root}/gem5-resources/src/gpu/pannotia/mis/bin \
       -c mis_hip.gem5 --options="1k_128k.gr 0"

# build Pagerank Default variant
docker run --rm -v ${gem5_root}:${gem5_root} -w \
       ${gem5_root}/gem5-resources/src/gpu/pannotia/pagerank -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "export GEM5_PATH=${gem5_root} ; make gem5-fusion"

# get PageRank input dataset
wget http://dist.gem5.org/dist/develop/datasets/pannotia/pagerank/coAuthorsDBLP.graph
# run PageRank (Default)
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       ${gem5_root}/build/${gpu_isa}/gem5.opt \
       ${gem5_root}/configs/example/apu_se.py -n3 --mem-size=8GB \
       --reg-alloc-policy=dynamic \
       --benchmark-root=${gem5_root}/gem5-resources/src/gpu/pannotia/pagerank/bin \
       -c pagerank.gem5 --options="coAuthorsDBLP.graph 1"

# build PageRank SPMV variant
docker run --rm -v ${gem5_root}:${gem5_root} -w \
       ${gem5_root}/gem5-resources/src/gpu/pannotia/pagerank -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "export GEM5_PATH=${gem5_root} ; export VARIANT=SPMV ; make gem5-fusion"

# run PageRank (SPMV)
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       ${gem5_root}/build/${gpu_isa}/gem5.opt \
       ${gem5_root}/configs/example/apu_se.py -n3 --mem-size=8GB \
       --reg-alloc-policy=dynamic \
       --benchmark-root=${gem5_root}/gem5-resources/src/gpu/pannotia/pagerank/bin \
       -c pagerank_spmv.gem5 --options="coAuthorsDBLP.graph 1"

# build SSSP CSR variant
docker run --rm -v ${gem5_root}:${gem5_root} -w \
       ${gem5_root}/gem5-resources/src/gpu/pannotia/sssp -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "export GEM5_PATH=${gem5_root} ; make gem5-fusion"

# run SSSP (CSR) (use same input dataset as BC for faster testing)
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       ${gem5_root}/build/${gpu_isa}/gem5.opt \
       ${gem5_root}/configs/example/apu_se.py -n3 --mem-size=8GB \
       --reg-alloc-policy=dynamic \
       --benchmark-root=${gem5_root}/gem5-resources/src/gpu/pannotia/sssp/bin \
       -c sssp.gem5 --options="1k_128k.gr 0"

# build SSSP ELL variant
docker run --rm -v ${gem5_root}:${gem5_root} -w \
       ${gem5_root}/gem5-resources/src/gpu/pannotia/sssp -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "export GEM5_PATH=${gem5_root} ; export VARIANT=ELL ; make gem5-fusion"

# run SSSP (ELL) (use same input dataset as BC for faster testing)
docker run --rm -v ${gem5_root}:${gem5_root} -w ${gem5_root} -u $UID:$GID \
       --memory="${docker_mem_limit}" hacc-test-weekly \
       ${gem5_root}/build/${gpu_isa}/gem5.opt \
       ${gem5_root}/configs/example/apu_se.py -n3 --mem-size=8GB \
       --reg-alloc-policy=dynamic \
       --benchmark-root=${gem5_root}/gem5-resources/src/gpu/pannotia/sssp/bin \
       -c sssp_ell.gem5 --options="1k_128k.gr 0"

# Delete the gem5 resources repo we created -- need to do in docker because of
# cachefiles DNNMark creates
docker run --rm --volume "${gem5_root}":"${gem5_root}" -w \
       "${gem5_root}" --memory="${docker_mem_limit}" hacc-test-weekly bash -c \
       "rm -rf ${gem5_root}/gem5-resources"

# Delete the gem5 m5out folder we created
rm -rf ${gem5_root}/m5out

# delete Pannotia datasets we downloaded and output files it created
rm -f coAuthorsDBLP.graph 1k_128k.gr result.out

# Run tests to ensure the DRAMSys integration is still functioning correctly.
if [ -d "${gem5_root}/ext/dramsys/DRAMSys" ]; then
    rm -r "${gem5_root}/ext/dramsys/DRAMSys"
fi

cd "${gem5_root}/ext/dramsys"
git clone --recursive git@github.com:tukl-msd/DRAMSys.git DRAMSys
cd DRAMSys
git checkout -b gem5 09f6dcbb91351e6ee7cadfc7bc8b29d97625db8f
cd "${gem5_root}"

rm -rf "${gem5_root}/build/ALL"

docker run -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}" --memory="${docker_mem_limit}" --rm \
    ghcr.io/gem5/ubuntu-22.04_all-dependencies:${tag} \
       scons build/ALL/gem5.opt -j${threads}

docker run -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}" --memory="${docker_mem_limit}" --rm \
    ghcr.io/gem5/ubuntu-22.04_all-dependencies:${tag} \
       ./build/ALL/gem5.opt \
       configs/example/gem5_library/dramsys/arm-hello-dramsys.py

docker run -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}" --memory="${docker_mem_limit}" --rm \
    ghcr.io/gem5/ubuntu-22.04_all-dependencies:${tag} \
       ./build/ALL/gem5.opt \
       configs/example/gem5_library/dramsys/dramsys-traffic.py

docker run -u $UID:$GID --volume "${gem5_root}":"${gem5_root}" -w \
    "${gem5_root}" --memory="${docker_mem_limit}" --rm \
    ghcr.io/gem5/ubuntu-22.04_all-dependencies:${tag} \
       ./build/ALL/gem5.opt \
       configs/example/dramsys.py
