-
Notifications
You must be signed in to change notification settings - Fork 72
261 lines (247 loc) · 13.5 KB
/
gem5-perf-template.yml
File metadata and controls
261 lines (247 loc) · 13.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
name: gem5 Performance Test Template (Unified)
on:
workflow_call:
inputs:
config_path:
required: true
type: string
description: "gem5 config file path (relative to repo root), e.g. configs/example/idealkmhv3.py"
extra_args:
required: false
type: string
default: ""
description: "Extra arguments for gem5 (e.g., --disable-mgsc). Only works with .py config files."
benchmark_type:
required: true
type: string
description: "Benchmark type: spec06-0.3c, spec06-0.8c, spec06-1.0c, spec17-1.0c, spec06-rvv-1.0c or spec06int-rvv-0.8c"
vector_type:
required: false
type: string
description: "Benchmark type: base, simple"
check_result:
required: false
type: boolean
description: "Whether to check result (failed ckpts)"
default: true
pr_sha:
required: false
type: string
description: "Specific commit SHA to checkout (takes precedence)"
jobs:
run_performance_test:
runs-on: [self-hosted, node]
continue-on-error: false
name: XS-GEM5 - Run performance test (${{ inputs.benchmark_type }})
steps:
- uses: actions/checkout@v2
with:
ref: ${{ inputs.pr_sha || github.sha }}
- name: Set benchmark configuration
id: config
run: |
case "${{ inputs.benchmark_type }}" in
"spec06-0.3c")
echo "checkpoint_list=/nfs/home/share/gem5_ci/spec06_cpts/spec06_0.3c_int.lst" >> $GITHUB_OUTPUT
echo "checkpoint_root_node=/nfs/home/share/jiaxiaoyu/simpoint_checkpoint_zstd_format/spec06_rv64gcb_O3_20m_gcc12.2.0-intFpcOff-jeMalloc" >> $GITHUB_OUTPUT
echo "score_script=gem5-score-ci.sh" >> $GITHUB_OUTPUT
echo "cluster_config=/nfs/home/share/gem5_ci/spec06_cpts/cluster-0-0.json" >> $GITHUB_OUTPUT
echo "artifact_name=performance-score-spec06-0.3c" >> $GITHUB_OUTPUT
echo "comment=run 30% coverage spec06 checkpoints, 148 checkpoints" >> $GITHUB_OUTPUT
;;
"spec06-0.8c")
echo "checkpoint_list=/nfs/home/share/gem5_ci/spec06_cpts/spec_0.8c_int.lst" >> $GITHUB_OUTPUT
echo "checkpoint_root_node=/nfs/home/share/jiaxiaoyu/simpoint_checkpoint_zstd_format/spec06_rv64gcb_O3_20m_gcc12.2.0-intFpcOff-jeMalloc" >> $GITHUB_OUTPUT
echo "score_script=gem5-score-ci.sh" >> $GITHUB_OUTPUT
echo "cluster_config=/nfs/home/share/gem5_ci/spec06_cpts/cluster-0-0.json" >> $GITHUB_OUTPUT
echo "artifact_name=performance-score-spec06-0.8c" >> $GITHUB_OUTPUT
echo "comment=run 80% coverage spec06 checkpoints, 500+ checkpoints" >> $GITHUB_OUTPUT
;;
"spec06-1.0c")
echo "checkpoint_list=/nfs/home/share/gem5_ci/spec06_cpts/checkpoint-0-0-0.lst" >> $GITHUB_OUTPUT
echo "checkpoint_root_node=/nfs/home/share/jiaxiaoyu/simpoint_checkpoint_zstd_format/spec06_rv64gcb_O3_20m_gcc12.2.0-intFpcOff-jeMalloc" >> $GITHUB_OUTPUT
echo "score_script=gem5-score-ci.sh" >> $GITHUB_OUTPUT
echo "cluster_config=/nfs/home/share/gem5_ci/spec06_cpts/cluster-0-0.json" >> $GITHUB_OUTPUT
echo "artifact_name=performance-score-spec06-1.0c" >> $GITHUB_OUTPUT
echo "comment=run 100% coverage spec06 checkpoints" >> $GITHUB_OUTPUT
;;
"spec17-1.0c")
echo "checkpoint_list=/nfs/home/yanyue/spec17_cpts/checkpoint-0-0-0/checkpoint.lst" >> $GITHUB_OUTPUT
echo "checkpoint_root_node=/nfs/home/yanyue/spec17_cpts/checkpoint-0-0-0/" >> $GITHUB_OUTPUT
echo "score_script=gem5-score-ci-17.sh" >> $GITHUB_OUTPUT
echo "cluster_config=/nfs/home/yanyue/spec17_cpts/checkpoint-0-0-0/cluster-0-0.json" >> $GITHUB_OUTPUT
echo "artifact_name=performance-score-spec17-1.0c" >> $GITHUB_OUTPUT
echo "comment=run 100% coverage spec17 checkpoints" >> $GITHUB_OUTPUT
;;
"spec06-rvv-1.0c")
echo "checkpoint_list=/nfs/home/xutongqiao/GEM5-CI/spec06_gcc15_rv64gcbv_O3_lto_base_nemu_single_core_NEMU_archgroup_2024-10-12-16-05/checkpoint06_rv64gcbv/checkpoint.lst" >> $GITHUB_OUTPUT
echo "checkpoint_root_node=/nfs/home/xutongqiao/GEM5-CI/spec06_gcc15_rv64gcbv_O3_lto_base_nemu_single_core_NEMU_archgroup_2024-10-12-16-05/checkpoint06_rv64gcbv/" >> $GITHUB_OUTPUT
echo "score_script=gem5-score-ci.sh" >> $GITHUB_OUTPUT
echo "cluster_config=/nfs/home/xutongqiao/GEM5-CI/spec06_gcc15_rv64gcbv_O3_lto_base_nemu_single_core_NEMU_archgroup_2024-10-12-16-05/checkpoint06_rv64gcbv/cluster-0-0.json" >> $GITHUB_OUTPUT
echo "artifact_name=performance-score-spec06-1.0c-with-rvv-extension" >> $GITHUB_OUTPUT
echo "comment=run 100% coverage spec06 rvv checkpoints" >> $GITHUB_OUTPUT
;;
"spec06int-rvv-0.8c")
echo "checkpoint_list=/nfs/home/xutongqiao/GEM5-CI/spec06_gcc15_rv64gcbv_O3_lto_base_nemu_single_core_NEMU_archgroup_2024-10-12-16-05/checkpoint06_rv64gcbv/checkpoint_0.8c_int.lst" >> $GITHUB_OUTPUT
echo "checkpoint_root_node=/nfs/home/xutongqiao/GEM5-CI/spec06_gcc15_rv64gcbv_O3_lto_base_nemu_single_core_NEMU_archgroup_2024-10-12-16-05/checkpoint06_rv64gcbv/" >> $GITHUB_OUTPUT
echo "score_script=gem5-score-ci.sh" >> $GITHUB_OUTPUT
echo "cluster_config=/nfs/home/xutongqiao/GEM5-CI/spec06_gcc15_rv64gcbv_O3_lto_base_nemu_single_core_NEMU_archgroup_2024-10-12-16-05/checkpoint06_rv64gcbv/cluster_0.8c_int.json" >> $GITHUB_OUTPUT
echo "artifact_name=performance-score-spec06int-0.8c-with-rvv-extension" >> $GITHUB_OUTPUT
echo "comment=run 80% coverage spec06 int rvv checkpoints" >> $GITHUB_OUTPUT
;;
*)
echo "Error: Invalid benchmark_type '${{ inputs.benchmark_type }}'. Must be one of: spec06-0.8c, spec06-1.0c, spec17-1.0c, spec06-rvv-1.0c or spec06int-rvv-0.8c"
exit 1
;;
esac
- uses: ./.github/actions/build-dramsim
- name: Build GEM5 fast
run: |
export GEM5_HOME=$(pwd)
export GCBV_REF_SO="/nfs/home/share/gem5_ci/ref/normal/riscv64-nemu-notama-tvalref-so"
case "${{ inputs.vector_type }}" in
"base")
# use pgo profile to build gem5
bash util/pgo/basic_pgo_new.sh
;;
"simple")
# use pgo profile to build gem5, use simple vector decode strategy in scons
bash util/pgo/basic_pgo_new_vector.sh
;;
"")
# use pgo profile to build gem5
bash util/pgo/basic_pgo_new.sh
;;
*)
echo "Error: Invalid vector_type '${{ inputs.vector_type }}'. Must be one of: base, simple"
exit 1
;;
esac
- name: XS-GEM5 - Run performance test
# ${{ steps.config.outputs.comment }}
env:
GCBV_REF_SO: "/nfs/home/share/gem5_ci/ref/normal/riscv64-nemu-notama-tvalref-so"
GCB_RESTORER: ""
GEM5_HOME: ${{ github.workspace }}
GEM5_BUILD_TYPE: fast
run: |
mkdir -p $GEM5_HOME/util/xs_scripts/test
cd $GEM5_HOME/util/xs_scripts/test
CONFIG_PATH="${{ inputs.config_path }}"
if [[ "$CONFIG_PATH" == /* ]]; then
echo "Error: config_path must be repo-root-relative, got absolute path: '$CONFIG_PATH'"
exit 1
fi
if [[ "$CONFIG_PATH" != *.py ]]; then
echo "Error: config_path must be a .py gem5 config file path, got: '$CONFIG_PATH'"
exit 1
fi
CONFIG_PATH="$GEM5_HOME/$CONFIG_PATH"
bash ../parallel_sim.sh "$(realpath "$CONFIG_PATH")" \
${{ steps.config.outputs.checkpoint_list }} \
${{ steps.config.outputs.checkpoint_root_node}} \
spec_all \
"${{ inputs.extra_args }}"
- name: Setup gem5_data_proc environment
run: |
# 使用本地数据处理仓库,避免GitHub网络问题
cd $GITHUB_WORKSPACE
cp -r /nfs/home/share/gem5_ci/gem5_data_proc .
- name: Check performance test result
run: |
# 添加yanyue的 Python 包路径, 包含pandas等
export PYTHONPATH=/nfs/home/yanyue/.local/lib/python3.10/site-packages:$PYTHONPATH
# 每次run 会进入新的shell, 需要重新设置GEM5_HOME
export GEM5_HOME=$GITHUB_WORKSPACE
cd $GITHUB_WORKSPACE/gem5_data_proc
# 使用已有的数据spec_all生成测试报告
bash example-scripts/${{ steps.config.outputs.score_script }} \
$GEM5_HOME/util/xs_scripts/test/spec_all \
${{ steps.config.outputs.cluster_config }} \
> $GITHUB_WORKSPACE/score.txt
# 提取最后42行score信息
echo "### performance test result :rocket:" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
tail -n 42 $GITHUB_WORKSPACE/score.txt >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
# 提取关键指标
FINAL_SCORE=$(grep "Estimated Int score per GHz:" $GITHUB_WORKSPACE/score.txt | awk '{print $NF}')
echo "### Key indicators" >> $GITHUB_STEP_SUMMARY
echo "- Final Int score per GHz: **${FINAL_SCORE}**" >> $GITHUB_STEP_SUMMARY
# 最后检查是否存在abort文件, 如果存在,打出前10个错误名字
if find $GEM5_HOME/util/xs_scripts/test/spec_all -type f -name "abort" | grep -q .; then
echo "### :x: Test Failures Detected!" >> $GITHUB_STEP_SUMMARY
echo "Failed test count: $(find $GEM5_HOME/util/xs_scripts/test/spec_all -type f -name "abort" | wc -l)" >> $GITHUB_STEP_SUMMARY
echo "First 10 failed tests:" >> $GITHUB_STEP_SUMMARY
find $GEM5_HOME/util/xs_scripts/test/spec_all -type f -name "abort" |
sed 's|.*/\([^/]*\)/abort|\1|' |
head -n 10 |
while read -r line; do
echo "- $line" >> $GITHUB_STEP_SUMMARY
done
if [ "${{ inputs.check_result }}" == "true" ]; then
exit 1
fi
fi
- name: Archive performance data
if: always()
run: |
# Create archive directory with timestamp and commit
ARCHIVE_ROOT="/nfs/home/share/gem5_ci/performance_data"
BENCHMARK_DIR="${ARCHIVE_ROOT}/${{ inputs.benchmark_type }}"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
COMMIT_SHORT=$(git rev-parse --short HEAD)
RUN_NUMBER="${{ github.run_number }}"
TARGET_DIR="${BENCHMARK_DIR}/${TIMESTAMP}_${COMMIT_SHORT}_run${RUN_NUMBER}"
# Create target directory
mkdir -p "$TARGET_DIR"
# Archive entire spec_all directory with compression
echo "Archiving performance data to $TARGET_DIR"
tar -czf "$TARGET_DIR/spec_all.tar.gz" -C "$GITHUB_WORKSPACE/util/xs_scripts/test" spec_all
# Also save score.txt for quick reference
if [ -f "$GITHUB_WORKSPACE/score.txt" ]; then
cp "$GITHUB_WORKSPACE/score.txt" "$TARGET_DIR/"
fi
# Save metadata
echo "timestamp: $TIMESTAMP" > "$TARGET_DIR/metadata.txt"
echo "commit: $(git rev-parse HEAD)" >> "$TARGET_DIR/metadata.txt"
echo "commit_short: $COMMIT_SHORT" >> "$TARGET_DIR/metadata.txt"
echo "branch: ${GITHUB_REF#refs/heads/}" >> "$TARGET_DIR/metadata.txt"
echo "run_number: $RUN_NUMBER" >> "$TARGET_DIR/metadata.txt"
echo "benchmark_type: ${{ inputs.benchmark_type }}" >> "$TARGET_DIR/metadata.txt"
echo "workflow_run_id: ${{ github.run_id }}" >> "$TARGET_DIR/metadata.txt"
# Auto cleanup: keep only last 200 runs for this benchmark type
if [ -d "$BENCHMARK_DIR" ] && [ $(ls -1 "$BENCHMARK_DIR" 2>/dev/null | wc -l) -gt 200 ]; then
echo "Cleaning up old performance data, keeping last 200 runs"
# Use absolute paths to avoid accidental deletion if cd fails
ls -1t "$BENCHMARK_DIR" | tail -n +201 | while read -r old_run; do
if [ -n "$old_run" ] && [ -d "$BENCHMARK_DIR/$old_run" ]; then
rm -rf "$BENCHMARK_DIR/$old_run"
echo "Deleted: $BENCHMARK_DIR/$old_run"
fi
done
echo "Cleanup completed"
fi
echo "Performance data archived successfully"
echo "Archive size: $(du -sh "$TARGET_DIR/spec_all.tar.gz" | cut -f1)"
{
echo "### Archive output"
echo "- Path: \`$TARGET_DIR\`"
echo "- Size: $(du -sh "$TARGET_DIR/spec_all.tar.gz" | cut -f1)"
} >> $GITHUB_STEP_SUMMARY
- name: Upload score artifact
if: always()
continue-on-error: true
uses: actions/upload-artifact@v4
with:
name: ${{ steps.config.outputs.artifact_name }}
path: score.txt
retention-days: 30
- name: Fallback - Save score to shared storage
if: always()
run: |
# Fallback: 如果 artifact upload 失败,保存到共享存储
ARTIFACT_DIR="/nfs/home/share/gem5_ci/artifacts/${{ github.run_id }}"
mkdir -p "$ARTIFACT_DIR"
cp score.txt "$ARTIFACT_DIR/${{ steps.config.outputs.artifact_name }}.txt" 2>/dev/null || true
echo "✅ Score also saved to: $ARTIFACT_DIR"