跳转至

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 结论

  1. 格式杠杆有限:psfascii→psfbin 仅 3.4×(nutbin 相当);单靠换格式不达标。
  2. 节点白名单线性:2→8 节点约 3×;白名单是「防止 ADE-XL 默认全节点 save」,不是主力手段。
  3. 抽稀是主力:strobeperiod 是唯一能数量级降体积的手段(a5/a6 达 75~83×);skipcount=10 只有 ~11×(实际步长远密于 maxstep)。
  4. compression=yes 无效且有害:psfbin 8 节点从 11.4 MB 涨到 22.6 MB(1.73×),禁用。
  5. 达标路径:psfbin + strobeperiod ≤ 100p 时 60 µs/8 节点 ≈ 45 MB,勉强进 50 MB 门禁。
  6. 精度代价(未决):100 ps 抽稀对 GHz 节点(vco5 周期 ≈127 ps)严重欠采样,不能用于测 VCO 波形频率/抖动,只适合慢节点(FB、LPF 输出、控制电压)与锁定包络。test_lock 的 save 白名单须按「要不要 GHz 波形」分成两组定 strobeperiod。
  7. 外推不确定性:以上为 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 变更点

  1. 【高危】清残留作业:scancel 23 27(JobHeldUser),无数据依赖、不需备份。
  2. wrapper 加固(.28:/projects/design/rain01/proj1/verif/batch_0/bin/srun_adexl_wrap.sh):
  3. 变量化 SLURM_TIME="00:30:00"(srun -t)、WALL_GUARD=1860(外壳兜底秒数 = srun + 60 s 余量);
  4. timeout --signal=TERM --kill-after=60 "$WALL_GUARD" srun …;
  5. 去无条件 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 同步,请勿在站点侧修改)