摘要:Reference/CPU/CUDA/OpenCL/HIP 五平台的定位与选档——CUDA mixed 精度是生产默认答案,nvidia-smi 验证占卡,多卡 DeviceIndex 分配,以及 mixed/single/double 三档实测对比。 关键字:CUDA、GPU加速、Platform、OpenCL、HIP、mixed精度、nvidia-smi、DeviceIndex 
【官方来源】User Guide §3.7.1 Platforms + Ch.11 Platform-Specific Properties 【Linux 实测】消费级 GPU(12 GB 显存) / 驱动 580.178.04(支持到 CUDA 13.0)/ OpenMM 8.5.2 环境说明:本章正文与 T4 实测时环境 CUDA 运行时为 12.9;章末 T7 三档精度对比实测于环境钉 13.0 之后(见该节注明)——两版运行时均 ≤ 驱动支持版,kernel 正常
1. 五个平台是什么
【官方来源】“OpenMM includes five platforms: Reference, CPU, CUDA, OpenCL, and HIP.”
【Linux 实测】Platform.getNumPlatforms() 实测:
| Reference | 1 | 纯 C++ 参考实现。最慢但最准,交叉验证用 |
| CPU | 10 | 多核 CPU 并行(8.0 起 ARM 也有 JIT) |
| CUDA | 100 | NVIDIA GPU(Linux/Windows) |
| OpenCL | 50 | 跨厂商(macOS 首选、N/A/Intel 通用) |
| HIP | — | AMD GPU,需 ROCm(属性与 CUDA 完全一致) |
2. 选平台的官方三种方式
【官方来源】
方式 1(默认):OpenMM 自动选最快的可用平台。“Usually its choice will be reasonable.”
方式 2(环境变量):
export OPENMM_DEFAULT_PLATFORM=CUDA # 覆盖默认逻辑
方式 3(代码显式指定):
platform = Platform.getPlatform('CUDA')
simulation = Simulation(prmtop.topology, system, integrator, platform)
合法名字:OpenCL、CUDA、HIP、CPU、Reference。
【Linux 实测】getPlatformByName('CUDA') 也能用,但官方文档通篇用 getPlatform(),建议跟官方写法。
3. GPU 平台属性(官方 Ch.11 全表)
3.1 CUDA 平台属性
【官方来源】
| Precision | single / mixed / double | single 全单精度最快最不准;mixed 力单精度+积分双精度,能量守恒好得多,速度略降;double 全双精度最准最慢 |
| DeviceIndex | '0'、'0,1'… | 选 GPU;逗号列表 = 多卡并行一个模拟 |
| UseCpuPme | true/false | PME 用 CPU 算。视硬件可能提速 |
| TempDirectory | 路径 | kernel 编译临时目录,一般自动 |
| UseBlockingSync | true/false(默认 true) | CPU 在 GPU 计算时休眠(true)还是自旋(false)。false 略快但占死 CPU |
| DeterministicForces | true/false | 力的逐位可复现。true 略慢;某些算法(如需要精确可重复力)必须开 |
HIP 平台:属性与 CUDA 完全相同(官方原话)。
OpenCL 平台:Precision / UseCpuPme / DeviceIndex 同上,另有 OpenCLPlatformIndex(多 OpenCL 实现时选哪个)。
3.2 CPU 平台属性
【官方来源】
| Threads | CPU 线程数。默认 = 逻辑核数;可用环境变量 OPENMM_CPU_THREADS 设 |
3.3 确定性(Determinism)
【官方来源】PME 下:Reference、OpenCL、double 精度 CUDA 是确定性的;single 精度 CUDA 和 CPU 平台不确定(力计算求和顺序不同导致微小差异)。官方提醒这些行为不保证未来版本不变。
4. GPU 加速实操
4.1 单卡(本机写法)
【Linux 实测】
from openmm import Platform
platform = Platform.getPlatform('CUDA')
properties = {'DeviceIndex': '0', 'Precision': 'mixed'}
simulation = Simulation(topology, system, integrator, platform, properties)
【Linux 实测·属性名校验】CUDA 平台 getPropertyNames() 实测输出:
DeviceIndex, DeviceName, UseBlockingSync, Precision, UseCpuPme,
CudaCompiler, TempDirectory, CudaHostCompiler, DisablePmeStream, DeterministicForces
注意是 DeviceIndex(不是 CudaDeviceIndex——网上旧教程常见笔误,会报 unknown property)。
4.2 多卡并行一个模拟
【官方来源】
platform = Platform.getPlatform('CUDA')
properties = {'DeviceIndex': '0,1', 'Precision': 'double'}
simulation = Simulation(prmtop.topology, system, integrator, platform, properties)
两张卡分摊一个模拟的计算。注意:这是单模拟多卡,与"多模拟各占一卡"(每张卡跑独立副本)是两回事。
4.3 确认 GPU 真在用
【Linux 实测】三步验证法:
# 1. 平台列表里有 CUDA
python -c "import openmm as mm; print([mm.Platform.getPlatform(i).getName() for i in range(mm.Platform.getNumPlatforms())])"
# 2. 模拟运行时另开终端
watch -n1 nvidia-smi # 出现 python 进程 + 显存占用 = 真在用
# 3. testInstallation 已经过 = CUDA 平台工作正常
【踩坑】CUDA 平台不出现/失败的排查顺序:
5. 精度怎么选
【官方来源】+ 实测建议:
| 常规生产模拟 | mixed(官方各示例默认语境) |
| 追求极限速度、容忍精度损失 | single |
| 自由能计算/需要能量绝对准确 | double |
| 需要逐位可复现的力 | double + DeterministicForces='true',或换 OpenCL/Reference |
【初学者翻译】mixed = 干活的主力干单精度、记账的用双精度,速度和准度兼顾。不确定就用 mixed。
6. 性能自测方法学(写进你的实验记录)
【Linux 实测】ns/day 标准测法:
simulation.reporters.append(StateDataReporter('perf.csv', 1000, step=True, speed=True))
# speed 选项直接输出 ns/day(官方 §3.7.14)
同一体系、同一平台属性下改一个变量(precision/线程/卡数)对比,才算有效 benchmark。不要拿别人的数字当自己的——GPU 型号、体系大小、力场、精度全影响结果。
【实测】T7:mixed vs single vs double 三档对比
【实战背景】CUDA/HIP/OpenCL 平台的 Precision 属性三档怎么选?用 deca-ala(109 原子,NoCutoff,HBonds+HMR,Langevin 4 fs)各跑 5000 步实测(环境 cuda-version=13.0,见章头说明):
| single | 0.12 s | 13,836 ns/day | 224.95 kJ/mol |
| mixed(推荐默认) | 0.22 s | 7,874 ns/day | 228.34 kJ/mol |
| double | 0.36 s | 4,827 ns/day | 274.41 kJ/mol |
【解读】:
本章速查卡
五平台: Reference(1) / CPU(10) / CUDA(100) / OpenCL(50) / HIP(=CUDA属性)
选平台: 默认自动 | OPENMM_DEFAULT_PLATFORM=CUDA | Platform.getPlatform('CUDA')
属性键: DeviceIndex='0,1'(多卡) Precision='mixed'(推荐)
CPU线程: properties={'Threads':'8'} 或 env OPENMM_CPU_THREADS=8
验证: python -m openmm.testInstallation + watch nvidia-smi
测速: StateDataReporter(…, speed=True) 直接出 ns/day
系列导航:本专栏 分子动力学模拟-OpenMM(35 章大百科:官方 User Guide / Tutorials / Cookbook / examples 全覆盖)
我的专栏
| 开源蛋白结构预测 | 分子模拟基础 | 小分子药物设计案例 | AI Agent系列 |
| 开源蛋白生成方法实践 | 分子动力学模拟-Amber | 蛋白药物设计案例 | 化学大模型 |
| 开源多肽设计模型 | 分子动力学模拟-Gromacs | 多肽药物设计案例 | 《AI Agent原理与实战》 |
| 开源多肽性质预测 | 分子动力学模拟-OpenMM | 开源小分子生成设计 | CADD中的机器学习模型 |
| DNA/RNA药物设计 | 結合自由能 | 开源药代动力学软件 | 高效计算配置 |
| siRNA药物设计模型 | UCSF DOCK系列 | 我胡师兄说药 | |
| ASO药物设计模型 | rDock系列 LeDock系列 gnina系列 |
