diff --git a/gpu_psf_acceleration_plan.md b/gpu_psf_acceleration_plan.md index bb65050..d34263a 100644 --- a/gpu_psf_acceleration_plan.md +++ b/gpu_psf_acceleration_plan.md @@ -51,19 +51,26 @@ CPU HDR 与 catalog,仍有可用空间。其可能收益不是减少需要传 这是一条 ATRI 专用的空间换时间路线,必须以端到端实测证明收益后才保留。它不应成为 ITX、 Optiplex 或通用 CPU fallback 的前提;在这些机器上仍使用流式块。 -应在 `optics/psf` 层定义一个按块提交的 sink。概念性事件为: +当前 CPU 已在 `optics` 层建立 cache-eligible 的事件边界: ```c typedef struct { - float x, y; /* continuous image position */ - float r, g, b; /* already premultiplied by flux */ - float support_radius; -} PsfEvent; + double x, y; + LinearRgb color; + double flux, support_radius; +} PsfCachedEvent; ``` -CPU worker 产生少量固定上限的事件块,填满后提交;GPU 与 CPU 以双/三缓冲方式重叠执行。 -块的首版大小从 1--16 MiB 试起,由实测决定。GPU 后端仍必须统计:cache splat、wing clip、 -direct fallback 和 min-Y discarded;这些计数在块完成后汇总,而不是在热循环中同步。 +`psf_prepare_cached_event()` 保留既有的 cache/direct/min-Y 判定,状态 0 或 2 产出该 +事件;direct fallback 在 CPU 立即处理,min-Y 在上传前丢弃。`PsfEventSink` 由每个 OpenMP +worker 初始化一次、贯穿其线程生命周期,固定容量为 16,384 个事件;填满或线程结束时由现有 +CPU cache evaluator 消费。此实现是 GPU producer 的正确性基线,并已通过固定 HDR reference +和完整 2MASS 前后性能记录验证。 + +GPU sink 将消费同一 `PsfCachedEvent` 与现有不可变 `PsfKernelCache::weights`,不得重新以 +float 解析采样替代 cache 语义。首版使用有限大小的上传块并复用 device buffer;块大小从 +1--16 MiB 试起,由实测决定。GPU 后端仍必须统计:cache splat、wing clip、direct fallback +和 min-Y discarded;这些计数在块完成后汇总,而不是在热循环中同步。 为降低局部热点,CPU 侧应把来自不同 image-plane triangle / worker 的事件块交错提交。 三角形内部的星像中心必定落在各自不重叠的像平面三角形内;不同三角形的 PSF wings 仍可 @@ -141,14 +148,30 @@ GPU 后端必须先在小、固定 catalog snapshot 上同 CPU 的 `--psf-direct ## 7. 实施顺序 -1. 只做接口:将现有 CPU immediate splat 包装为默认 sink,输出不得变化。 -2. 实现 CPU 事件块 producer,但仍由 CPU sink 消费;验证事件流没有改变 HDR 和统计。 -3. 在工作站实施 HIP direct-atomic 原型,完成正确性和端到端基准。 -4. 在 ATRI 上比较流式块与整帧收集、空间重排/分桶两种输入组织;记录 host RAM 峰值、上传、 - GPU kernel 和端到端时间。 -5. 根据 profile 决定是否实现 tile-local reduction;不因纸面 TFLOPS 推断需要它。 -6. 实现 Vulkan 设备枚举、feature probe 和 direct-atomic 后端;feature 不足时 CPU fallback。 -7. 在 ITX、Optiplex、工作站分别跑同一小基准和足够长的稳定性试验,记录真实可用矩阵。 -8. 只有当基准显示明显收益时,才为 WX 4100 或 Intel 核显投入 tile-reduction / 专门调优。 +### 当前状态(2026-09-05) + +已完成 CPU event 路径:`PsfCachedEvent`、`psf_prepare_cached_event()` 与 per-worker +`PsfEventSink` 已进入 `frame_splat_catalog()`。固定 HDR reference 与 unit tests 验证该路径 +不改变输出;在 2MASS 全天 1080p 的前后比较中,完整 event 实现相对无 event 路径版本增加 +0.99% user CPU work。该记录含完整命令和原始输出,见 +`benchmarks/2mass_all_sky_psf_event_sink_2026-09-05.md`。 + +曾有一个 float、解析中心采样的 HIP atomic spike,用于确认 HIP runtime、上传与 float atomic +可执行;它没有 cache 权重、双精度 HDR 或 production integration。其 `test-hip` target 和测试 +已移除,不能作为 renderer GPU backend 的验证或运行入口。 + +下一步是仅将现有 `PsfCachedEvent` 块与 `PsfKernelCache::weights` 接入 HIP: + +1. 定义 production HIP sink 的 C ABI,上传 double event 与 immutable cache 权重,并复用 + device event/HDR buffer。 +2. 保持 CPU 对 direct fallback 的处理和提交顺序;每个 cache 事件仅在 HIP 端按现有 bilinear + phase cache、圆形支持和 wing clip 规则累积到 double HDR。 +3. 用固定 catalog reference 比较 HDR RGB/Y、最大像素误差、总通量与统计;GPU atomic 的 + 非确定加法顺序使用事先记录的容差,而非 bytewise 比较。 +4. 记录端到端基准的完整命令和原始输出:Git hash、CPU threads、GPU/runtime、块大小、上传、 + kernel、download、分辨率、catalog、PSF 及所有 fallback 统计。 +5. 只在 direct atomic profile 显示热点竞争是主要瓶颈时,比较 tile-local reduction;ATRI 的 + 整帧收集/重排同样必须以端到端收益证明。 +6. HIP 路径稳定后再评估 Vulkan 的可移植后端及其他机器的实际设备矩阵。 每一步独立提交,并保持 CPU reference、GPU runtime 层和 shader 资源的提交边界清晰。