SOP — 批处理运行层(Slurm × Virtuoso Spectre)¶
主题:
hpc_slurm_20261003| 设计稿:同目录DESIGN.md状态:S2 已完成(2026-10-04);S1 未开始;S3 进行中 环境事实见../docs/BASELINE.md§7;实测脚本与产物在.28:/projects/design/rain01/proj1/verif/batch_0/s2_clip/
1. 背景¶
阶段 2 的 200 点扫描按现状口径(psfascii、60 µs/点)会产生约 780 GB 波形,而 /projects 仅余 1.1 T、Lustre 余 280 G,直接批跑不可行。DESIGN.md §5 把「L1 裁剪后单点体积实测」列为阻断项:必须先量出一个点的真实体积,据此外推 200 点总量并通过门禁,才允许批跑。本 SOP 记录该实测(S2)的过程与结论。
2. 目标¶
在 vco5 网表上做受控对照,量化「输出格式 / save 节点数 / 输出抽稀」三种裁剪手段各自的压缩比,并据此外推 test_lock 单点(60 µs、8 节点白名单)的体积。
可验证状态:
- 给出九组对照的实测体积与耗时;
- 体积随时间线性(1 µs 与 200 ns 可对照);
- 外推 60 µs 单点体积,判定是否 ≤ 50 MB/点(
DESIGN.md§5 判据)。
3. 前置条件¶
.28(hpc-submit)root 免密可用;仿真必须以rain01身份跑(root 跑会让库文件属主错乱);module load cadence && module load virtuoso/IC06.17.700可用;- 模型卡适配副本
proj1/verif/models/spectre_nom.include存在; .28空闲(单组 200 ns 占 1 核约 28 s,1 µs 约 137 s)。
4. 影响范围¶
| 项 | 内容 |
|---|---|
| 主机 | 仅 .28(提交节点,本机跑,未占用 Slurm 计算节点) |
| 变更点 | 新增 proj1/verif/batch_0/s2_clip/(网表、日志、波形);未修改任何既有文件 |
| 是否停服 | 否;不影响 Virtuoso GUI、不触碰 design/pll45/ 下 cell |
| 窗口期 | 约 6 分钟(主矩阵)+ 约 5 分钟(线性验证) |
5. 分步操作¶
步骤 1:下发并执行裁剪对照矩阵¶
在 .28 上以 rain01 身份跑九组对照;每组同一 vco5 网表(与 pll_cal_20261003/vco5_cal.sp 器件契约一致),只改 -format、save 节点表与 tran 附加参数。
坑:脚本里 source /etc/profile 若在 set -e 生效期间执行,会因 profile 内部返回非 0 而整个脚本提前退出(实测 exit 127、无任何输出)。必须在其加载期间关闭 -e/-u。
scp hpc_slurm_20261003/s2_clip.sh root@192.168.31.28:/tmp/s2_clip.sh
ssh root@192.168.31.28 'runuser -u rain01 -- bash /tmp/s2_clip.sh'
产物:batch_0/s2_clip/raw_<case>/tran1.tran.tran。预期:每组 rc=0,逐行打印体积与墙钟。
失败判断:rc 非 0 或 raw 目录缺失 → 看同名 .log 的 completes with 行;无日志则查 module 是否加载。
步骤 2:线性与可读性验证¶
同一网表把窗口从 200 ns 拉长到 1 µs,确认体积随时间线性(决定能否外推 60 µs);并用 psf 工具确认 psfbin 可读(现有 parse_cal.py 只认 psfascii,改格式后解析链路须重做)。
ssh root@192.168.31.28 'runuser -u rain01 -- bash /tmp/s2_verify.sh'
预期:v1u_bin_8n 体积 = 200 ns 组的 5 倍;psf -i <psfbin> -o /tmp/x.txt 能打印 PSF header。
失败判断:比值明显偏离 5(如 <3)→ 存在固定开销或点数非线性,外推须加分项。
6. 验证¶
6.1 裁剪对照矩阵(stop=200 ns, maxstep=10 ps, vco5, nom 27 °C)¶
| case | 格式 | save | 附加 | raw 体积 (B) | 相对 a0 |
|---|---|---|---|---|---|
| a0 | psfascii | R0 VN | — | 13,049,366 | 1.00 |
| a1 | psfbin | R0 VN | — | 3,793,615 | 0.29 |
| a2 | psfbin | 8 节点 | — | 11,363,023 | 0.87 |
| a3 | psfascii | 8 节点 | — | 39,134,724 | 3.00 |
| a4 | nutbin | R0 VN | — | 3,771,594 | 0.29 |
| a5 | psfascii | R0 VN | strobeperiod=100p | 172,697 | 0.013 |
| a6 | psfbin | 8 节点 | strobeperiod=100p | 156,374 | 0.012 |
| a7 | psfbin | 8 节点 | skipcount=10 | 1,151,702 | 0.088 |
| a8 | psfbin | 8 节点 | compression=yes | 22,636,152 | 1.73 |
(8 节点 = R0 R1 R2 R3 R4 VN VCTRL VDD)
6.2 线性与可读性¶
| case | 窗口 | 格式 | 附加 | 体积 (B) | 墙钟 |
|---|---|---|---|---|---|
| a6 同配置 | 200 ns | psfbin | strobe 100p | 156,374 | 28.1 s |
| v1u_bin_8n_st100p | 1 µs | psfbin | strobe 100p | 746,199 | 137.0 s |
| a2 同配置 | 200 ns | psfbin | — | 11,363,023 | 27.9 s |
| v1u_bin_8n | 1 µs | psfbin | — | 56,779,472 | 137.6 s |
比值 4.77 / 5.00 ⇒ 体积随时间线性。psf CLI(/tools/cadence/virtuoso/IC617/tools.lnx86/dfII/bin/psf)可读 psfbin 头部。
6.3 外推 60 µs 单点(vco5 × 300;8 节点白名单)¶
| 配置 | 60 µs 单点体积 | 200 点总量 | 达标(≤50 MB/点) |
|---|---|---|---|
| psfascii,无抽稀(现状口径) | ≈ 11.7 GB | 2.3 TB | 否 |
| psfbin,无抽稀 | ≈ 3.41 GB | 682 GB | 否 |
| psfbin + strobeperiod=100p | ≈ 44.8 MB | 9.0 GB | 是(卡边缘) |
| psfbin + strobeperiod=1n(推算) | ≈ 4.5 MB | 0.9 GB | 是 |
6.4 结论¶
- 格式杠杆有限:psfascii→psfbin 仅 3.4×(nutbin 相当);单靠换格式不达标。
- 节点白名单线性:2→8 节点约 3×;白名单是「防止 ADE-XL 默认全节点 save」,不是主力手段。
- 抽稀是主力:
strobeperiod是唯一能数量级降体积的手段(a5/a6 达 75~83×);skipcount=10只有 ~11×(实际步长远密于 maxstep)。 compression=yes无效且有害:psfbin 8 节点从 11.4 MB 涨到 22.6 MB(1.73×),禁用。- 达标路径:
psfbin + strobeperiod ≤ 100p时 60 µs/8 节点 ≈ 45 MB,勉强进 50 MB 门禁。 - 精度代价(未决):100 ps 抽稀对 GHz 节点(vco5 周期 ≈127 ps)严重欠采样,不能用于测 VCO 波形频率/抖动,只适合慢节点(FB、LPF 输出、控制电压)与锁定包络。
test_lock的 save 白名单须按「要不要 GHz 波形」分成两组定 strobeperiod。 - 外推不确定性:以上为 vco5(11 管)数字;
pll_top(179 管)步长密度可能更密,须在阶段 2 用真实test_lock单点复校后再定 200 点门禁。
7. 回滚¶
本次只新增文件、未覆盖任何既有文件,故无备份需求(backup/README.md 已登记本次无备份项)。回滚等价于删除新增目录:
ssh root@192.168.31.28 'rm -rf /projects/design/rain01/proj1/verif/batch_0/s2_clip'
rm -f /home/rain/Documents/eda_tools_ins/design/hpc_slurm_20261003/s2_clip.sh \
/home/rain/Documents/eda_tools_ins/design/hpc_slurm_20261003/s2_verify.sh
回滚后验证:batch_0/s2_clip 不存在即已复原;不影响 design/pll45/ 与既有 verif 工程。
备份存放位置与台账:同目录 backup/README.md。
8. 风险说明¶
| 风险 | 缓解 |
|---|---|
外推基于 vco5,pll_top 步长密度不同 |
阶段 2 用真实 test_lock 单点复校(见 6.4-7) |
| 抽稀对 GHz 节点欠采样 | 白名单分组定 strobeperiod;GHz 波形另走分段/重跑(见 6.4-6) |
psfbin 后 parse_cal.py 失效 |
改用 psf CLI 或 psfbin 解析库,阶段 2 重建解析链路 |
/etc/profile 触发脚本提前退出 |
加载期间关闭 -e/-u(见步骤 1 坑) |
9. 追加变更:S3 派发链路复验与 wrapper 加固(2026-10-04)¶
9.1 背景¶
S3 接线后 GUI 复验(04:07–04:24)仍全数失败:12 个 Interactive.N 全 finished with errors,psf/Job.log 报 ADE-3036 + Error ID 5011("simulator run log has not been generated")。本节记录定位结论与加固。
9.2 定位结论(证据见 BASELINE §7.5)¶
| 复刻路径 | 结果 |
|---|---|
netlist 目录直跑 ./runSimulation |
spectre completes with 0 errors(2.5 s) |
srun -p long … bash -c ./runSimulation |
同上 0 errors |
注入 GUI 进程环境(/proc/<virtuoso pid>/environ)后经 srun 跑 |
同上 0 errors |
复刻现场 runGenricJobN(axlGenericJobLauncher … -command "cd <netlist> ; ./runSimulation") |
Command exited with status 0,psf/spectre.out 正常产出 |
⇒ 失败不可复现;唯一确定性故障是 runICRP<N>(cdsVncserver :80 + virtuoso -axlChildIdFlag)挂死——srun job 31 占节点 ~14 min 不返回,阻塞后续全部派发。
9.3 变更点¶
- 【高危】清残留作业:
scancel 23 27(JobHeldUser),无数据依赖、不需备份。 - wrapper 加固(
.28:/projects/design/rain01/proj1/verif/batch_0/bin/srun_adexl_wrap.sh): - 变量化
SLURM_TIME="00:30:00"(srun-t)、WALL_GUARD=1860(外壳兜底秒数 = srun + 60 s 余量); timeout --signal=TERM --kill-after=60 "$WALL_GUARD" srun …;- 去无条件
exit 0,改exit ${rc:-0}(rc=124 打印 WALL_GUARD 命中,rc≠0 打印 FAILED)。
坑:SLURM_TIME/WALL_GUARD 默认 30 min 是为常规单点;跑长仿真(test_lock 单点 ≈56 核时)前必须同步调大两者,否则外壳误杀正常长任务。两者须保持 WALL_GUARD > srun 时长。
9.4 验证(实测)¶
# 语法
ssh root@192.168.31.28 'bash -n /projects/design/rain01/proj1/verif/batch_0/bin/srun_adexl_wrap.sh' # 预期 SYNTAX_OK
# 成功路径:应打印 HELLO… 且 rc=0
ssh root@192.168.31.28 'runuser -u rain01 -- /projects/design/rain01/proj1/verif/batch_0/bin/srun_adexl_wrap.sh /bin/echo HELLO-AFTER-HARDEN; echo RC=$?'
# 失败路径:应 rc=1 且日志出现 FAILED rc=1
ssh root@192.168.31.28 'runuser -u rain01 -- /projects/design/rain01/proj1/verif/batch_0/bin/srun_adexl_wrap.sh /bin/false; echo RC=$?'
ssh root@192.168.31.28 'tail -3 /tmp/adexl_icrp_cmd.log'
实测:SYNTAX_OK;/bin/echo → RC=0;/bin/false → RC=1 且日志 --- FAILED rc=1。
失败判断:语法非 OK、或成功路径 rc≠0 → 按 §9.5 回滚。
9.5 回滚¶
install -m 755 -o rain01 -g design \
/home/rain/Documents/eda_tools_ins/design/hpc_slurm_20261003/backup/verif/batch_0/bin/srun_adexl_wrap.sh.bak.20261004-043431 \
/projects/design/rain01/proj1/verif/batch_0/bin/srun_adexl_wrap.sh # 需在 .28 上执行
备份存放位置与台账:hpc_slurm_20261003/backup/README.md。
9.6 风险说明¶
| 风险 | 缓解 |
|---|---|
退出码改为非零,ADE-XL 可能将其视为 Command 失败(原恒 exit 0 是为让 ADE-XL 只依赖 ICRP 状态判断) |
若复验因此报 Command 失败,按 §9.5 回滚(亦可只保留 hang 兜底、恢复恒 0) |
WALL_GUARD/SLURM_TIME 默认 30 min,长仿真会被误杀 |
长任务前同步调大两者(见 §9.3 坑) |
| 复验失败根因未确证(现场不可复现) | 复验时勾 Show output log on error 取子进程输出;BASELINE §7.5 已留定位方法 |
9.7 跑前检查与运行期残留治理(2026-10-04 复验后新增)¶
每次 Run 之前跑一条(只读,安全):
ssh root@192.168.31.28 'export PATH=/usr/local/slurm/bin:$PATH; squeue -o "%.6i %.9P %.10j %.2t %.10M %R"'
判读:只要出现 SE 或 JobHeldUser 的行,就是上一次失败留下的残骸——先 scancel <id> 清掉再 Run;R/PD 的行不要动(那是正常在跑/排队的作业)。
# [高危] 只清残骸:<id> 换成上一步查到的 SE/JobHeldUser 作业号,禁止用通配
ssh root@192.168.31.28 'export PATH=/usr/local/slurm/bin:$PATH; scancel <id>'
预期:再查 squeue 无 SE/HeldUser 行。不清的后果:残骸累积后 ADE-XL 直接停止派发,表现是"每个 run 都 finished with errors 且 /tmp/adexl_icrp_cmd.log 里没有新记录"。
节点级残留(仅在 child 挂死之后需要):孤儿 X 锁会让 child 无法使用 :80。/tmp 是节点本地盘、不共享,必须进节点操作:
# 1) 开一个节点会话(slurm-work-01 换成目标节点)
ssh root@192.168.31.28 'srun -p long -N1 -n1 -w slurm-work-01 -t 00:05:00 bash'
# 2) 在节点会话内诊断 + 条件删除([高危],删前必须校验锁内 PID 已不存在)
ls -l /tmp/.X*-lock
pgrep -a -f cdsXvnc
p=$(cat /tmp/.X80-lock | tr -d ' \n'); kill -0 "$p" 2>/dev/null && echo "ALIVE-跳过" || rm -f /tmp/.X80-lock
预期:清理前只有锁、无 cdsXvnc 进程(孤儿);清理后 /tmp/.X*-lock 不存在。
2026-10-04 实测:/tmp/.X80-lock 内容为 62796(已死的 VNC PID,job 31 挂死时留下),清除后节点无 X 锁;同日 interactive.13 一次通过(spectre completes with 0 errors,2.65 s),child 因该锁改走 cdsXvnc :81。
来源:
/home/rain/Documents/eda_tools_ins/design/hpc_slurm_20261003/SOP.md| 最后更新:2026-10-04 04:44(由build/sync.py同步,请勿在站点侧修改)