7.5 KiB
HIP direct-atomic 高密度 PSF endpoint(2026-09-05)
目的和边界
测量 production HIP PsfEventSink 在一个高表面密度 2MASS tile 上的端到端表现,并将 GPU
传输、kernel 与 HDR 下载分开记录。此记录验证 direct-global-atomic 的实际成本边界;它不是
tile-local reduction 的性能声明,也不把 kernel 时间直接归因为 atomic contention。
控制条件
- Source baseline:
7a80086f63e8b1e5f27d9524ba0455f2d6e49be5(Feat: add initial HIP PSF backend);HIP timing counters 是该基线之上的未提交诊断改动, 不改变 event、HDR 或输出路径。 - Host: i7-12700K;
OMP_NUM_THREADS=16。 - GPU: AMD Radeon RX 9070 (
gfx1201), 56 CUs, 15.9 GiB global memory;HIP runtime 是主机 实际 probe 所报告的设备。 - Build: Release;C11/
-march=native -O2 -pipe、OpenMP、PNG;HIP 后端由PSF_BACKEND=hip选择。 - Input:
assets/2mass/processed/all_sky/tile_ra252_dec048.csv,54,160 stars。 - Camera: Minkowski;RA 252.5 deg、Dec -41.5 deg、FOV 0.6 deg、1920 x 1920 px、
--coarse-cell-pixels 240(128 triangles / 81 initial rays)。 - PSF: FWHM 2.7 px、Moffat beta 3、exposure
1e15、--max-cache-psf-flux 1e300。cache radius 266 px;本次没有 min-Y discard 或 direct fallback。
这里刻意以较大的 coarse cell 减少 triangle 枚举工作,使固定 catalog 与相同镜头映射下的 splat 阶段成为可比较对象;它不是全天空或生产 4K 吞吐量估计。
命令与原始输出
CPU reference(同一输入与参数;在 HIP 命令确认退出后顺序运行):
export OMP_NUM_THREADS=16
time build/Release/minkowski_sky \
--catalog assets/2mass/processed/all_sky/tile_ra252_dec048.csv \
--look-ra-deg 252.5 --look-dec-deg -41.5 --fov-deg 0.6 \
--width 1920 --height 1920 --coarse-cell-pixels 240 \
--exposure 1e15 --psf-fwhm-pixels 2.7 --psf-moffat-beta 3 \
--max-cache-psf-flux 1e300 --output /tmp/cpu_psf_dense.png --verbose
PSF cache ready: 64x64 phases, radius 266 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 20.738 s
Frame 0: tracing 81 initial rays from 128 mesh triangles...
Frame 0: initial ray trace finished in 0.009 s.
Frame 0: traced 81 lens vertices; starting catalog render.
Frame 0: finding and prefetching catalog tiles...
Frame 0: catalog prefetch finished (0 candidate tiles).
Frame 0: splatting 128 lens triangles...
Frame 0: splat worker 14/16 started.
Frame 0: splat worker 10/16 started.
Frame 0: splat worker 16/16 started.
Frame 0: splat worker 1/16 started.
Frame 0: splat worker 12/16 started.
Frame 0: splat worker 13/16 started.
Frame 0: splat worker 5/16 started.
Frame 0: splat worker 11/16 started.
Frame 0: splat worker 7/16 started.
Frame 0: splat worker 6/16 started.
Frame 0: splat worker 3/16 started.
Frame 0: splat worker 4/16 started.
Frame 0: splat worker 2/16 started.
Frame 0: splat worker 9/16 started.
Frame 0: splat worker 8/16 started.
Frame 0: splat worker 15/16 started.
Frame 0: splat worker 14/16 reached 8 local triangles.
Frame 0: splat worker 2/16 reached 8 local triangles.
Frame 0: splat worker 10/16 reached 8 local triangles.
Frame 0: splat worker 7/16 reached 8 local triangles.
Frame 0: splat worker 1/16 reached 8 local triangles.
Frame 0: splat worker 11/16 reached 8 local triangles.
Frame 0: splat worker 3/16 reached 8 local triangles.
Frame 0: splat worker 5/16 reached 8 local triangles.
Frame 0: splat worker 4/16 reached 8 local triangles.
Frame 0: splat worker 12/16 reached 8 local triangles.
Frame 0: splat worker 16/16 reached 8 local triangles.
Frame 0: splat worker 13/16 reached 8 local triangles.
Frame 0: splat worker 9/16 finished after 4 local triangles.
Frame 0: splat worker 6/16 finished after 5 local triangles.
Frame 0: splat worker 15/16 finished after 5 local triangles.
Frame 0: splat worker 8/16 finished after 5 local triangles.
Frame 0: splat worker 11/16 finished after 9 local triangles.
Frame 0: splat worker 1/16 finished after 9 local triangles.
Frame 0: splat worker 5/16 finished after 9 local triangles.
Frame 0: splat worker 7/16 finished after 9 local triangles.
Frame 0: splat worker 10/16 finished after 9 local triangles.
Frame 0: splat worker 16/16 finished after 8 local triangles.
Frame 0: splat worker 13/16 finished after 8 local triangles.
Frame 0: splat worker 4/16 finished after 8 local triangles.
Frame 0: splat worker 3/16 finished after 9 local triangles.
Frame 0: splat worker 12/16 finished after 8 local triangles.
Frame 0: splat worker 2/16 finished after 10 local triangles.
Frame 0: splat worker 14/16 finished after 13 local triangles.
Frame 0: catalog splatting finished in 7.1 s; writing image...
Rendered 26172 images from 54160 catalog stars to /tmp/cpu_psf_dense.png (ok)
PSF splats: cached 26172, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
build/Release/minkowski_sky --catalog --look-ra-deg 252.5 --look-dec-deg 418.79s user 3.19s system 1472% cpu 28.654 total
HIP measurement(加入 timing counters 后;其余参数相同):
make -B PSF_BACKEND=hip SPACETIME=minkowski backend
export OMP_NUM_THREADS=16
time build/Release/minkowski_sky_hip \
--catalog assets/2mass/processed/all_sky/tile_ra252_dec048.csv \
--look-ra-deg 252.5 --look-dec-deg -41.5 --fov-deg 0.6 \
--width 1920 --height 1920 --coarse-cell-pixels 240 \
--exposure 1e15 --psf-fwhm-pixels 2.7 --psf-moffat-beta 3 \
--max-cache-psf-flux 1e300 --output /tmp/hip_psf_dense_timing.png --verbose
PSF cache ready: 64x64 phases, radius 266 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 20.915 s
Frame 0: tracing 81 initial rays from 128 mesh triangles...
Frame 0: initial ray trace finished in 0.008 s.
Frame 0: traced 81 lens vertices; starting catalog render.
Frame 0: finding and prefetching catalog tiles...
Frame 0: catalog prefetch finished (0 candidate tiles).
Frame 0: splatting 128 lens triangles...
Frame 0: catalog splatting finished in 3.2 s; writing image...
Rendered 26172 images from 54160 catalog stars to /tmp/hip_psf_dense_timing.png (ok)
PSF splats: cached 26172, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
HIP PSF: 26172 events in 2 batches (2 timed); upload 0.000073 s, kernel 2.950377 s, download 0.011256 s
build/Release/minkowski_sky_hip --catalog --look-ra-deg 252.5 --look-dec-deg 326.85s user 1.53s system 1314% cpu 24.985 total
两次命令都没有设置 TIMEFMT;末行是 zsh 默认 %J %U user %S system %P cpu %*E total
格式的原始输出。它们按顺序运行:先确认没有 renderer benchmark,再执行 HIP,确认其退出后才
执行 CPU,期间没有第二个 renderer benchmark。
cmp 比较 /tmp/cpu_psf_dense.png 与 /tmp/hip_psf_dense_timing.png:PNG byte comparison: identical。
结果和决策
CPU catalog splatting 为 7.1 s,HIP 为 3.2 s(约 2.22x);完整进程的 zsh elapsed time 为 28.654 s(CPU)与 24.985 s(HIP)。在 HIP 的 3.2 s 中,两个 batch 的 kernel event 合计 2.950377 s;上传为 0.000073 s、最终 HDR 下载为 0.011256 s。因此这个 endpoint 的 GPU 端 时间由 kernel 主导,而不是 PCIe。
但 kernel 还包括每个 event 的圆形 PSF 支持域遍历、cache 权重读取和 HDR atomic 写入。这里只有 一个密度/支持域组合,也没有关闭或替代 atomic 的对照,所以不能以此声称 global atomics 的热点 竞争是主导瓶颈。结论是保留 direct atomic,并先测密度与支持域扫描;暂不引入 tile-local reduction 或其分桶/重排复杂度。