3. Linux 高性能计算环境准备
Sentaurus TCAD 的批量仿真能力,本质上建立在 Linux 集群环境之上。与单机图形界面操作不同,批量仿真要求用户通过 SSH 登录计算节点、借助 Environment Modules 切换工具链、用 MPI 启动多进程并行、并让 Sentaurus 正确找到许可证服务器。本节围绕这条“从登录到能跑通一个并行作业”的链路展开,重点讲清每一步的实际对象、关键命令与判断依据。
一、集群登录与作业提交入口
典型 HPC 集群由登录节点(login node)和若干计算节点(compute node)组成。登录节点只用于编辑文件、提交作业和查看结果,真正的仿真进程运行在计算节点上。用户通过 SSH 登录:
ssh -p 22 user@cluster.example.edu
# 登录后确认身份与所在节点
hostname
whoami
echo $HOME
登录节点通常不安装 Sentaurus 的图形界面,也不应在其上直接运行长时间仿真,否则会拖垮共享资源。作业调度一般由 Slurm 或 PBS 承担,例如 Slurm 下用 sbatch 提交、squeue 查看队列、scancel 取消作业。判断登录是否正常,可观察 hostname 是否返回登录节点名、$HOME 是否指向个人家目录。若使用密钥登录,需确认 ~/.ssh/id_rsa 权限为 600,否则 SSH 会拒绝使用该密钥。
二、模块系统:切换编译器与 MPI
集群上往往同时存在多套编译器(GCC、Intel oneAPI、AOCC)和多套 MPI(OpenMPI、Intel MPI、MVAPICH)。Environment Modules 通过修改 PATH、LD_LIBRARY_PATH、MANPATH 等环境变量,让用户按需切换。常用命令:
module avail # 列出可用模块
module load gcc/11.3.0 # 加载指定版本 GCC
module load openmpi/4.1.4 # 加载 OpenMPI
module list # 查看当前已加载模块
module purge # 清空所有模块
module swap openmpi/4.1.4 openmpi/4.1.5 # 切换版本
关键原则是:编译器与 MPI 必须成对匹配。用 GCC 编译的 MPI 程序,运行时也应加载同一套 GCC 构建的 OpenMPI;混用 Intel MPI 与 GCC 编译的库,常出现符号未定义或运行时段错误。加载完成后用 which mpicc 和 mpicc --version 确认实际调用的编译器路径与版本,这是排查“编译通过但运行失败”的第一手依据。
三、编译器与 MPI 环境验证
在正式跑 Sentaurus 前,建议先用一个最小 MPI 程序验证工具链是否可用。编写 hello_mpi.c:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
printf("Hello from rank %d of %d\n", rank, size);
MPI_Finalize();
return 0;
}
编译与运行:
mpicc -O2 hello_mpi.c -o hello_mpi
mpirun -np 4 ./hello_mpi
若输出四行 rank 0~3,说明编译器、MPI 与进程启动均正常。若报 mpirun: command not found,说明 MPI 模块未加载;若报 ORTE_ERROR 或无法连接节点,通常是主机名解析或 SSH 免密未配置。这一步是后续 Sentaurus 并行仿真的前置条件。
四、Sentaurus 安装目录结构
Sentaurus 安装后通常位于 /opt/synopsys/sentaurus/<版本>,其核心目录如下表所示。理解目录结构有助于定位可执行文件、库和示例。
| 目录 | 作用 |
|---|---|
bin/ | sdevice、sprocess、svisual 等主程序 |
lib/ | 共享库与 MPI 相关库 |
tcllib/ | TCAD 工具使用的 Tcl 脚本库 |
tcad_<版本>/ | 示例、模板与文档 |
license/ | 许可证相关工具与说明 |
环境变量通常由安装脚本或模块文件设置,核心包括 STROOT(安装根目录)、PATH(加入 $STROOT/bin)、LD_LIBRARY_PATH(加入 $STROOT/lib)以及 STDB(示例库路径)。可用 echo $STROOT 与 which sdevice 验证是否生效。
五、许可证配置与验证
Sentaurus 采用 FlexLM 许可证管理。客户端需要设置 SNPSLMD_LICENSE_FILE 或 LM_LICENSE_FILE 指向许可证服务器,例如:
export SNPSLMD_LICENSE_FILE=27020@license.example.edu
# 或使用端口@主机形式
export LM_LICENSE_FILE=27020@license.example.edu
其中 27020 是许可证服务端口,需与服务器 lmgrd 启动时一致。验证命令:
lmutil lmstat -c 27020@license.example.edu -a
若输出中能看到 Users of sdevice 及可用 license 数量,说明连接正常;若报 Cannot connect to license server,应检查网络连通性(telnet license.example.edu 27020)、防火墙以及服务器端 lmgrd 是否运行。批量仿真时,多个作业会同时占用 license,需关注并发数是否超过授权数量,否则作业会排队等待或直接失败。
六、批量仿真的环境固化
为避免每次登录都重复加载模块,可将环境写入 ~/.bashrc 或独立的 env.sh,并在 Slurm 脚本中 source 它。一个典型的作业脚本片段如下:
#!/bin/bash
#SBATCH --job-name=sentaurus_test
#SBATCH --nodes=1
#SBATCH --ntasks=8
#SBATCH --time=02:00:00
module purge
module load gcc/11.3.0 openmpi/4.1.4
export SNPSLMD_LICENSE_FILE=27020@license.example.edu
source /opt/synopsys/sentaurus/current/env.sh
srun sdevice pp8_des.cmd
其中 --ntasks=8 与 sdevice 的并行进程数需一致,否则会出现进程数与 license 占用不匹配。提交后用 squeue -u $USER 观察状态,作业完成后检查 pp8_des.out 与日志中是否出现 Finished 或错误码。若日志提示 license 获取失败,应回到第五步用 lmstat 确认服务器状态,而不是盲目重跑。
env.sh,所有作业脚本统一 source,这样批量仿真时环境一致,排障时也只需检查一个文件。