在共享 farm 上用 LSF 跑 Spectre APS / Spectre X 仿真时,经常会在 log 里看到一组与多线程相关的告警:SPECTRE-585、SPECTRE-590、SPECTRE-591。这些告警的本质都是同一件事:用户通过 +mt 指定的线程数与 LSF 实际分配给作业的核数不一致。本文基于 Cadence Support 文章,梳理告警来源、各种典型场景,以及推荐的解决方案。
1. 告警是什么
典型场景:通过 LSF 启动一个 xterm,然后在该 shell 里提交 Spectre APS 仿真:
1
2
3
4
5
bsub -q interactive -n 4 "xterm"
# 在该 xterm 中:
spectre +aps input.scs ... +mt=16
# 或
spectre +aps input.scs ... +mt
在 spectre log 里 “Multithreading Enabled” 之前,会出现:
1
2
3
4
5
WARNING (SPECTRE-585): The number of threads requested ( +mt=8 ) is not consistent
with the number of processors assigned by farm to the process ( 4 ).
WARNING (SPECTRE-591): Spectre may restrict the number for threads (for its
multithreading capability), for the requested number is greater than the number
of processors assigned by farm.
或者在只分配到 1 核时的变体:
1
2
3
4
WARNING (SPECTRE-585): The number of threads requested ( 16 ) is not consistent
with the number of processors assigned by farm to the process ( 1 ).
WARNING (SPECTRE-590): Spectre may turn off multithreading capability because only
one processor is assigned on this machine by farm.
这两组告警都是 Spectre 在告诉用户:你要的线程数与 farm 给的核数对不上。
Spectre X 仿真器同样会输出这些告警。
2. 三种典型场景
场景 1:bsub -n 4,spectre +aps ... +mt=8
farm 只给 4 个核,但用户显式要 8 线程。Spectre 最终只能在 4 个核上跑,会触发 SPECTRE-585 与 SPECTRE-591。
场景 2:bsub -n 4,spectre +aps ... +mt
+mt 不带参数时,Spectre 会按它自己的默认逻辑请求多个线程(例如 8)。farm 给的还是 4 核,因此同样触发 SPECTRE-585 与 SPECTRE-591。
场景 3:bsub 不带 -n,spectre +aps ... +mt=8
LSF 默认只给 1 核,但用户要 8 线程。这时触发的是 SPECTRE-585 与 SPECTRE-590 —— Spectre 可能直接关闭多线程,因为只有一个处理器。
场景 3 是最容易”误伤”邻居作业的:如果不加约束,Spectre APS 会在 LSF 只分配 1 核的情况下仍然实际占用更多核,影响同机器上其他作业。
3. 解决方案 A:让 +mt 与 -n 保持一致
最直接的做法是手动把 spectre 的线程数对齐到 LSF 申请的核数。例如场景 1、2 中应改为:
1
bsub -n 4 ... spectre +aps input.scs ... +mt=4
或者更省心,让 Spectre 自动从作业调度系统继承核数:
1
spectre +aps input.scs ... +mt=lsf
+mt= 后面的值可以是:
1
+mt=lsf | sge | nc | loadleveler | netbatch | farm
按当前 farm 的调度系统选一个即可。这样无论 -n 是几,Spectre 都会自动用对应的线程数,告警随之消失。
或者在 .cdsenv 文件定义:
1 2 spectre.turboOpts mtOption string "Manual" spectre.turboOpts numThreads string "lsf"或者在 .cdsinit 文件定义:
1 2envSetVal("spectre.turboOpts" "mtOption" 'string "Manual") envSetVal("spectre.turboOpts" "numThreads" 'string "lsf")
4. 解决方案 B:环境变量 CDS_MMSIM_HONOR_DRM_ALLOCATION
如果不想(或没法)让所有用户都改命令行,没法统一定制 .cdsenv/.cdsinit 文件,则可以从环境层面强制约束。设置:
1
setenv CDS_MMSIM_HONOR_DRM_ALLOCATION 1
之后即使提交命令写的是:
1
bsub -q <queue_name> -n 4 spectre -64 +aps +mt=8 input.scs
Spectre APS 实际只会用 4 个线程,而不是 8 个。
更进一步:如果 bsub 不带 -n,在该环境变量生效的情况下,Spectre APS 会按 LSF 实际预留的核数(默认 1)来跑,也就是 单线程,从而避免它越界占用整台机器的核。
5. 两个方案的对比
| 方案 | 控制粒度 | 改动位置 | 行为 |
|---|---|---|---|
+mt=lsf / +mt=N |
单次仿真 | spectre 命令行 | 主动对齐到 LSF 分配 |
CDS_MMSIM_HONOR_DRM_ALLOCATION=1 |
全局(按 shell/环境) | 环境变量 | 强制把上限压到 LSF 分配,用户 +mt=N 中超过的部分被忽略 |
经验上,两个方案并不冲突:
- 个人调试脚本用
+mt=lsf最省事。 - 共享 farm 的默认 profile / wrapper 脚本里设置
CDS_MMSIM_HONOR_DRM_ALLOCATION=1,作为兜底,防止用户忘记或写错+mt。
6. 小结
SPECTRE-585是”线程数 ≠ farm 核数”的总告警,SPECTRE-590表示”farm 只给了 1 核,多线程可能被关掉”,SPECTRE-591表示”线程数大于 farm 核数,会被压回去”。- 这些告警本身不会让仿真出错,但意味着资源使用与预期/farm 调度不一致,可能影响吞吐和邻居作业。
- 解决的关键是把
+mt与bsub -n对齐;推荐+mt=lsf让 Spectre 自动跟 LSF 一致。 - 共享环境里用
setenv CDS_MMSIM_HONOR_DRM_ALLOCATION 1兜底,让 APS 严格不超过 LSF 预留核数。
参考
- Cadence Support:Warning SPECTRE-585 and SPECTRE-591 when specified number of threads is not consistent with the processors assigned by farm(Article ID
a1O0V000009Mq3fUAC,内部 CCR# 2108917、2118301) - Cadence Support:How to restrict Spectre APS to use the number of threads reserved by LSF(Article ID
a1Od0000000vGScEAM)