opensource_community
← 返回测试报告

🖥️ LAMMPS 海光 DCU 双平台编译与性能验证报告

gfx936/BW + gfx906/Z100 · DTK 25.04.2–26.04 · Kokkos/HIP · GPU 包 · GPU-aware MPI
作者:opensource_community · 融合更新:2026-08-18

📋 1. 环境信息与验证范围

本报告将两次独立验证按同一工程链路重组。平台 A 负责 gfx936 的架构适配、GPU 包对照和源码优化;平台 B 负责 gfx906/Z100 的原生架构构建、正确性与多卡扩展。地域、集群别名、SSH 地址、分区名、节点名和绝对用户目录均已脱敏。

平台 A · gfx936/BW

系统Sugon 8.9 (Linux) CPUHygon C86(128 核,64 核/socket) DCUC-3000 BW,gfx936,80 CU,1500 MHz,64 GB 工具链GCC 9.3.0,DTK 25.04.2 / hipcc Clang 17 MPIMPICH 4.1.2;扩展验证使用 OpenMPI 5.0.7 软件CMake 3.24.1,LAMMPS 22 Jul 2025 Update 4,Kokkos 4.6.2

平台 B · gfx906/Z100

系统CentOS 7.6 / glibc 2.17 CPUHygon C86 7185(32 核) DCUZ100 / Device 66a1 / Vega 20,gfx906,64 CU,16 GB/卡,单机 4 卡 节点内存123 GB 工具链GCC 9.3.0,DTK 26.04,hipcc → dcc 25.10.0-0 / Clang 17 软件CMake 3.25.0,LAMMPS 22 Jul 2025 Update 5,Kokkos 4.6.2 MPIOpenMPI 5.0.7(源码编译,--with-rocm 调度器Slurm 3.2.10;CPU 编译队列与 1–4 卡测试队列名称已脱敏

⚙️ 2. 编译过程与主要难题

2.1 方案一:GPU 包 + HIP 后端

尝试:使用 -D PKG_GPU=ON -D GPU_API=HIP -D HIP_ARCH=gfx936

初次结果:编译成功,但运行时挂死

初次分析:GPU 包的 gpu 库被 DTK 的 cmake 添加了 -xhip 编译标志,导致 hipcc 为所有 .cpp 文件生成 HIP 设备代码。运行时 HIP 初始化卡住。

修复后:通过设置 AMDGPU_TARGETS="gfx936" 和禁用 HIP_USE_DEVICE_SORT,成功编译并运行。但性能测试表明 GPU 包比 Kokkos 慢 4.6-6.3 倍(详见第 6 节对比分析)。

2.2 方案二:KOKKOS 包 + HIP 后端 (架构不匹配)

尝试:使用 -D PKG_KOKKOS=ON -D Kokkos_ENABLE_HIP=ON

结果:编译成功,但运行时报错:running kernels compiled for gfx906 on gfx936

分析:Kokkos 4.6.2 不支持 gfx936 架构,自动检测回退到 gfx906。gfx906 与 gfx936 的指令集不兼容,导致 hipErrorInvalidKernelFile

2.3 方案三:修改 Kokkos 源码支持 gfx936 (最终方案)

思路:在 Kokkos 的 cmake 配置和 HIP 后端代码中手动添加 gfx936 架构支持。

📄 修改 1:lib/kokkos/cmake/kokkos_arch.cmake
在 SUPPORTED_AMD_ARCHS 列表中添加 AMD_GFX936,对应标志 gfx936;将 gfx936 放在 gfx906 之前,确保自动检测优先匹配 gfx936;在架构检测循环中添加 936 的正则匹配分支。
📄 修改 2:lib/kokkos/cmake/KokkosCore_config.h.in
添加 #cmakedefine KOKKOS_ARCH_AMD_GFX936
📄 修改 3:lib/kokkos/core/src/HIP/Kokkos_HIP_Instance.hpp
HIPTraitsWarpSize 条件编译中添加 defined(KOKKOS_ARCH_AMD_GFX936)。海光 BW 系列 wavefront 大小为 64,与 gfx906/gfx908 相同。
📄 修改 4:lib/kokkos/core/src/HIP/Kokkos_HIP_IsXnack.hpp
gpu_arch_can_access_system_allocations 函数中添加 defined(KOKKOS_ARCH_AMD_GFX936)return false 分支。海光 DCU 不支持系统内存访问。

2.4 gfx906/Z100:原生架构路径

与 gfx936 不同,gfx906(Vega 20)已经被 Kokkos 4.6.2 原生支持,因此无需修改 Kokkos 的四个架构文件,直接启用 Kokkos_ARCH_AMD_GFX906=ONAMDGPU_TARGETS=gfx906。这降低了架构移植成本,但 DTK 26.04 和集群工具链暴露了另一组构建问题。

2.5 DTK 26.04 cuda_wrappers host 模式冲突

编译到约 98% 时,main.cppcuda_wrappers/algorithmunknown type name '__host__'。LAMMPS Update 5 在 cmake/CMakeLists.txt:854 为解决 nlohmann/json 的 HIP SFINAE 问题,把 lmp 目标强制设为 -x c++;DTK 26.04 的 hipcc 在 host 模式仍注入 cuda_wrappers,使标准 <algorithm> 被错误解析。

📄 DTK 26.04 兼容修复
将该目标的 -x c++ 改为 -xhip --offload-arch=gfx906
target_compile_options(lmp PRIVATE
  "$<$<COMPILE_LANGUAGE:CXX>:SHELL:-xhip --offload-arch=gfx906>")
同一问题未在 DTK 25.04.2 的平台 A 上复现,因此按 DTK 26.04 回归记录,而非通用 LAMMPS 缺陷。

2.6 CPU 节点 HSA 符号链不可用

DTK 26.04 的 libhsa-runtime64.so 符号链依赖 DCU 驱动目录 /opt/hyhal/,CPU 编译节点没有该目录,CMake 因而无法发现 HSA runtime。解决方案是绕过失效符号链,显式把 HSA_RUNTIME_LIBRARY 指向共享软件区的真实库文件;公开命令统一写为 <DTK_ROOT>/hyhal/lib/libhsa-runtime64.so

2.7 make 损坏与登录节点 OOM

平台 B 的系统 /usr/bin/make ELF interpreter 指向不存在的 /opt/glibc-2.25/lib/ld-linux.so.2,改用站点提供的 module load compiler/make/4.4。登录节点约 251 GB 内存由约 249 个用户共享,实测可用约 46 GB;hipcc 编译约 1000 个 C++ 文件时 dcc 被 OOM killer 终止。最终把编译提交到 CPU 计算队列,申请 32 核与约 111 GB 独占内存。

2.8 默认三架构造成三倍编译压力

DTK 26.04 默认目标为 gfx906;gfx926;gfx928,使每个源文件被编译三次,放大时间和内存开销。构建前显式执行 export AMDGPU_TARGETS=gfx906,只生成目标架构代码。

2.9 gfx906 GPU-aware MPI 路径

平台 B 的四张 Z100 在同节点内全部 12 对 P2P 组合均返回 hipDeviceCanAccessPeer=1。但 DTK 26.04 缺少 libhsakmt.a,无法构建 UCX ROCm 传输层。替代方案是源码构建 OpenMPI 5.0.7,仅使用 --with-rocm 提供 accelerator: rocmmpiext: rocm,运行时采用共享内存并禁用 UCX 网络路径:--mca pml ob1 --mca btl vader,selfUCX_TLS=sm,self

2.10 两个平台的构建差异

环节gfx936/BWgfx906/Z100
Kokkos 架构需补充 gfx936 支持原生支持 gfx906
DTK 特有问题25.04.2 无 host-mode 回归26.04 需修复 cuda_wrappers 冲突
GPU-aware MPIOpenMPI + UCX + ROCmOpenMPI --with-rocm + shared memory,无 UCX ROCm
构建位置登录节点可完成编译登录节点内存竞争,转 CPU 计算节点

🔧 3. 最终编译命令

# 使用 hipcc 编译器,启用 KOKKOS + HIP + OpenMP 包
cmake ../lammps-22Jul2025/cmake \
  -D PKG_KOKKOS=ON \
  -D Kokkos_ENABLE_HIP=ON \
  -D PKG_OPENMP=ON \
  -D PKG_KSPACE=ON \
  -D PKG_MANYBODY=ON \
  -D PKG_MOLECULE=ON \
  -D PKG_RIGID=ON \
  -D BUILD_MPI=OFF \
  -D CMAKE_INSTALL_PREFIX=$HOME/softwares/lammps/dcu-install \
  -D CMAKE_CXX_COMPILER=hipcc \
  -D CMAKE_C_COMPILER=gcc \
  -D CMAKE_HIP_COMPILER=hipcc \
  -D HIP_PATH=<DTK_ROOT>/hip

3.1 gfx906/Z100 单卡构建

# 仅生成 gfx906;共享软件与安装目录均使用公开占位符
export AMDGPU_TARGETS=gfx906

cmake -S lammps-22Jul2025/cmake -B build-gfx906 \
  -D PKG_KOKKOS=ON \
  -D Kokkos_ENABLE_HIP=ON \
  -D Kokkos_ARCH_AMD_GFX906=ON \
  -D AMDGPU_TARGETS=gfx906 \
  -D HSA_RUNTIME_LIBRARY=<DTK_ROOT>/hyhal/lib/libhsa-runtime64.so \
  -D AMD_HIP_LIBRARY=<DTK_ROOT>/lib/libamdhip64.so \
  -D PKG_OPENMP=ON -D PKG_KSPACE=ON -D PKG_MANYBODY=ON \
  -D PKG_MOLECULE=ON -D PKG_RIGID=ON \
  -D BUILD_MPI=OFF \
  -D CMAKE_INSTALL_PREFIX=<USER_HOME>/softwares/lammps/dcu-install \
  -D CMAKE_CXX_COMPILER=hipcc -D CMAKE_C_COMPILER=gcc \
  -D CMAKE_HIP_COMPILER=hipcc -D HIP_PATH=<DTK_ROOT>/hip
步骤平台 B 最终方案
源码wget https://download.lammps.org/tars/lammps-stable.tar.gz,LAMMPS 22 Jul 2025 Update 5
CMake 修补第 854 行:-x c++-xhip --offload-arch=gfx906
单卡构建BUILD_MPI=OFF,在 CPU 计算队列执行
MPI 构建OpenMPI 5.0.7 + --with-rocm,LAMMPS 改为 BUILD_MPI=ON
产物dcu-install/bin/lmpdcu-mpi-install/bin/lmp,均约 554 MB

📜 4. 测试作业脚本

#!/bin/bash
#SBATCH -p <partition>
#SBATCH -N 1
#SBATCH --gres=dcu:1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=16
#SBATCH --time=00:10:00

module load compiler/gcc/9.3.0
module load compiler/dtk/25.04.2

export PATH=$HOME/softwares/lammps/dcu-install/bin:$PATH

lmp -k on g 1 -sf kk -in input.lj

🚀 5. 性能对比结果

测试配置

CPU 测试32,000 原子, 16 OMP 线程, 20,000 步 DCU 测试256,000 原子, 1 DCU 卡, 20,000 步 (8倍原子数)

性能对比表格

指标 CPU (16核 Hygon C86) DCU (1× C-3000 BW) 加速比
原子数 32,000 256,000
模拟步数 20,000 20,000 =
总耗时 440.81 秒 21.92 秒 20.1×
timesteps/s 45.37 912.28 20.1×
Matom-step/s 1.452 233.544 160.8×
Pair 计算耗时 370.83 秒 (84.1%) 1.69 秒 (7.7%) 219×
邻居搜索耗时 61.83 秒 (14.0%) 3.48 秒 (15.9%) 17.8×
Modify 耗时 5.01 秒 (1.1%) 15.34 秒 (70.0%) 0.33×

DCU 监控数据

指标 数值
平均使用率68%
峰值使用率100%
平均功率122 W
平均温度54.6 °C

关键结论

📌 DCU 单卡处理 8 倍原子数,总耗时仅为 CPU 的 1/20
📌 换算为同规模,DCU 单卡相当于约 160 核 CPU 的计算能力
📌 Pair 计算加速比高达 219 倍,GPU 最擅长的计算密集型任务效果显著
📌 Modify 阶段 (Verlet 积分) 在 GPU 上占比 70%,这是因为 KOKKOS 的 full 风格邻居列表导致通信开销较大
📌 DCU 满负荷运行时温度仅 55 °C,功耗 86-122 W,能效比极高

5.1 gfx906/Z100 正确性与能量守恒

平台 B 使用相同输入分别运行 Kokkos/HIP 与 CPU/OpenMP 16 线程,避免只凭性能判断移植成功。

算例指标GPU (Kokkos)CPU (OpenMP)偏差
LJ 10000 步TotEng-4.62126-4.621190.0015%
LJ 10000 步Temp0.697230.695910.19%
EAM 1000 步TotEng-106640.19-106640.19打印精度内一致
EAM 1000 步Temp796.34045796.34045打印精度内一致
EAM 1000 步E_pair-109934.01-109934.01打印精度内一致

LJ 的微小差异来自并行浮点求和顺序。NVE 收敛测试中,LJ 总能从平衡后的 -4.6203 变化到 -4.6213,漂移低于 0.02%;EAM 从 -106640.66 变化到 -106640.19,漂移低于 0.0004%。

5.2 gfx906/Z100 算例覆盖

算例包/风格GPUCPU
in.ljpair lj/cut通过通过
in.eampair eam / MANYBODY通过通过
in.chainbond fene / MOLECULE通过未测
in.rhodopppm/kk + CHARMM + SHAKE / KSPACEneigh half通过

5.3 gfx906/Z100 单卡弱扩展

算例原子数step/sMatom-step/s观察
LJ32K223471.5
LJ256K472120.9
LJ2M66.9137.1进入饱和区
LJ16.4M8.18134.0稳定饱和
EAM32K62520.0
EAM256K180.646.2
EAM2M25.251.5逼近饱和

5.4 gfx906/Z100 多卡强扩展(2M 原子)

算例GPU 数非 GPU-awareGPU-awareaware 提升相对 1 卡
LJ167.367.71.00×
LJ244.1(0.65×)91.42.07×1.35×
LJ478.1125.81.61×1.86×
EAM125.525.51.00×
EAM222.5(0.88×)39.91.77×1.56×
EAM440.559.51.47×2.33×

GPU-aware MPI 把 2 卡从减速转为 1.35–1.56× 加速,并把 4 卡提升到 1.86–2.33×。该结果与平台 A 多卡未突破单卡形成鲜明对照,说明通信栈、P2P 拓扑、问题规模和站点配置都属于结论的一部分。

5.5 跨平台性能观察

指标gfx906/Z100gfx936/BW观察
架构 / CU / 显存Vega 20 / 64 / 16 GBgfx936 / 80 / 64 GB硬件与容量不同
LJ 256K472 step/s约 912 step/s约 52%
LJ 饱和吞吐约 134 Matom-step/s约 80 Matom-step/s平台 B 约 1.68×
EAM 2M25.2 step/s约 21 step/s平台 B 约 1.2×
2 卡 LJ 缩放1.35×0.71–0.79×平台 B 更好

两套环境并非同一输入、版本与通信栈,上表只保留原始报告的趋势观察,不能作为严格的硬件排名。平台 B 的同节点 PCIe P2P 效率是多卡表现较好的重要因素。

⚖️ 6. GPU 包 vs Kokkos 性能对比

6.1 测试目的

验证是否存在比 Kokkos 更高效的 GPU 加速方案。GPU 包使用手写优化的 HIP 内核,理论上可能比 Kokkos 的通用抽象更高效。

6.2 GPU 包编译修复

关键修复点
  • AMDGPU_TARGETS="gfx936"GPU_TARGETS="gfx936":防止 DTK 自动添加多个架构导致 --offload-arch 泄漏到 g++
  • HIP_USE_DEVICE_SORT=OFF:避免链接 hip::device,防止 -xhip 标志被传递给 g++

6.3 性能对比结果(32K 原子,1000 步)

指标 GPU 包 + HIP Kokkos + HIP Kokkos 优势
总耗时 3.47 秒 0.55 秒 6.3×
timesteps/s 288.1 1804.1 6.3×
Matom-step/s 37.8 236.5 6.3×

6.4 性能对比结果(256K 原子,1000 步)

指标 GPU 包 + HIP Kokkos + HIP Kokkos 优势
总耗时 14.73 秒 3.20 秒 4.6×
timesteps/s 67.9 312.5 4.6×
Matom-step/s 71.2 327.7 4.6×

6.5 GPU 包较慢的原因分析

📌 邻居列表在 CPU 构建:GPU 包输出显示 "Neigh mode: Hybrid (binning on host)",每次重建都需要 CPU→GPU 数据传输,而 Kokkos 完全在 GPU 上构建邻居列表
📌 GPU 包设计偏向多 GPU:单 GPU 场景下开销较大,需要额外的 fix gpu 命令管理资源
📌 Kokkos 更深度集成:所有计算(pair, neighbor, comm)都在 GPU 上,数据传输最少化

6.6 海光原生编译器确认

通过分析 DTK 工具链,确认当前方案已经使用海光原生编译器

# hipcc 最终调用海光原生 dcc 编译器
hipcc → <DTK_ROOT>/dcc/bin/dcc
           ↓
  海光 ISA bitcode: oclc_isa_version_936.bc

Kokkos 的 AMD_GFX936 只是命名约定,底层编译使用海光自己的 dcc 编译器 + 海光 ISA bitcode,已经是原生编译

🔬 7. 热点分析与源码优化

7.1 HIP 热点跟踪

使用 DTK 25.04.2 hipprof --hip-trace --stats 对 1,048,576 原子动态 LJ 基准进行热点分析。

Kernel调用次数总时间占比
LJ pair force5,19412.877 s64.92%
full neighbor-list build2635.523 s27.85%
fused NVE integrate5,1941.091 s5.50%
all remaining kernels-0.344 s1.74%

Pair 和 Neighbor 合计占设备时间的 92.8%,是唯一值得优化的目标。

7.2 PMC 硬件计数器分析

对 Pair 和 Neighbor 两热点进行 PMC 采集,提取关键指标:

指标LJ pair forceNeighbor build
VALU 指令70,299,737433,198,843
VMEM 读指令9,440,57419,685,740
VMEM 写指令65,5369,601,271
LDS 指令079,223,620
LDS wait 指令014,343,770
L2 hit rate95.10%83.77%
TCP data-stall 周期3,537,466467,603,303

Pair 无 LDS 使用,L2 命中率高;Neighbor 有大量 LDS 和 TCP stall 活动,是下一步优化重点。

7.3 Pair workgroup 扫描(负优化)

测试 workgroup 64/128/256/512/1024,每三轮交错运行:

Workgroup均值 (step/s)相对 1024
64228.706-8.58%
128230.307-7.94%
256233.920-6.50%
512241.857-3.32%
1024250.173基线

性能随 workgroup 增大而单调提升,Kokkos 自动选择的 1024 已是测试中的最佳值。实验代码已回退。

7.4 Neighbor transpose 优化(+13.6%)

运行时选项 neigh/transpose on,无需重新编译,三轮交错验证:

模式Run 1Run 2Run 3均值提升
transpose on284.280284.007284.166284.151+13.61%
transpose off249.724250.186250.375250.095基线

改变邻居列表在 GPU 上的内存布局(行主序→列主序),优化 pair kernel 的缓存访问模式。注意 transpose on 的收益与系统规模相关:1M 原子时 +13.6%,32K 原子时反而略慢 -1.2%。

7.5 Neighbor BPT 优化(+4.31%)

测试 neighbor 构建中每 team 的 bin 数量(BPT=1/2/4/8),三轮交错运行:

BPT均值 (step/s)相对默认
1260.742+4.31%
2 (默认)249.974基线
4258.720+3.50%
8260.992+4.41%

默认 BPT=2 是四组中最差的。BPT=1 提升 +4.31%,仅需一行代码修改(const int factor = 1;),已保留在源码中。

📊 8. CPU vs DCU 性能对比分析

8.1 原始"160 核"结论的缺陷

第一版报告声称 DCU 单卡相当于 160 核 CPU,该结论基于不同原子数的对比:

平台原子数timesteps/sMatom-step/s
CPU (16 OMP 线程)32,00045.371.452
DCU (原始)256,000912.28233.544

Matom-step/s 的比值 233.544 / 1.452 = 160.8×,但这是跨规模比较。GPU 在大规模下利用率更高,跨规模对比会系统性地夸大 GPU 加速比。

8.2 同规模公平对比(32,000 原子)

平台step/sMatom-step/s加速比
CPU (16 OMP 线程)52.921.693
DCU (1× C-3000 BW)3,206.09102.59560.6×

同规模下 DCU 单卡加速比约为 60 倍,而非 160 倍。后续测试表明 GPU 利用率仅 20-41%(取决于 pair style),瓶颈在 CPU 侧框架开销。

8.3 原子数扩大后 GPU 加速效果的变化

📌 GPU 加速比随原子数增加而提升:32K 时 60×,估算 1M 时 ~172×。原因:固定开销摊薄、GPU 占用率提升、计算/访存比改善
📌 LJ 基准 GPU 利用率仅 20%:Pair 计算仅占 6.8%,Modify(CPU 侧框架)占 76%。LJ 太轻量,不适合 GPU 优化
📌 EAM 基准 GPU 利用率提升到 41%:Pair 计算占 36.8%,计算量是 LJ 的 20.7×。EAM 是更合理的 GPU 基准

🔬 9. 优化实验全记录

9.1 有效优化

优化基准收益原理代价
neigh/transpose on LJ 1M +13.61% 邻居列表行主序→列主序,优化 pair kernel 缓存访问模式 运行时选项,零成本
neigh/transpose on EAM 1M +3.18% 同上,但 EAM 计算更密集,访存优化收益递减 同上
Neighbor BPT=1 LJ 1M +4.31% 每 team 处理 1 个 bin(原默认 2),减半 LDS 用量 → 更高 occupancy 一行源码修改
Neighbor BPT=1 EAM 1M +0.60% Neighbor 仅占 EAM 总时间的 4.6%,优化空间极小 同上

9.2 无效优化(负优化或零收益)

优化收益原因分析处理
Pair workgroup 64 -8.58% workgroup 越小,每个 CU 的 wave 数越少,并行度下降 代码已回退
Pair workgroup 128 -7.94% 性能随 workgroup 单调递增,Kokkos 自动选 1024 正确 代码已回退
Pair workgroup 256 -6.50%
Pair workgroup 512 -3.32%
DTK 25.04.4 升级 -0.23% 编译器/运行时版本迭代无性能差异 不升级
DTK 26.04 升级 -0.11%
fix nve/kk mask 快路径 -0.12% 分支预测失败,额外条件判断增加开销 代码已回退
fix nve/kk 单类型质量 -0.49% 类型检查开销超过计算简化收益 代码已回退
nbin/atoms/per/bin 扫描 无法测试 需 neigh/thread on,会改变 pair 算法,混淆比较 放弃
2 GPU (无 GPU-aware) 0.42× Comm 占 42%,数据在 CPU-GPU 间来回拷贝 升级到 GPU-aware
2 GPU (GPU-aware, LJ) 0.71-0.79× Comm 降到 8-30%,但 LJ 计算太轻无法摊薄通信 改用 EAM
2 GPU (GPU-aware, EAM 4M) 0.78× EAM 计算更密集,2/1 比从 0.78 提升到 0.87,趋势向好但未突破 1.0 需更大规模
2 GPU (GPU-aware, EAM 8M) 0.87×

9.3 关键经验总结

📌 LJ 基准不适合 GPU 优化:GPU 仅活跃 20%,Pair 占 6.8%。优化效果被放大(transpose +13.6% 在 EAM 上仅 +3.2%)
📌 EAM 是更合理的 GPU 基准:GPU 活跃 41%,Pair 占 36.8%,计算量 20.7× LJ
📌 访存优化收益随计算密度递减:transpose 在 LJ 上 +13.6%,EAM 上仅 +3.2%
📌 GPU 利用率被 Modify 限制:Modify 占 57-76% 时间,为 CPU 侧框架开销,源头上难以优化
📌 多 GPU 需 GPU-aware MPI + 计算密集势函数 + 大原子数:三个条件缺一不可

🔧 10. MPI 编译与 GPU-aware 配置

10.1 背景

LAMMPS 多 GPU 需要 MPI 支持。系统自带的 OpenMPI(GCC 8.5.0 编译)与当前 GCC 9.3.0 存在 ABI 不匹配,导致 MPI_Finalizedouble free crash。此外,无 GPU-aware 的 MPI 在每步通信时需要 CPU↔GPU 数据拷贝,通信开销极大。

10.2 编译环境

组件版本来源
GCC9.3.0module load compiler/gcc/9.3.0
DTK25.04.2module load compiler/dtk/25.04.2
UCX1.18.0module load mpi/ucx/1.18.0/dtk-25.04/shca
OpenMPI5.0.7源码编译

10.3 编译步骤

# 下载并编译 OpenMPI 5.0.7
wget https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.7.tar.gz
tar xzf openmpi-5.0.7.tar.gz && cd openmpi-5.0.7

# 加载依赖
module purge
module load compiler/gcc/9.3.0
module load compiler/dtk/25.04.2
module load <UCX_MODULE>

# 配置:启用 UCX 通信层 + ROCm GPU 加速器
./configure --prefix=$HOME/softwares/mpi/install \
  --enable-mpi-fortran=no \
  --with-ucx=<UCX_ROOT> \
  --with-rocm=<DTK_ROOT>

make -j32 && make install

10.4 GPU-aware MPI 组件

组件说明验证命令
accelerator: rocmGPU 直接内存访问,避免 CPU↔GPU 拷贝ompi_info --all | grep rocm
pml: ucxUCX 点对点通信层,支持 InfiniBand/RoCEompi_info --all | grep 'pml: ucx'
osc: ucxUCX 单边通信(RDMA)ompi_info --all | grep 'osc: ucx'
mpiext: rocmROCm MPI 扩展ompi_info --all | grep mpiext

10.5 LAMMPS MPI 构建

# 使用自编译 MPI 构建 LAMMPS
cmake -S lammps-22Jul2025/cmake -B build-mpi \
  -C cmake/presets/hygon-dcu-gfx936.cmake \
  -D CMAKE_CXX_COMPILER=$DTKROOT/bin/hipcc \
  -D BUILD_MPI=ON \
  -D MPI_CXX_COMPILER=$HOME/softwares/mpi/install/bin/mpicxx \
  -D MPI_CXX_INCLUDE_PATH=$HOME/softwares/mpi/install/include \
  -D MPI_CXX_LIBRARIES=$HOME/softwares/mpi/install/lib/libmpi.so

10.6 运行时配置

# Slurm 作业脚本关键配置
module load <UCX_MODULE>
export PATH=$HOME/softwares/mpi/install/bin:$PATH
export LD_LIBRARY_PATH=$HOME/softwares/mpi/install/lib:$LD_LIBRARY_PATH

# 启动命令:-pk kokkos gpu/aware on 启用 GPU 直接通信
mpirun -np 2 lmp -in input -k on g 1 -sf kk \
  -pk kokkos neigh/transpose on gpu/aware on

10.7 MPI 版本对比

MPI 版本2 GPU step/sCommshutdownGPU-aware
系统 MPI (GCC 8.5, 无 UCX)104.6542%crash
自编译 MPI (GCC 9.3, 无 UCX)104.6542%
GPU-aware MPI (GCC 9.3 + UCX+ROCm)176.9540%

GPU-aware MPI 使 2 GPU 性能提升 69%(105→177 step/s),Comm 时间从 20.2s 降到 11.4s(-43%)。这是通过 UCX+ROCm 避免 CPU↔GPU 数据拷贝实现的。

10.8 UCX 选择说明

DTK 25.04.2 不自带 UCX 库。测试环境通过 <UCX_MODULE> 提供带 ROCm 传输层的 UCX 组件。OpenMPI 5.0.7 通过 --with-ucx--with-rocm 链接相关组件,实现 GPU-aware 通信。

UCX 模块路径:<UCX_ROOT>

ROCm 路径:<DTK_ROOT>

10.9 gfx906/Z100:无 UCX ROCm 的同节点方案

平台 B 因 DTK 26.04 缺少静态 libhsakmt.a,不构建 UCX ROCm 传输层。OpenMPI 仍可通过 ROCm accelerator 扩展识别设备指针,并在同一节点内使用共享内存:

./configure --prefix=<USER_HOME>/softwares/mpi/ompi-install \
  --enable-mpi-fortran=no \
  --with-rocm=<DTK_ROOT> \
  --with-slurm

export UCX_TLS=sm,self
mpirun --mca pml ob1 --mca btl vader,self \
  -np <GPU_COUNT> lmp -in input \
  -k on g 1 -sf kk -pk kokkos gpu/aware on

该构建已确认提供 accelerator: rocmmpiext: rocm。它用于节点内 1–4 卡 P2P 测试,不代表跨节点 RDMA 已验证。

📁 11. 最终文件结构

~/softwares/lammps/
├── lammps-22Jul2025/ # 源码 (Git 仓库)
│ ├── src/KOKKOS/
│ │ ├── npair_kokkos.cpp # Neighbor BPT=1 优化已保留
│ │ └── pair_kokkos.h # Pair workgroup 实验已回退
│ ├── lib/kokkos/
│ │ ├── cmake/ # gfx926/928/936/938 架构支持
│ │ └── core/src/HIP/ # wavefront 64 + 系统分配属性
│ ├── cmake/presets/
│ │ └── hygon-dcu-gfx936.cmake # 可复现构建 preset
│ └── tools/hygon/ # 构建脚本、基准、分析工具
│ ├── build-gfx936.sh # 版本隔离构建
│ ├── analyze-pmc.py # PMC 自动归约
│ ├── benchmark/ # 基准与 Slurm 作业
│ └── results/ # 实验结论 Markdown
├── install-dtk-25.04.2-gfx936/ # 基线二进制
├── install-pair-wg-*-gfx936/ # Pair 实验二进制(保留)
├── install-neighbor-bpt-*-gfx936/ # Neighbor 实验二进制(保留)
└── dcu-test/ # 原始 profiling 数据
├── hipprof-<run-id>/ # HIP trace 数据
├── pmc-<run-id>/ # PMC 原始 CSV
├── pair-workgroup-<run-id>/ # Pair 扫描日志
└── neighbor-bpt-<run-id>/ # Neighbor 扫描日志

🎯 12. 最终结论

推荐方案

在本报告所述硬件、软件版本与工作负载范围内,KOKKOS + HIP + neigh/transpose on 获得了最优综合表现。

12.1 架构与编译

gfx936 原生编译:hipcc → dcc(海光 DCU C 编译器),生成海光 ISA 代码
Kokkos 架构支持:gfx926/928/936/938 已注册到 cmake 和 HIP 核心文件
GPU-aware MPI 就绪:OpenMPI 5.0.7 + UCX 1.18.0 DTK + ROCm

12.2 有效优化

neigh/transpose on:LJ +13.6%,EAM +3.2%;为运行时选项,无需修改源码
KOKKOS 性能优于 GPU 包:同规模 EAM 1M 原子,72.9 vs 39.6 step/s(1.84×)

12.3 无效优化(已回退)

❌ Pair workgroup 64-512:慢 3.3-8.6%,Kokkos 自动选 1024 正确
❌ DTK 升级:25.04.4/26.04 无性能差异
❌ fix nve/kk 源码:mask 快路径 -0.12%,单类型质量 -0.49%
❌ BPT=1:LJ +4.3%,但 EAM 仅 +0.6%;已回退,当前证据不足以支持将其作为稳定且可泛化的优化

12.4 多 GPU 缩放

Pair Style模式1 GPU2 GPU4 GPU2/14/1
EAM 1MKOKKOS76.557.145.20.750.59
EAM 4MKOKKOS21.216.50.78
EAM 8MKOKKOS10.28.90.87
EAM 16MKOKKOS5.24.70.90
LJ 1MKOKKOS277.7198.30.71
Tersoff 1.1MKOKKOS195.0123.20.63
EAM 1MGPU 包39.6

EAM 2/1 比 0.78→0.87→0.90,趋势改善但未突破 1.0。GPU 包扩展性好(2/1=1.32)但单卡慢(~1.8× KOKKOS)。

12.5 CPU vs DCU 公平对比

对比原始报告修正后问题
加速比160×60×原始跨规模对比(32K CPU vs 256K DCU)不公平
加速趋势随原子数增大32K: 60× → 1M: ~172×(估算)

12.6 单 GPU 线性缩放

原子数step/sMatom-step/sPair%内存
1M72.576.036.7%0.16GB
4M21.285.032.8%0.64GB
8M10.281.933.8%1.2GB
16M5.282.632.2%2.4GB
25M3.280.232.0%3.8GB
32MOOM

Matom-step/s 稳定 80-85,线性缩放。32M OOM 因邻居列表初始分配 2000/atom 超 64GB。显存先于算力达到瓶颈。

12.7 关键经验

⚠️ LJ 不适合 GPU 基准:GPU 仅活跃 20%,优化效果被放大
⚠️ EAM 是合理的 GPU 基准:GPU 活跃 41%,Pair 占 36.8%
⚠️ 活跃计算阶段的设备利用率可接近 100%(HIP trace 采样),但端到端性能仍受 CPU 侧框架开销限制(Modify 占 57-76%)
⚠️ 显存先于算力瓶颈:32M 邻居列表初始分配 256GB > 64GB
⚠️ 多 GPU 三条件:GPU-aware MPI + 计算密集势函数 + 大原子数(每 GPU > 500K),缺一不可
⚠️ GPU 包 vs KOKKOS:GPU 包扩展性好但单卡慢,KOKKOS 单卡快但多 GPU 差

12.8 gfx906/Z100 已知限制与绕过

CHARMM/Kokkos 邻居列表

dihedral charmm/kk 仅实现 HALF 邻居列表,而 GPU 模式默认 neighflag=FULLatom_style fulllj/charmm/coul/long 又强制 full,产生冲突。使用 -pk kokkos neigh half 后 rhodo 可在 GPU 上运行并与 CPU 结果一致,但缺失的 FULL 实现仍属于上游边界。

类别限制处理/影响
DTK 26.04host 模式注入 cuda_wrappers将 lmp 目标改为 -xhip --offload-arch=gfx906
DTK 26.04缺少 libhsakmt.a无法构建 UCX ROCm;使用 OpenMPI --with-rocm
HSA runtime符号链依赖 CPU 节点不存在的 /opt/hyhal显式指定共享软件区真实库
编译默认生成 gfx906/926/928 三架构固定 AMDGPU_TARGETS=gfx906
硬件gfx906 无 FP8/BF16 硬件支持及 MFMA Matrix Core不影响本文传统分子动力学验证,不外推到矩阵型工作负载
显存单卡 16 GB,LJ 上限约 16M 原子更大模型需多卡切分或降低内存占用
调度测试队列拒绝超过 8 个 CPU 核多卡测试以 8 核总量完成;具体分区名已脱敏

12.9 双平台经验归纳

先区分架构支持状态:gfx906 已被 Kokkos 原生支持;gfx936 需要注册架构、wavefront 和系统分配属性,两者不能复用同一补丁假设。
⚠️ DTK 升级既可能无性能收益,也可能引入构建回归:平台 A 的 25.04.4/26.04 性能基本不变,平台 B 的 26.04 却引入 cuda_wrappers host-mode 问题。
重型 HIP 编译放到计算节点:共享登录节点内存会随并发用户剧烈波动;资源申请须遵守站点 CPU×内存上限并显式传递退出码。
GPU-aware 不必强依赖 UCX ROCm:平台 B 通过 OpenMPI --with-rocm 和共享内存实现同节点 GPU-aware;平台 A 则验证了 UCX+ROCm 路径。
⚠️ 自编译 OpenMPI 要控制传输层:平台 B 使用 pml ob1btl vader,selfUCX_TLS=sm,self,避免未适配的 InfiniBand/UCX 路径触发 GID 断言。
⚠️ 多卡扩展依赖三项条件:GPU-aware MPI、每卡超过约 500K 原子和足够计算密集的势函数缺一不可;显存容量可能先于算力成为上限。

🔗 13. 上游贡献建议

13.1 Kokkos 上游

贡献内容文件状态
gfx926/928/936/938 架构支持添加海光 DCU 架构到 Kokkos cmake 和 HIP 核心kokkos_arch.cmake, KokkosCore_config.h.in, Kokkos_HIP_Instance.hpp, Kokkos_HIP_IsXnack.hpp原型已验证,待上游评审
wavefront 64 支持gfx936 使用 64-wide wavefront,与 gfx906 相同Kokkos_HIP_Instance.hpp本地实现已验证
系统分配访问属性海光 DCU 不支持系统内存直接访问Kokkos_HIP_IsXnack.hpp本地实现已验证

13.2 LAMMPS 上游

贡献内容状态
构建 presetcmake/presets/hygon-dcu-gfx936.cmake:可复现的海光 DCU 构建配置待提交
性能基准KOKKOS vs GPU 包对比数据,多 GPU 缩放分析可供文档引用
推荐配置neigh/transpose on 对 gfx936 有 +3~14% 提升运行时选项,无需代码

13.3 ROCm/HIP 兼容生态

贡献内容状态
gfx936 性能数据LJ、EAM、Tersoff、ReaxFF 在 80 CU 上的单卡/多卡性能可供文档引用
GPU-aware MPI 方案OpenMPI 5.0.7 + UCX 1.18.0 DTK + ROCm 编译方法已文档化
验证方法PMC 分析工具、HIP trace 工作流、动态基准tools/hygon/