尝试:使用 -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 节对比分析)。
尝试:使用 -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。
思路:在 Kokkos 的 cmake 配置和 HIP 后端代码中手动添加 gfx936 架构支持。
AMD_GFX936,对应标志 gfx936;将 gfx936 放在 gfx906 之前,确保自动检测优先匹配 gfx936;在架构检测循环中添加 936 的正则匹配分支。#cmakedefine KOKKOS_ARCH_AMD_GFX936。HIPTraits 的 WarpSize 条件编译中添加 defined(KOKKOS_ARCH_AMD_GFX936)。海光 BW 系列 wavefront 大小为 64,与 gfx906/gfx908 相同。gpu_arch_can_access_system_allocations 函数中添加 defined(KOKKOS_ARCH_AMD_GFX936) 到 return false 分支。海光 DCU 不支持系统内存访问。# 使用 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
#!/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
| 指标 | CPU (16核 Hygon C86) | DCU (1× C-3000 BW) | 加速比 |
|---|---|---|---|
| 原子数 | 32,000 | 256,000 | 8× |
| 模拟步数 | 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× |
| 指标 | 数值 |
|---|---|
| 平均使用率 | 68% |
| 峰值使用率 | 100% |
| 平均功率 | 122 W |
| 平均温度 | 54.6 °C |
验证是否存在比 Kokkos 更高效的 GPU 加速方案。GPU 包使用手写优化的 HIP 内核,理论上可能比 Kokkos 的通用抽象更高效。
AMDGPU_TARGETS="gfx936" 和 GPU_TARGETS="gfx936":防止 DTK 自动添加多个架构导致 --offload-arch 泄漏到 g++HIP_USE_DEVICE_SORT=OFF:避免链接 hip::device,防止 -xhip 标志被传递给 g++| 指标 | 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× |
| 指标 | 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× |
通过分析 DTK 工具链,确认当前方案已经使用海光原生编译器:
# hipcc 最终调用海光原生 dcc 编译器
hipcc → <DTK_ROOT>/dcc/bin/dcc
↓
海光 ISA bitcode: oclc_isa_version_936.bc
Kokkos 的 AMD_GFX936 只是命名约定,底层编译使用海光自己的 dcc 编译器 + 海光 ISA bitcode,已经是原生编译。
使用 DTK 25.04.2 hipprof --hip-trace --stats 对 1,048,576 原子动态 LJ 基准进行热点分析。
| Kernel | 调用次数 | 总时间 | 占比 |
|---|---|---|---|
| LJ pair force | 5,194 | 12.877 s | 64.92% |
| full neighbor-list build | 263 | 5.523 s | 27.85% |
| fused NVE integrate | 5,194 | 1.091 s | 5.50% |
| all remaining kernels | - | 0.344 s | 1.74% |
Pair 和 Neighbor 合计占设备时间的 92.8%,是唯一值得优化的目标。
对 Pair 和 Neighbor 两热点进行 PMC 采集,提取关键指标:
| 指标 | LJ pair force | Neighbor build |
|---|---|---|
| VALU 指令 | 70,299,737 | 433,198,843 |
| VMEM 读指令 | 9,440,574 | 19,685,740 |
| VMEM 写指令 | 65,536 | 9,601,271 |
| LDS 指令 | 0 | 79,223,620 |
| LDS wait 指令 | 0 | 14,343,770 |
| L2 hit rate | 95.10% | 83.77% |
| TCP data-stall 周期 | 3,537,466 | 467,603,303 |
Pair 无 LDS 使用,L2 命中率高;Neighbor 有大量 LDS 和 TCP stall 活动,是下一步优化重点。
测试 workgroup 64/128/256/512/1024,每三轮交错运行:
| Workgroup | 均值 (step/s) | 相对 1024 |
|---|---|---|
| 64 | 228.706 | -8.58% |
| 128 | 230.307 | -7.94% |
| 256 | 233.920 | -6.50% |
| 512 | 241.857 | -3.32% |
| 1024 | 250.173 | 基线 |
性能随 workgroup 增大而单调提升,Kokkos 自动选择的 1024 已是测试中的最佳值。实验代码已回退。
运行时选项 neigh/transpose on,无需重新编译,三轮交错验证:
| 模式 | Run 1 | Run 2 | Run 3 | 均值 | 提升 |
|---|---|---|---|---|---|
| transpose on | 284.280 | 284.007 | 284.166 | 284.151 | +13.61% |
| transpose off | 249.724 | 250.186 | 250.375 | 250.095 | 基线 |
改变邻居列表在 GPU 上的内存布局(行主序→列主序),优化 pair kernel 的缓存访问模式。注意 transpose on 的收益与系统规模相关:1M 原子时 +13.6%,32K 原子时反而略慢 -1.2%。
测试 neighbor 构建中每 team 的 bin 数量(BPT=1/2/4/8),三轮交错运行:
| BPT | 均值 (step/s) | 相对默认 |
|---|---|---|
| 1 | 260.742 | +4.31% |
| 2 (默认) | 249.974 | 基线 |
| 4 | 258.720 | +3.50% |
| 8 | 260.992 | +4.41% |
默认 BPT=2 是四组中最差的。BPT=1 提升 +4.31%,仅需一行代码修改(const int factor = 1;),已保留在源码中。
第一版报告声称 DCU 单卡相当于 160 核 CPU,该结论基于不同原子数的对比:
| 平台 | 原子数 | timesteps/s | Matom-step/s |
|---|---|---|---|
| CPU (16 OMP 线程) | 32,000 | 45.37 | 1.452 |
| DCU (原始) | 256,000 | 912.28 | 233.544 |
Matom-step/s 的比值 233.544 / 1.452 = 160.8×,但这是跨规模比较。GPU 在大规模下利用率更高,跨规模对比会系统性地夸大 GPU 加速比。
| 平台 | step/s | Matom-step/s | 加速比 |
|---|---|---|---|
| CPU (16 OMP 线程) | 52.92 | 1.693 | 1× |
| DCU (1× C-3000 BW) | 3,206.09 | 102.595 | 60.6× |
同规模下 DCU 单卡加速比约为 60 倍,而非 160 倍。后续测试表明 GPU 利用率仅 20-41%(取决于 pair style),瓶颈在 CPU 侧框架开销。
| 优化 | 基准 | 收益 | 原理 | 代价 |
|---|---|---|---|---|
| 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%,优化空间极小 | 同上 |
| 优化 | 收益 | 原因分析 | 处理 |
|---|---|---|---|
| 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× |
LAMMPS 多 GPU 需要 MPI 支持。系统自带的 OpenMPI(GCC 8.5.0 编译)与当前 GCC 9.3.0 存在 ABI 不匹配,导致 MPI_Finalize 时 double free crash。此外,无 GPU-aware 的 MPI 在每步通信时需要 CPU↔GPU 数据拷贝,通信开销极大。
| 组件 | 版本 | 来源 |
|---|---|---|
| GCC | 9.3.0 | module load compiler/gcc/9.3.0 |
| DTK | 25.04.2 | module load compiler/dtk/25.04.2 |
| UCX | 1.18.0 | module load mpi/ucx/1.18.0/dtk-25.04/shca |
| OpenMPI | 5.0.7 | 源码编译 |
# 下载并编译 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
| 组件 | 说明 | 验证命令 |
|---|---|---|
accelerator: rocm | GPU 直接内存访问,避免 CPU↔GPU 拷贝 | ompi_info --all | grep rocm |
pml: ucx | UCX 点对点通信层,支持 InfiniBand/RoCE | ompi_info --all | grep 'pml: ucx' |
osc: ucx | UCX 单边通信(RDMA) | ompi_info --all | grep 'osc: ucx' |
mpiext: rocm | ROCm MPI 扩展 | ompi_info --all | grep mpiext |
# 使用自编译 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
# 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
| MPI 版本 | 2 GPU step/s | Comm | shutdown | GPU-aware |
|---|---|---|---|---|
| 系统 MPI (GCC 8.5, 无 UCX) | 104.65 | 42% | crash | 否 |
| 自编译 MPI (GCC 9.3, 无 UCX) | 104.65 | 42% | ✅ | 否 |
| GPU-aware MPI (GCC 9.3 + UCX+ROCm) | 176.95 | 40% | ✅ | 是 |
GPU-aware MPI 使 2 GPU 性能提升 69%(105→177 step/s),Comm 时间从 20.2s 降到 11.4s(-43%)。这是通过 UCX+ROCm 避免 CPU↔GPU 数据拷贝实现的。
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>
在本报告所述硬件、软件版本与工作负载范围内,KOKKOS + HIP + neigh/transpose on 获得了最优综合表现。
| Pair Style | 模式 | 1 GPU | 2 GPU | 4 GPU | 2/1 | 4/1 |
|---|---|---|---|---|---|---|
| EAM 1M | KOKKOS | 76.5 | 57.1 | 45.2 | 0.75 | 0.59 |
| EAM 4M | KOKKOS | 21.2 | 16.5 | — | 0.78 | — |
| EAM 8M | KOKKOS | 10.2 | 8.9 | — | 0.87 | — |
| EAM 16M | KOKKOS | 5.2 | 4.7 | — | 0.90 | — |
| LJ 1M | KOKKOS | 277.7 | 198.3 | — | 0.71 | — |
| Tersoff 1.1M | KOKKOS | 195.0 | 123.2 | — | 0.63 | — |
| EAM 1M | GPU 包 | 39.6 | — | — | — | — |
EAM 2/1 比 0.78→0.87→0.90,趋势改善但未突破 1.0。GPU 包扩展性好(2/1=1.32)但单卡慢(~1.8× KOKKOS)。
| 对比 | 原始报告 | 修正后 | 问题 |
|---|---|---|---|
| 加速比 | 160× | 60× | 原始跨规模对比(32K CPU vs 256K DCU)不公平 |
| 加速趋势 | — | 随原子数增大 | 32K: 60× → 1M: ~172×(估算) |
| 原子数 | step/s | Matom-step/s | Pair% | 内存 |
|---|---|---|---|---|
| 1M | 72.5 | 76.0 | 36.7% | 0.16GB |
| 4M | 21.2 | 85.0 | 32.8% | 0.64GB |
| 8M | 10.2 | 81.9 | 33.8% | 1.2GB |
| 16M | 5.2 | 82.6 | 32.2% | 2.4GB |
| 25M | 3.2 | 80.2 | 32.0% | 3.8GB |
| 32M | — | — | — | OOM |
Matom-step/s 稳定 80-85,线性缩放。32M OOM 因邻居列表初始分配 2000/atom 超 64GB。显存先于算力达到瓶颈。
| 贡献 | 内容 | 文件 | 状态 |
|---|---|---|---|
| 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 | 本地实现已验证 |
| 贡献 | 内容 | 状态 |
|---|---|---|
| 构建 preset | cmake/presets/hygon-dcu-gfx936.cmake:可复现的海光 DCU 构建配置 | 待提交 |
| 性能基准 | KOKKOS vs GPU 包对比数据,多 GPU 缩放分析 | 可供文档引用 |
| 推荐配置 | neigh/transpose on 对 gfx936 有 +3~14% 提升 | 运行时选项,无需代码 |
| 贡献 | 内容 | 状态 |
|---|---|---|
| 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/ |