diff --git a/.github/workflows/emu.yml b/.github/workflows/emu.yml index b116b6497b..da9bdc0bf5 100644 --- a/.github/workflows/emu.yml +++ b/.github/workflows/emu.yml @@ -91,7 +91,8 @@ jobs: python3 $GITHUB_WORKSPACE/scripts/xiangshan.py --clean - name: Build EMU run: | - python3 $GITHUB_WORKSPACE/scripts/xiangshan.py --wave-dump $WAVE_HOME --build --threads 16 --mfc + python3 $GITHUB_WORKSPACE/scripts/xiangshan.py --wave-dump $WAVE_HOME --build --threads 16 --mfc \ + --pgo $GITHUB_WORKSPACE/ready-to-run/coremark-2-iteration.bin --llvm-profdata llvm-profdata - name: Basic Test - cputest run: | python3 $GITHUB_WORKSPACE/scripts/xiangshan.py --wave-dump $WAVE_HOME --threads 16 --ci cputest 2> /dev/zero @@ -152,7 +153,8 @@ jobs: run: | python3 $GITHUB_WORKSPACE/scripts/xiangshan.py --build \ --dramsim3 /nfs/home/share/ci-workloads/DRAMsim3 \ - --with-dramsim3 --threads 16 --mfc + --with-dramsim3 --threads 16 --mfc \ + --pgo $GITHUB_WORKSPACE/ready-to-run/coremark-2-iteration.bin --llvm-profdata llvm-profdata - name: SPEC06 Test - mcf run: | python3 $GITHUB_WORKSPACE/scripts/xiangshan.py --wave-dump $WAVE_HOME --threads 16 --max-instr 5000000 --numa --ci mcf 2> perf.log @@ -218,7 +220,8 @@ jobs: python3 $GITHUB_WORKSPACE/scripts/xiangshan.py --build \ --num-cores 2 --emu-optimize "" \ --dramsim3 /nfs/home/share/ci-workloads/DRAMsim3 \ - --with-dramsim3 --threads 16 --mfc + --with-dramsim3 --threads 16 --mfc \ + --pgo $GITHUB_WORKSPACE/ready-to-run/coremark-2-iteration.bin --llvm-profdata llvm-profdata - name: MC Test run: | python3 $GITHUB_WORKSPACE/scripts/xiangshan.py --wave-dump $WAVE_HOME --threads 16 --numa --diff ./ready-to-run/riscv64-nemu-interpreter-dual-so --ci mc-tests 2> /dev/zero diff --git a/difftest b/difftest index 7fd1a72f7e..9e2a8106e9 160000 --- a/difftest +++ b/difftest @@ -1 +1 @@ -Subproject commit 7fd1a72f7ee8eed517e64102be3868c9ede16c5a +Subproject commit 9e2a8106e98e445402ea859b23aecc1d89690df4 diff --git a/scripts/xiangshan.py b/scripts/xiangshan.py index 6210a220c6..983c5434e6 100644 --- a/scripts/xiangshan.py +++ b/scripts/xiangshan.py @@ -25,7 +25,7 @@ import subprocess import sys import time - +import shlex import psutil @@ -94,6 +94,10 @@ def __init__(self, args): self.fork = not args.disable_fork self.disable_diff = args.no_diff self.disable_db = args.no_db + self.pgo = args.pgo + self.pgo_max_cycle = args.pgo_max_cycle + self.pgo_emu_args = args.pgo_emu_args + self.llvm_profdata = args.llvm_profdata # wave dump path if args.wave_dump is not None: self.set_wave_home(args.wave_dump) @@ -133,9 +137,14 @@ def get_makefile_args(self): (self.is_mfc, "MFC"), (self.emu_optimize, "EMU_OPTIMIZE"), (self.xprop, "ENABLE_XPROP"), - (self.with_chiseldb, "WITH_CHISELDB") + (self.with_chiseldb, "WITH_CHISELDB"), + (self.pgo, "PGO_WORKLOAD"), + (self.pgo_max_cycle, "PGO_MAX_CYCLE"), + (self.pgo_emu_args, "PGO_EMU_ARGS"), + (self.llvm_profdata, "LLVM_PROFDATA"), ] args = filter(lambda arg: arg[0] is not None, makefile_args) + args = [(shlex.quote(str(arg[0])), arg[1]) for arg in args] # shell escape return args def get_emu_args(self): @@ -511,6 +520,10 @@ def get_free_cores(n): parser.add_argument('--ram-size', nargs='?', type=str, help='manually set simulation memory size (8GB by default)') # both makefile and emu arguments parser.add_argument('--no-db', action='store_true', help='disable chiseldb dump') + parser.add_argument('--pgo', nargs='?', type=str, help='workload for pgo (null to disable pgo)') + parser.add_argument('--pgo-max-cycle', nargs='?', default=400000, type=int, help='maximun cycle to train pgo') + parser.add_argument('--pgo-emu-args', nargs='?', default='--no-diff', type=str, help='emu arguments for pgo') + parser.add_argument('--llvm-profdata', nargs='?', type=str, help='corresponding llvm-profdata command of clang to compile emu, do not set with GCC') args = parser.parse_args()