HIP: accelerate PSF accumulation and restore parallel producers

Cooperate across 32 lanes per PSF and use two completion-protected staging slots with complete batch timing. Restore coarse OpenMP event production while serializing shared GPU submissions and direct fallback boundaries.

Add bounded benchmarks, streaming and renderer regressions, and preserve validation evidence and ownership documentation.
This commit is contained in:
wyj committed 2026-09-06 21:38:53 -04:00
1 parent 265d7b95d5
commit e1ec480669
45 files changed
+10251 -95

No files matched your search

+9 -4
View File
@@ -41,9 +41,10 @@ SCHWARZSCHILD_TEST_TARGET := $(BUILD_DIR)/test_schwarzschild
OBSERVER_TRACK_TEST_TARGET := $(BUILD_DIR)/test_observer_track
CATALOG_PREFETCH_TEST_TARGET := $(BUILD_DIR)/test_catalog_prefetch
HIP_PSF_TEST_TARGET := $(BUILD_DIR)/test_hip_psf
HIP_PSF_BENCH_TARGET := $(BUILD_DIR)/benchmark_hip_psf
CAMERA_TEST_TARGETS := $(BUILD_DIR)/test_observer_minkowski $(BUILD_DIR)/test_observer_schwarzschild
.PHONY: all backend clean run test hip-psf-test minkowski schwarzschild FORCE
.PHONY: all backend clean run test hip-psf-test hip-psf-bench minkowski schwarzschild FORCE
ifneq ($(filter 0 1,$(PSF_EVENT_SINK)),$(PSF_EVENT_SINK))
$(error Unknown PSF_EVENT_SINK '$(PSF_EVENT_SINK)'; choose 0 or 1)
@@ -129,12 +130,16 @@ $(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/hip_psf.o: src/hip_psf.hip src/hip_psf.h src/
# It requires PSF_BACKEND=hip and an actual HIP GPU agent at execution time.
ifeq ($(PSF_BACKEND),hip)
hip-psf-test: $(HIP_PSF_TEST_TARGET)
hip-psf-bench: $(HIP_PSF_BENCH_TARGET)
$(HIP_PSF_BENCH_TARGET): tests/benchmark_hip_psf.hip $(HIP_PSF_OBJECT) $(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/optics.o | $(BUILD_DIR)
$(HIPCC) $(HIP_CXXFLAGS) $(OPENMP_FLAGS) -Isrc -x hip $< -x none $(filter-out $<,$^) $(LDLIBS) $(HDR_LDLIBS) -o $@
$(HIP_PSF_TEST_TARGET): tests/test_hip_psf.hip $(HIP_PSF_OBJECT) $(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/optics.o | $(BUILD_DIR)
$(HIPCC) $(HIP_CXXFLAGS) $(OPENMP_FLAGS) -Isrc -x hip $< -x none $(filter-out $<,$^) $(LDLIBS) -o $@
$(HIPCC) $(HIP_CXXFLAGS) $(OPENMP_FLAGS) -Isrc -x hip $< -x none $(filter-out $<,$^) $(LDLIBS) $(HDR_LDLIBS) -o $@
else
hip-psf-test:
$(error hip-psf-test requires PSF_BACKEND=hip)
hip-psf-test hip-psf-bench:
$(error HIP PSF checks require PSF_BACKEND=hip)
endif
run: $(TARGET)
+3
View File
@@ -33,6 +33,9 @@ adaptive lens meshes, and reusable lens-map files. It is written primarily in
C with OpenMP CPU parallelism; an optional HIP backend accelerates PSF
accumulation.
HIP retains parallel CPU catalog mapping and uses bounded, completion-protected
event uploads. See [HIP configuration and bounded performance checks](build.md#optional-hip-psf-acceleration).
The [Nmesh](https://github.com/nmeshsource/nmesh) numerical-spacetime backend and BBH rendering are still planned.
The current scope is black-hole capture and distant stellar backgrounds;
local matter emission, accretion disks, and plasma are outside this stage.
+2
View File
@@ -19,6 +19,8 @@
当前实现支持解析 **Minkowski** 与 **Schwarzschild** 时空、单张图像、基于观测者轨迹的图像序列、自适应透镜网格,以及可复用的透镜映射文件。程序主要使用 C 编写,通过 OpenMP 实现 CPU 并行;可选的 HIP 后端用于加速 PSF 累积。
HIP 保留并行 CPU catalog 映射,并使用由完成事件保护的有界上传缓冲。配置与小规模性能检查见 [HIP 构建说明](build.md#optional-hip-psf-acceleration)。
[Nmesh](https://github.com/nmeshsource/nmesh) 数值时空后端和双黑洞(BBH)渲染仍在规划中。当前范围为黑洞捕获与远处恒星背景,暂不包含局域物质辐射、吸积盘或等离子体。架构与开发路线参见[设计文档](nr_spacetime_movie_renderer_design.md)。
## 编译
+200
View File
@@ -0,0 +1,200 @@
# HIP PSF 有界排查与优化(2026-09-07)
## 范围与结论
本次没有运行用户的完整 343,363,141 星 / 598,308,919 星像任务。
所有 renderer/benchmark 都单进程顺序执行,前一个退出后才启动下一个;单次微基准
45 秒超时,缩小 renderer 60 秒超时。没有并发性能测试,没有删除原 render 输出。
源码基线为 `265d7b95d5b916ec4768d174d73ad963a43f0088`,优化版是此基线上的未提交改动。
最初保留了用户现存 HIP binary;另从该 Git commit 的干净源码重建旧版,以复核对照。
主机 HIP 7.2.53210-9999,AMD Radeon RX 9070 / gfx1201;性能测试设置
`OMP_NUM_THREADS=16`,catalog loaders 为 4。Release / `-O2`;HIP 显式
`--offload-arch=gfx1201`。完整元数据见 [metadata.log](hip_psf_2026-09-07/metadata.log)。
已确认的实现问题与处理:
- 旧 HIP 分支将 catalog 查询、逆映射、频移与黑体积分串行化。现在按 triangle 使用
OpenMP producer,每 worker 一个 16,384-event 私有块,GPU cache/HDR 只分配一次。
- 旧 kernel 一线程串行遍历一个 PSF,double atomic 编译为 64-bit CAS 重试循环。
现在每个 event 用 32 线程访问相邻像素;保持四点 phase cache、圆形 support 和
double RGB 累积。分布实验支持这一改变,不把全部 kernel 时间归因为 atomic 竞争。
- 旧 host 缓冲是可立即复用的普通 malloc 数组;现在 sink 同步复制进自己拥有的两个
pinned slot,重用 host/device slot 前等待上一 kernel 完成,生命周期不依赖 pageable
`hipMemcpyAsync` 的运行时暂存行为。GPU copy/kernel 仍在同一 stream 内顺序执行。
- 旧计时只覆盖前 64 批。现在两个 slot 的计时 event 循环使用,统计全部批次,并约每
5 秒在提交时打印进度。完成数是已回收计时的完成数,最多有两个未回收 slot。
- chunk 提交与整个 CPU direct-fallback 的 download/evaluate/upload 持有同一共享锁。
没有 per-star 锁,没有共享可变 CPU scratch,没有改变 backend 错误时立即失败的行为。
未使用分桶规约、float HDR、近似黑体积分或改变 min-Y/tail 参数。
## 受控 kernel 实验
使用 `tests/benchmark_hip_psf.hip` 生成固定 LCG seed 12345 的相同事件。frame 3840×2160,
FWHM 2.7,beta 4.5,tail 1e-8,cache radius 47;每个事件 56 B。
每个进程先计算串行 CPU double HDR reference,再执行一个 HIP replay。CPU reference
耗时不是 production 16-thread CPU render 的性能基线。
| 事件数 | 中心分布范围 | 旧 kernel | 32-thread kernel 原型 | 比值 |
| ---: | ---: | ---: | ---: | ---: |
| 4,096 | 16 px | 22.490 ms | 5.702 ms | 3.94× |
| 16,384 | 1 px | 137.888 ms | 23.976 ms | 5.75× |
| 16,384 | 3840 px(y 限于2160) | 55.630 ms | 21.492 ms | 2.59× |
原型阶段仅改变 kernel 的线程分工,保留旧上传和计时实现,便于隔离效果。
原始输出:[旧密集](hip_psf_2026-09-07/baseline_dense.log)、
[新密集](hip_psf_2026-09-07/wave_dense.log)、
[旧热点](hip_psf_2026-09-07/baseline_hotspot.log)、
[新热点](hip_psf_2026-09-07/wave_hotspot.log)、
[旧分散](hip_psf_2026-09-07/baseline_spread.log)、
[新分散](hip_psf_2026-09-07/wave_spread.log)。
整合双缓冲后的 65,536-event/16px replay:4/4 批均计时,kernel 78.268 ms,replay wall
83.762 ms;CPU reference 842.402 ms。double HDR max_abs `1.7053025658242404e-13`,
max_rel `3.3472443502765663e-15`,总 RGB flux 相对差 `-1.3316774058238102e-17`。
[原始输出](hip_psf_2026-09-07/final_multibatch.log)。
## 原 4K lens map 的真实 catalog 子集
保留原文件 `output/lens/schwarzschild_galactic_center_R100_45deg_16_4_4k_.grlens`:
3840×2160、45°、65,817 vertices、130,882 triangles。未重新 tracing/refine。
使用 tile 索引的主对照输入只有三个 tile:RA252/Dec048、RA262/Dec060、RA082/Dec090。
每个 tile 均匀抽取最多 8192 行,共 21,087 颗星,产生 156,837 个星像。
准备脚本和源/子集 SHA256:[prepare_inputs.py](hip_psf_2026-09-07/prepare_inputs.py)、
[input_manifest.log](hip_psf_2026-09-07/input_manifest.log)。
其余 tile 故意缺失,因此 prefetch 的 64,437 unavailable 是缩小输入条件,不是生产数据错误。
| 实现 | catalog/splat(日志四舍五入) | GPU kernel 合计 | 完整进程 |
| --- | ---: | ---: | ---: |
| 原有 HIP binary | 1.9 s | 1.469529 s | 2.971 s |
| 干净旧源码重建 HIP | 1.9 s | 1.496493 s | 3.016 s |
| 优化 HIP | 0.4 s | 0.168641 s | 1.487 s |
| CPU 16 workers | 0.6 s | — | 1.674 s |
所有实现均 cached=156837、wing-clipped=0、direct=0、discarded=0。
优化版 GPU 16 批全部计时;producer wall=0.326 s,worker generation 总和=2.053 s,
submission/fallback 总和=1.157 s。worker wall 总和包含并发时间,不能加到 GPU 时间上。
原始日志:[旧 HIP](hip_psf_2026-09-07/baseline_multi.log)、
[优化 HIP](hip_psf_2026-09-07/final_multi.log)、[CPU](hip_psf_2026-09-07/cpu_multi.log)。
干净源码旧版复核另见 [clean_baseline_multi.log](hip_psf_2026-09-07/clean_baseline_multi.log)。
旧 HIP 与优化 HIP 的 kernel 时间相差约 8.7 倍、完整进程约 2 倍;这些是小规模单次测量,
不是完整全天空的加速比。相较 CPU,本子集的完整进程收益较小,cache 初始化和 4K 输出
占比较高。没有依此预测用户完整任务的完成时间。
辅助诊断保留了同一 lens map 的单 CSV 模式:256 星及 8192 星。
8192 星时旧/新 splat 为 4.4/0.6 秒,完整进程 5.489/1.706 秒。
但单 CSV 会放大逐 triangle 扫描成本,不能用它代表生产 tile 索引的 CPU 占比。
同 8192 星改用 tile 索引后,旧 kernel=0.171626 秒,新 kernel=0.028882 秒。
日志:[256](hip_psf_2026-09-07/baseline_lens256.log)、
[CSV旧](hip_psf_2026-09-07/baseline_lens8192.log)、
[CSV新](hip_psf_2026-09-07/final_lens8192.log)、
[索引旧](hip_psf_2026-09-07/baseline_indexed.log)、
[索引新](hip_psf_2026-09-07/final_indexed.log)。
## 验证
- `make -j1 test`:通过;固定 HDR、camera、geodesic、frame、Schwarzschild、observer track、
catalog prefetch、CLI 和多线程 movie/lens map 回归均通过。
[完整日志](hip_psf_2026-09-07/cpu_regression.log)。
- `test_hip_psf`:213 事件、71 次 submit,全部计时;覆盖 host 数组立即覆写、slot 复用、
画面边缘、wing clipping 和中途 CPU HDR 修改后继续 GPU。
[初次日志](hip_psf_2026-09-07/streaming_test.log)、
[最终重建后日志](hip_psf_2026-09-07/streaming_test_final.log)。
- `tests/test_hip_renderer.py`:96×64、4 workers,先 CPU 后 HIP;验证 cached=2/direct=1
的混合场和 discarded=3 的 min-Y 场。统计一致、FITS float32 HDR payload 完全一致。
[完整日志](hip_psf_2026-09-07/renderer_regression.log)。
- 4K 子集的旧/新 HIP 以及 CPU/新 HIP:24,883,200 个 FITS float32 样本完全一致;PNG
也一致。double 精度由上述 sink/replay tests 单独验证,未将 FITS 当作 double 文件。
[比较日志](hip_psf_2026-09-07/hdr_comparison.log)。
- 在单个子进程设置 `ROCR_VISIBLE_DEVICES=''`,32×24 的显式 HIP render 报设备不可用、
非零退出且没有写图。[原始输出](hip_psf_2026-09-07/fail_fast.log)。
- 初次 mixed fixture 使用 exposure=2 未越过 support 阈值,测试断言正确拒绝了无 fallback
的输入;依据源码改为 exposure=1000 后才通过。这是测试输入校正,非 production 修复。
[初次输出](hip_psf_2026-09-07/fixture_calibration_failed.log)。
## 可复制命令
以下使用 zsh 默认 `time`,不设置 GNU 风格 `TIMEFMT`。命令必须顺序执行;任何失败或
超时后先确认前一个进程已退出。原始输出保存在上述链接,未只保留汇总值。
```zsh
# 从本仓库根目录执行;准备固定样本,输出源与子集哈希。
python3 benchmarks/hip_psf_2026-09-07/prepare_inputs.py
# 独立重建旧源码,不改变当前 checkout。
mkdir -p /tmp/gr-hip-baseline-src
git archive 265d7b95d5b916ec4768d174d73ad963a43f0088 Makefile src mk | tar -x -C /tmp/gr-hip-baseline-src
make -j4 -C /tmp/gr-hip-baseline-src PSF_BACKEND=hip SPACETIME=schwarzschild ENABLE_HDR=1 \
HIP_CXXFLAGS='--offload-arch=gfx1201 -std=c++17 -O2 -Wall -Wextra -Wpedantic' backend
# 当前实现与 CPU reference。
make -j4 PSF_BACKEND=hip SPACETIME=schwarzschild ENABLE_HDR=1 \
HIP_CXXFLAGS='--offload-arch=gfx1201 -std=c++17 -O2 -Wall -Wextra -Wpedantic' backend hip-psf-test hip-psf-bench
make -j4 PSF_BACKEND=cpu SPACETIME=schwarzschild ENABLE_HDR=1 backend
render_args=(
--all-sky-catalog /tmp/gr-hip-catalog-multi --catalog-load-workers 4
--psf-relative-tail 1e-8 --psf-min-y 0 --max-cache-psf-flux 1e8
--exposure 1e13 --psf-fwhm-pixels 2.7 --psf-moffat-beta 4.5 --hdr-output
--lens-map-input output/lens/schwarzschild_galactic_center_R100_45deg_16_4_4k_.grlens
--verbose
)
time OMP_NUM_THREADS=16 timeout --kill-after=5s 60s /tmp/gr-hip-baseline-src/build/Release/schwarzschild_sky_hip \
"${render_args[@]}" --output /tmp/gr-hip-clean-baseline-multi.png
time OMP_NUM_THREADS=16 timeout --kill-after=5s 60s ./build/Release/schwarzschild_sky_hip \
"${render_args[@]}" --output /tmp/gr-hip-final-multi.png
time OMP_NUM_THREADS=16 timeout --kill-after=5s 60s ./build/Release/schwarzschild_sky \
"${render_args[@]}" --output /tmp/gr-cpu-multi.png
# 原有 binary 的初始记录使用 /tmp/gr-schwarzschild-hip-baseline,其他参数完全相同。
# 单 tile 索引测试仅将 root 换为 /tmp/gr-hip-catalog-subset。
# 单 CSV 诊断改用 --catalog benchmarks/hip_psf_2026-09-07/catalog_8192.csv
# (或 catalog_256.csv),不用 --all-sky-catalog,输出到单独的 /tmp PNG。
OMP_NUM_THREADS=16 timeout --kill-after=5s 45s ./build/Release/benchmark_hip_psf 65536 16
OMP_NUM_THREADS=16 timeout --kill-after=5s 45s ./build/Release/test_hip_psf
make -j1 test
# 小尺寸 renderer 回归;先分别构建带 HDR 的 Minkowski CPU/HIP。
make PSF_BACKEND=cpu SPACETIME=minkowski ENABLE_HDR=1 backend
make PSF_BACKEND=hip SPACETIME=minkowski ENABLE_HDR=1 \
HIP_CXXFLAGS='--offload-arch=gfx1201 -std=c++17 -O2 -Wall -Wextra -Wpedantic' backend
python3 tests/test_hip_renderer.py build/Release/minkowski_sky build/Release/minkowski_sky_hip
python3 scripts/fits_floatdiff.py /tmp/gr-cpu-multi_HDR.fits /tmp/gr-hip-final-multi_HDR.fits
```
旧/新原型微基准可使用同一 `tests/benchmark_hip_psf.hip` 与基线 sink 源码编译:
```zsh
cp /tmp/gr-hip-baseline-src/src/hip_psf.hip /tmp/gr-hip-psf-baseline.hip
hipcc --offload-arch=gfx1201 -std=c++17 -O2 -fopenmp -Isrc -x hip \
tests/benchmark_hip_psf.hip /tmp/gr-hip-psf-baseline.hip -x none \
build/Release/obj/schwarzschild/hdr_sink1_hip/src/optics.o \
-lm -lpng -lcfitsio -o /tmp/hip_psf_bench_baseline
python3 - <<'PY'
from pathlib import Path
s = Path('/tmp/gr-hip-psf-baseline.hip').read_text()
s = s.replace('const size_t index = (size_t)blockIdx.x * blockDim.x + threadIdx.x;',
'const size_t thread = (size_t)blockIdx.x * blockDim.x + threadIdx.x;\n'
' const size_t index = thread / 32;\n const int lane = thread % 32;')
s = s.replace('int offset_x = first; offset_x <= last; ++offset_x',
'int offset_x = first + lane; offset_x <= last; offset_x += 32')
s = s.replace('(event_count + threads - 1) / threads',
'(event_count * 32 + threads - 1) / threads')
Path('/tmp/gr-hip-psf-wave.hip').write_text(s)
PY
hipcc --offload-arch=gfx1201 -std=c++17 -O2 -fopenmp -Isrc -x hip \
tests/benchmark_hip_psf.hip /tmp/gr-hip-psf-wave.hip -x none \
build/Release/obj/schwarzschild/hdr_sink1_hip/src/optics.o \
-lm -lpng -lcfitsio -o /tmp/hip_psf_bench_wave
OMP_NUM_THREADS=16 timeout --kill-after=5s 45s /tmp/hip_psf_bench_baseline 4096 16
OMP_NUM_THREADS=16 timeout --kill-after=5s 45s /tmp/hip_psf_bench_wave 4096 16
OMP_NUM_THREADS=16 timeout --kill-after=5s 45s /tmp/hip_psf_bench_baseline 16384 1
OMP_NUM_THREADS=16 timeout --kill-after=5s 45s /tmp/hip_psf_bench_wave 16384 1
OMP_NUM_THREADS=16 timeout --kill-after=5s 45s /tmp/hip_psf_bench_baseline 16384 3840
OMP_NUM_THREADS=16 timeout --kill-after=5s 45s /tmp/hip_psf_bench_wave 16384 3840
```
@@ -0,0 +1,3 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.661 s
device=AMD Radeon RX 9070 arch=gfx1201 events=4096 spread=16 frame=3840x2160 event_bytes=56 CPU_reference=0.051952 s
HIP create=0.027773 replay_wall=0.027614 upload=0.000021 kernel=0.022490 download=0.004796 batches=1 timed=1 max_abs=4.7073456244106637e-14 max_rel=1.1345618109894268e-14 flux_rel=1.138425198954238e-16
@@ -0,0 +1,3 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.681 s
device=AMD Radeon RX 9070 arch=gfx1201 events=16384 spread=1 frame=3840x2160 event_bytes=56 CPU_reference=0.210148 s
HIP create=0.025685 replay_wall=0.143944 upload=0.000049 kernel=0.137888 download=0.005726 batches=1 timed=1 max_abs=2.6147972675971687e-12 max_rel=1.6347773919004679e-14 flux_rel=-2.3341330284619701e-16
@@ -0,0 +1,10 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.836 s
Frame 0: finding and prefetching catalog tiles...
Catalog prefetch: 64440 requested, 1 newly loaded (8192 stars), 64439 unavailable in 0.033 s; 4 loader workers
Frame 0: catalog prefetch finished (64440 candidate tiles).
Frame 0: splatting 130882 lens triangles...
Frame 0: catalog splatting finished in 0.3 s; writing image...
Rendered 12765 images from 8192 catalog stars to /tmp/gr-hip-baseline-indexed.png (ok; imported lens map)
PSF splats: cached 12765, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
HIP PSF: 12765 events in 1 batches (1 timed); upload 0.000042 s, kernel 0.171626 s, download 0.025845 s
OMP_NUM_THREADS=16 timeout --kill-after=5s 60s --all-sky-catalog 4 1e-8 11.23s user 0.26s system 721% cpu 1.592 total
@@ -0,0 +1,9 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.709 s
Frame 0: finding and prefetching catalog tiles...
Frame 0: catalog prefetch finished (0 candidate tiles).
Frame 0: splatting 130882 lens triangles...
Frame 0: catalog splatting finished in 0.3 s; writing image...
Rendered 411 images from 256 catalog stars to /tmp/gr-hip-baseline-256.png (ok; imported lens map)
PSF splats: cached 411, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
HIP PSF: 411 events in 1 batches (1 timed); upload 0.000014 s, kernel 0.122597 s, download 0.021485 s
OMP_NUM_THREADS=16 timeout --kill-after=5s 60s --catalog --psf-relative-tai 10.69s user 0.17s system 774% cpu 1.403 total
@@ -0,0 +1,9 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.694 s
Frame 0: finding and prefetching catalog tiles...
Frame 0: catalog prefetch finished (0 candidate tiles).
Frame 0: splatting 130882 lens triangles...
Frame 0: catalog splatting finished in 4.4 s; writing image...
Rendered 12765 images from 8192 catalog stars to /tmp/gr-hip-baseline-8192.png (ok; imported lens map)
PSF splats: cached 12765, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
HIP PSF: 12765 events in 1 batches (1 timed); upload 0.000041 s, kernel 0.171573 s, download 0.025041 s
OMP_NUM_THREADS=16 timeout --kill-after=5s 60s --catalog --psf-relative-tai 14.92s user 0.17s system 274% cpu 5.489 total
@@ -0,0 +1,10 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.674 s
Frame 0: finding and prefetching catalog tiles...
Catalog prefetch: 64440 requested, 3 newly loaded (21087 stars), 64437 unavailable in 0.033 s; 4 loader workers
Frame 0: catalog prefetch finished (64440 candidate tiles).
Frame 0: splatting 130882 lens triangles...
Frame 0: catalog splatting finished in 1.9 s; writing image...
Rendered 156837 images from 21087 catalog stars to /tmp/gr-hip-baseline-multi.png (ok; imported lens map)
PSF splats: cached 156837, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
HIP PSF: 156837 events in 10 batches (10 timed); upload 0.000312 s, kernel 1.469529 s, download 0.025304 s
OMP_NUM_THREADS=16 timeout --kill-after=5s 60s --all-sky-catalog 4 1e-8 12.51s user 0.24s system 429% cpu 2.971 total
@@ -0,0 +1,3 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.677 s
device=AMD Radeon RX 9070 arch=gfx1201 events=16384 spread=3840 frame=3840x2160 event_bytes=56 CPU_reference=0.419966 s
HIP create=0.023973 replay_wall=0.060952 upload=0.000049 kernel=0.055630 download=0.004973 batches=1 timed=1 max_abs=5.5511151231257827e-17 max_rel=1.0443479008602178e-15 flux_rel=-5.9614463770241093e-20
@@ -0,0 +1,16 @@
make: Entering directory '/tmp/gr-hip-baseline-src'
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/catalog.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/catalog.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/frame.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/frame.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/geodesic.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/geodesic.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/lens_map.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/lens_map.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/movie.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/movie.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/observer.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/observer.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/observer_track.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/observer_track.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/optics.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/optics.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/ray.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/ray.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/spacetime_common.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/spacetime_common.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/spacetime_schwarzschild.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/spacetime_schwarzschild.o
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/main.c -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/main.o
hipcc --offload-arch=gfx1201 -std=c++17 -O2 -Wall -Wextra -Wpedantic -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -Isrc -c src/hip_psf.hip -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/hip_psf.o
hipcc -O2 -DNDEBUG -fopenmp build/Release/obj/schwarzschild/hdr_sink1_hip/src/catalog.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/frame.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/geodesic.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/lens_map.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/movie.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/observer.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/observer_track.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/optics.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/ray.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/spacetime_common.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/spacetime_schwarzschild.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/main.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/hip_psf.o -lm -lpng -lcfitsio -o build/Release/schwarzschild_sky_hip
make: Leaving directory '/tmp/gr-hip-baseline-src'
@@ -0,0 +1,2 @@
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -DSPACETIME_SCHWARZSCHILD -DENABLE_HDR_OUTPUT -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc -MMD -MP -c src/frame.c -o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/frame.o
cc -O2 -DNDEBUG -fopenmp build/Release/obj/schwarzschild/hdr_sink1_cpu/src/catalog.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/frame.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/geodesic.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/lens_map.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/movie.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/observer.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/observer_track.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/optics.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/ray.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/spacetime_common.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/spacetime_schwarzschild.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/main.o -lm -lpng -lcfitsio -o build/Release/schwarzschild_sky
@@ -0,0 +1,3 @@
hipcc -O2 -DNDEBUG -fopenmp build/Release/obj/schwarzschild/hdr_sink1_hip/src/catalog.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/frame.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/geodesic.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/lens_map.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/movie.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/observer.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/observer_track.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/optics.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/ray.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/spacetime_common.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/spacetime_schwarzschild.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/main.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/hip_psf.o -lm -lpng -lcfitsio -o build/Release/schwarzschild_sky_hip
make: Nothing to be done for 'hip-psf-test'.
hipcc --offload-arch=gfx1201 -std=c++17 -O2 -Wall -Wextra -Wpedantic -fopenmp -Isrc -x hip tests/benchmark_hip_psf.hip -x none build/Release/obj/schwarzschild/hdr_sink1_hip/src/hip_psf.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/optics.o -lm -lpng -lcfitsio -o build/Release/benchmark_hip_psf
@@ -0,0 +1,4 @@
hipcc --offload-arch=gfx1201 -std=c++17 -O2 -Wall -Wextra -Wpedantic -DFRAME_PSF_EVENT_SINK=1 -DPSF_BACKEND_HIP -Isrc -c src/hip_psf.hip -o build/Release/obj/schwarzschild/hdr_sink1_hip/src/hip_psf.o
hipcc -O2 -DNDEBUG -fopenmp build/Release/obj/schwarzschild/hdr_sink1_hip/src/catalog.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/frame.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/geodesic.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/lens_map.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/movie.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/observer.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/observer_track.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/optics.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/ray.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/spacetime_common.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/spacetime_schwarzschild.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/main.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/hip_psf.o -lm -lpng -lcfitsio -o build/Release/schwarzschild_sky_hip
hipcc --offload-arch=gfx1201 -std=c++17 -O2 -Wall -Wextra -Wpedantic -fopenmp -Isrc -x hip tests/test_hip_psf.hip -x none build/Release/obj/schwarzschild/hdr_sink1_hip/src/hip_psf.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/optics.o -lm -lpng -lcfitsio -o build/Release/test_hip_psf
hipcc --offload-arch=gfx1201 -std=c++17 -O2 -Wall -Wextra -Wpedantic -fopenmp -Isrc -x hip tests/benchmark_hip_psf.hip -x none build/Release/obj/schwarzschild/hdr_sink1_hip/src/hip_psf.o build/Release/obj/schwarzschild/hdr_sink1_hip/src/optics.o -lm -lpng -lcfitsio -o build/Release/benchmark_hip_psf
@@ -0,0 +1,257 @@
ra_deg,dec_deg,temperature_K,amplitude_sr
252.995803,-41.503754,2122.6076,8.520470492e-21
252.993551,-41.543816,2114.6385,9.967579356e-21
252.918388,-41.510990,2208.128,1.446557073e-19
252.900742,-41.506279,2279.2582,1.973490936e-18
252.884436,-41.488571,2138.1302,1.410128710e-20
252.986092,-41.597309,2129.5884,3.136569365e-20
252.984711,-41.606659,2114.2229,9.627036994e-21
252.924427,-41.399944,3134.4748,2.266711014e-21
252.938142,-41.386372,5574.2493,7.758286100e-21
252.958086,-41.625877,1617.2207,3.144977882e-19
252.970634,-41.365410,2202.8994,1.648245643e-20
252.810573,-41.475826,3941.0552,1.524175586e-21
252.854571,-41.396477,2408.7178,2.646847276e-20
252.974001,-41.655529,2217.0089,4.616359171e-20
252.783806,-41.501965,2321.7548,7.149940580e-21
252.782782,-41.459801,2703.1671,4.949843960e-20
252.880635,-41.648254,2158.5784,8.959667114e-21
252.832964,-41.372025,2223.318,6.324985653e-20
252.781331,-41.583836,4289.9357,3.687496634e-21
252.774616,-41.415287,2503.0345,3.528731590e-20
252.781981,-41.604404,4481.0767,4.210660307e-21
252.835709,-41.344860,2471.4445,7.859657597e-20
252.755037,-41.586941,2520.0282,9.071531178e-21
252.829319,-41.663242,2092.7219,9.439286836e-21
252.729244,-41.560253,3870.9986,2.202578638e-21
252.792426,-41.349979,2347.9017,6.933492283e-21
252.715858,-41.556286,3197.6305,2.002903960e-21
252.745823,-41.618793,2093.3838,1.798894237e-20
252.869507,-41.293640,2565.0983,7.621517442e-21
252.968856,-41.268589,2990.034,2.505403621e-21
252.925736,-41.270466,3338.3343,2.122223459e-21
252.680916,-41.525299,1724.5512,7.687633387e-18
252.701932,-41.401005,2431.4439,5.080775898e-20
252.829047,-41.712399,2045.1192,5.651479174e-20
252.678461,-41.426064,3910.3355,1.929630882e-21
252.944337,-41.247566,2738.4573,2.298467128e-20
252.821892,-41.277275,2590.152,3.408118915e-21
252.662337,-41.573349,2041.2244,1.499212709e-20
252.651190,-41.553684,3393.4186,2.240876206e-21
252.717832,-41.332279,2490.4613,6.309850262e-20
252.859629,-41.752144,1851.5385,1.237866868e-19
252.710481,-41.329098,3931.3812,2.005228197e-21
252.712726,-41.321545,3857.1544,5.275918149e-21
252.907975,-41.225502,2783.4349,7.275926125e-21
252.617463,-41.497688,2452.5593,1.840842057e-20
252.697290,-41.680248,2279.1812,1.329110424e-20
252.701091,-41.312347,2287.752,8.783238970e-21
252.641947,-41.624428,2447.7312,1.460562478e-20
252.611005,-41.565239,2414.9482,7.249220492e-21
252.921863,-41.204163,2880.0791,4.126485206e-21
252.639833,-41.358757,3812.7671,1.743956802e-21
252.594286,-41.548817,3760.853,2.953969609e-21
252.630135,-41.641548,2306.0382,3.363985170e-19
252.825565,-41.215195,2246.365,7.392177336e-20
252.620751,-41.361652,2520.4538,1.047956906e-20
252.802403,-41.217541,4186.817,2.061575207e-21
252.769762,-41.772015,2507.2047,5.818413326e-21
252.647252,-41.689266,1892.3375,1.744334961e-18
252.605142,-41.641506,2249.3357,1.439763106e-20
252.938606,-41.827171,2083.404,8.544671297e-21
252.574987,-41.404007,2531.1597,6.197754090e-21
252.823988,-41.808983,5269.1013,1.717986157e-21
252.808964,-41.806942,3291.9456,3.132371216e-21
252.684978,-41.747162,5669.3965,6.109953405e-19
252.767382,-41.797062,2620.9918,5.745237922e-20
252.614036,-41.691898,2927.4283,2.601929453e-21
252.853972,-41.168407,4077.801,8.578331734e-21
252.530657,-41.494858,3710.4481,2.107929249e-21
252.888238,-41.156219,3051.514,2.338169331e-21
252.954428,-41.854729,2352.1781,7.655634184e-21
252.529755,-41.570686,3971.5989,1.646753947e-21
252.859513,-41.845554,1960.8674,2.707734881e-20
252.534145,-41.398724,2641.718,2.254402787e-20
252.517384,-41.442089,4700.5385,1.336052368e-21
252.519661,-41.420567,2712.4032,9.476834686e-21
252.505390,-41.523567,2424.7224,9.380974682e-21
252.551706,-41.664986,4533.3033,1.946284528e-21
252.533541,-41.361877,3241.7869,2.089844880e-21
252.528752,-41.363529,2884.1851,3.573968024e-21
252.537582,-41.341946,3474.6831,2.150638680e-21
252.985009,-41.116631,5300.3635,7.512473721e-21
252.943084,-41.116467,2563.0673,1.199197866e-20
252.481819,-41.505699,4124.1164,3.504032950e-21
252.684636,-41.811104,1739.5706,5.528665043e-20
252.865487,-41.120384,3887.7164,3.077710553e-21
252.625936,-41.221676,3127.7953,7.107185963e-21
252.507862,-41.351349,3286.9996,3.549705502e-21
252.479083,-41.589634,3738.6545,4.129429108e-21
252.757078,-41.859245,2270.8246,1.094835644e-20
252.554006,-41.272038,2492.9807,9.889697627e-21
252.471835,-41.598076,2736.3796,2.894022990e-21
252.542699,-41.276367,2475.8087,4.842431050e-21
252.511061,-41.312374,2496.4218,7.691660579e-21
252.554795,-41.746521,2306.537,2.806803951e-20
252.951303,-41.914600,2055.4688,2.919622148e-20
252.553309,-41.249672,2774.7686,3.598089692e-21
252.662749,-41.836929,2559.5274,6.298053060e-20
252.586034,-41.213211,2699.3648,1.272659394e-20
252.621310,-41.184315,2339.6539,5.517846047e-20
252.484728,-41.318321,3241.4826,3.034603522e-21
252.888068,-41.920795,2172.8239,1.178319618e-20
252.569062,-41.786888,1997.9861,2.540725373e-18
252.894850,-41.926277,3119.2456,6.282643464e-21
252.754071,-41.105736,2305.87,2.977926508e-19
252.416676,-41.480968,2584.3833,6.094485261e-21
252.475692,-41.304031,2771.0305,2.562855157e-21
252.959799,-41.940510,2928.3378,7.427776553e-21
252.489676,-41.275761,3113.5553,1.991796655e-21
252.818710,-41.075542,3718.8548,2.399741427e-21
252.402479,-41.491196,3794.1333,2.538537950e-21
252.442786,-41.333641,2729.4879,1.647642206e-20
252.511390,-41.766029,3978.4711,1.041812848e-19
252.733459,-41.908119,2356.8452,1.082943201e-19
252.827830,-41.937569,2212.9815,1.296106781e-20
252.590056,-41.160686,4482.565,4.093997833e-21
252.401278,-41.399200,4947.7347,2.579535530e-21
252.595412,-41.849270,3038.6398,2.195630587e-21
252.391907,-41.590279,2639.7551,6.874491362e-21
252.435847,-41.304939,2630.2127,9.154123002e-21
252.575461,-41.844299,3515.53,2.956347615e-21
252.735374,-41.926418,3943.3366,3.432362540e-21
252.543008,-41.825787,2449.224,5.869277802e-21
252.400547,-41.350430,2435.7419,2.802492442e-20
252.659622,-41.902222,1954.5765,1.958400627e-20
252.867911,-41.967499,2249.8926,7.604165132e-21
252.578956,-41.862316,3724.618,2.923059502e-21
252.797053,-41.043320,2319.464,9.471219009e-20
252.355937,-41.465790,3244.3183,2.446655993e-21
252.938864,-41.983559,2060.1537,2.139288089e-20
252.671688,-41.079185,2498.3696,1.368865176e-20
252.423228,-41.732479,3969.7407,4.496538401e-21
252.702582,-41.938839,3157.7626,2.251809079e-21
252.375407,-41.343994,4739.481,1.916162474e-21
252.747930,-41.958191,1976.0585,6.122852446e-19
252.488086,-41.817532,3065.1878,2.808993509e-21
252.531071,-41.855091,3461.697,2.165451775e-21
252.331859,-41.508068,3800.0226,1.289083783e-21
252.612445,-41.910809,2138.9346,1.076528786e-19
252.402738,-41.734364,2696.886,3.692306502e-21
252.742900,-41.032005,2248.3131,4.081614614e-20
252.403813,-41.744774,2392.2315,1.451514066e-20
252.694351,-41.044132,2796.9119,9.050642359e-21
252.449473,-41.805851,2583.8109,3.098494032e-21
252.361706,-41.310951,3088.8084,8.035276293e-20
252.628021,-41.936123,2165.4335,3.477380972e-20
252.628527,-41.062164,3525.6072,3.936962378e-21
252.498671,-41.862766,4455.1873,2.442442995e-21
252.547860,-41.900036,1829.2787,3.981719558e-19
252.511906,-41.123329,3048.4858,4.108573930e-19
252.299158,-41.447384,2850.0395,5.187928130e-21
252.335452,-41.684437,2307.2283,1.218874146e-20
252.403999,-41.211655,3878.6746,1.600194122e-21
252.313300,-41.647385,2577.9553,3.003599833e-20
252.571358,-41.070408,2709.2416,2.709037591e-20
252.425385,-41.826496,2525.6902,1.245343644e-20
252.501255,-41.108929,4557.5035,1.496484072e-21
252.419350,-41.828045,2417.7394,6.004864748e-21
252.300735,-41.656845,3045.2599,1.457684905e-20
252.553780,-41.066082,3864.3635,2.092158836e-21
252.512797,-41.088871,2482.2352,1.276192509e-20
252.585425,-41.043270,2532.8788,5.823061653e-21
252.269348,-41.407833,4001.3672,2.274827091e-21
252.366012,-41.794201,2198.7384,1.144758302e-20
252.340150,-41.238468,2289.0177,1.385972739e-19
252.343073,-41.774361,2905.8909,3.593985182e-21
252.408843,-41.852028,1865.391,5.198877258e-19
252.310223,-41.736164,3812.174,1.810697782e-21
252.320611,-41.757877,2169.6594,2.434838338e-20
252.270439,-41.333256,2365.5406,3.237555584e-20
252.348662,-41.199169,5067.5407,6.752510875e-22
252.426072,-41.885487,5469.2862,3.586713651e-20
252.539432,-41.965832,3103.0025,2.169955244e-21
252.312190,-41.232819,2607.8035,5.138810131e-21
252.322125,-41.213959,3032.9851,5.678482975e-21
252.275448,-41.723408,2303.4076,2.588029892e-20
252.501590,-41.045898,2858.9979,4.151636299e-21
252.404604,-41.113808,2089.8494,4.744769752e-19
252.244760,-41.323631,2463.2692,4.048981099e-20
252.533988,-41.983418,3385.5453,2.255859726e-21
252.277093,-41.756138,2616.2854,1.036789486e-20
252.212942,-41.389023,4550.4841,5.494747328e-21
252.327126,-41.833012,2606.1897,3.581718507e-20
252.192324,-41.478523,3399.6546,9.312523645e-21
252.195062,-41.580227,2432.3018,2.558664360e-20
252.351414,-41.132088,4835.2654,1.494196790e-20
252.219672,-41.316750,2757.7871,9.722954650e-21
252.179320,-41.542236,2505.6081,4.079715741e-20
252.384267,-41.089497,3098.6822,2.580183220e-21
252.286700,-41.818886,2391.4591,4.608540788e-21
252.404791,-41.065308,2725.8265,1.280171558e-20
252.348719,-41.109009,2563.7877,5.295587432e-21
252.275590,-41.183922,3136.0759,2.155352512e-21
252.296743,-41.850468,2642.1889,3.444749934e-21
252.155483,-41.546150,3067.0239,1.010821076e-20
252.425040,-41.032890,2191.7822,8.602034164e-20
252.257575,-41.187611,2620.5985,5.430920820e-21
252.209675,-41.750561,5933.4021,3.419106040e-21
252.139858,-41.511059,2304.5709,1.521337795e-20
252.280242,-41.859871,2554.1495,4.131733496e-20
252.290455,-41.875862,2252.1922,7.143409889e-21
252.207488,-41.773079,2741.2179,3.591469643e-21
252.268957,-41.861740,2870.4585,5.142293941e-21
252.164698,-41.705589,3226.7965,1.516741376e-21
252.136197,-41.370609,2639.5238,7.139074809e-21
252.208556,-41.799927,2404.5217,5.792148473e-21
252.121883,-41.400883,3451.9125,2.047169827e-21
252.111395,-41.560272,2620.36,2.629143700e-20
252.349896,-41.040703,2944.3872,3.233908544e-21
252.349523,-41.037327,2520.8525,7.111428303e-21
252.199753,-41.190865,4018.3583,1.468388429e-21
252.231351,-41.861416,2142.4034,3.580526979e-20
252.200156,-41.826633,2332.3668,1.323691175e-20
252.294760,-41.936317,2254.9961,8.466430175e-21
252.135159,-41.276543,2473.5397,1.114524356e-20
252.304821,-41.050865,4299.2924,1.154323215e-21
252.085210,-41.408707,2367.3699,1.484933061e-20
252.095827,-41.350533,2977.7993,2.310733205e-21
252.099867,-41.679367,4428.1414,1.260539465e-21
252.304979,-41.969177,2291.2197,7.570805420e-21
252.290798,-41.043411,4025.1584,1.694311145e-21
252.075776,-41.634266,2381.1205,8.869901372e-21
252.087812,-41.685959,4396.0093,1.769041975e-21
252.108782,-41.261692,2633.8123,3.379419937e-21
252.052929,-41.432144,2278.3046,7.148847792e-21
252.064960,-41.651070,2356.5411,1.168849360e-20
252.223106,-41.081467,2628.713,4.601469961e-21
252.232576,-41.937927,2617.5219,5.243548616e-21
252.190777,-41.899170,2013.1654,1.602521185e-20
252.081125,-41.269642,3819.9146,2.080052256e-21
252.210905,-41.930817,3236.2152,1.756321514e-21
252.035556,-41.629017,3964.5855,3.139396056e-21
252.111531,-41.189316,3886.2667,2.563179942e-21
252.035872,-41.348522,2956.2451,4.390503415e-21
252.085910,-41.218925,2288.183,6.623060966e-21
252.092595,-41.806648,3658.6782,1.857470436e-21
252.228109,-41.975403,2496.3252,1.669613407e-20
252.000450,-41.467415,2395.9855,4.911240002e-20
252.126775,-41.876106,2548.3508,8.029098280e-21
252.053633,-41.767536,2823.2556,2.497068082e-20
252.058645,-41.221397,1925.1259,1.985755782e-18
252.184620,-41.960602,2346.3856,1.004743319e-19
252.205453,-41.986469,2625.4111,6.558990736e-19
252.067377,-41.178082,2366.0375,1.062986514e-19
252.099065,-41.883869,2206.4486,1.462323794e-20
252.127616,-41.079384,5637.2404,2.605712833e-21
252.157563,-41.968189,3170.3861,3.110823479e-21
252.157831,-41.028790,3872.4118,1.005513251e-21
252.023196,-41.195976,2897.4044,3.948078463e-21
252.093282,-41.926586,2197.9598,2.684248811e-20
252.022030,-41.167690,2150.1569,1.986315993e-20
252.083875,-41.938160,1984.6353,1.319554431e-19
252.010117,-41.854439,3121.079,2.461648273e-21
252.015535,-41.126656,3400.0499,1.883892944e-21
252.010436,-41.114506,2878.126,3.049867123e-21
252.045690,-41.046795,4846.7315,2.780565962e-21
252.006986,-41.942474,4241.3759,1.703940942e-21
1 ra_deg dec_deg temperature_K amplitude_sr
2 252.995803 -41.503754 2122.6076 8.520470492e-21
3 252.993551 -41.543816 2114.6385 9.967579356e-21
4 252.918388 -41.510990 2208.128 1.446557073e-19
5 252.900742 -41.506279 2279.2582 1.973490936e-18
6 252.884436 -41.488571 2138.1302 1.410128710e-20
7 252.986092 -41.597309 2129.5884 3.136569365e-20
8 252.984711 -41.606659 2114.2229 9.627036994e-21
9 252.924427 -41.399944 3134.4748 2.266711014e-21
10 252.938142 -41.386372 5574.2493 7.758286100e-21
11 252.958086 -41.625877 1617.2207 3.144977882e-19
12 252.970634 -41.365410 2202.8994 1.648245643e-20
13 252.810573 -41.475826 3941.0552 1.524175586e-21
14 252.854571 -41.396477 2408.7178 2.646847276e-20
15 252.974001 -41.655529 2217.0089 4.616359171e-20
16 252.783806 -41.501965 2321.7548 7.149940580e-21
17 252.782782 -41.459801 2703.1671 4.949843960e-20
18 252.880635 -41.648254 2158.5784 8.959667114e-21
19 252.832964 -41.372025 2223.318 6.324985653e-20
20 252.781331 -41.583836 4289.9357 3.687496634e-21
21 252.774616 -41.415287 2503.0345 3.528731590e-20
22 252.781981 -41.604404 4481.0767 4.210660307e-21
23 252.835709 -41.344860 2471.4445 7.859657597e-20
24 252.755037 -41.586941 2520.0282 9.071531178e-21
25 252.829319 -41.663242 2092.7219 9.439286836e-21
26 252.729244 -41.560253 3870.9986 2.202578638e-21
27 252.792426 -41.349979 2347.9017 6.933492283e-21
28 252.715858 -41.556286 3197.6305 2.002903960e-21
29 252.745823 -41.618793 2093.3838 1.798894237e-20
30 252.869507 -41.293640 2565.0983 7.621517442e-21
31 252.968856 -41.268589 2990.034 2.505403621e-21
32 252.925736 -41.270466 3338.3343 2.122223459e-21
33 252.680916 -41.525299 1724.5512 7.687633387e-18
34 252.701932 -41.401005 2431.4439 5.080775898e-20
35 252.829047 -41.712399 2045.1192 5.651479174e-20
36 252.678461 -41.426064 3910.3355 1.929630882e-21
37 252.944337 -41.247566 2738.4573 2.298467128e-20
38 252.821892 -41.277275 2590.152 3.408118915e-21
39 252.662337 -41.573349 2041.2244 1.499212709e-20
40 252.651190 -41.553684 3393.4186 2.240876206e-21
41 252.717832 -41.332279 2490.4613 6.309850262e-20
42 252.859629 -41.752144 1851.5385 1.237866868e-19
43 252.710481 -41.329098 3931.3812 2.005228197e-21
44 252.712726 -41.321545 3857.1544 5.275918149e-21
45 252.907975 -41.225502 2783.4349 7.275926125e-21
46 252.617463 -41.497688 2452.5593 1.840842057e-20
47 252.697290 -41.680248 2279.1812 1.329110424e-20
48 252.701091 -41.312347 2287.752 8.783238970e-21
49 252.641947 -41.624428 2447.7312 1.460562478e-20
50 252.611005 -41.565239 2414.9482 7.249220492e-21
51 252.921863 -41.204163 2880.0791 4.126485206e-21
52 252.639833 -41.358757 3812.7671 1.743956802e-21
53 252.594286 -41.548817 3760.853 2.953969609e-21
54 252.630135 -41.641548 2306.0382 3.363985170e-19
55 252.825565 -41.215195 2246.365 7.392177336e-20
56 252.620751 -41.361652 2520.4538 1.047956906e-20
57 252.802403 -41.217541 4186.817 2.061575207e-21
58 252.769762 -41.772015 2507.2047 5.818413326e-21
59 252.647252 -41.689266 1892.3375 1.744334961e-18
60 252.605142 -41.641506 2249.3357 1.439763106e-20
61 252.938606 -41.827171 2083.404 8.544671297e-21
62 252.574987 -41.404007 2531.1597 6.197754090e-21
63 252.823988 -41.808983 5269.1013 1.717986157e-21
64 252.808964 -41.806942 3291.9456 3.132371216e-21
65 252.684978 -41.747162 5669.3965 6.109953405e-19
66 252.767382 -41.797062 2620.9918 5.745237922e-20
67 252.614036 -41.691898 2927.4283 2.601929453e-21
68 252.853972 -41.168407 4077.801 8.578331734e-21
69 252.530657 -41.494858 3710.4481 2.107929249e-21
70 252.888238 -41.156219 3051.514 2.338169331e-21
71 252.954428 -41.854729 2352.1781 7.655634184e-21
72 252.529755 -41.570686 3971.5989 1.646753947e-21
73 252.859513 -41.845554 1960.8674 2.707734881e-20
74 252.534145 -41.398724 2641.718 2.254402787e-20
75 252.517384 -41.442089 4700.5385 1.336052368e-21
76 252.519661 -41.420567 2712.4032 9.476834686e-21
77 252.505390 -41.523567 2424.7224 9.380974682e-21
78 252.551706 -41.664986 4533.3033 1.946284528e-21
79 252.533541 -41.361877 3241.7869 2.089844880e-21
80 252.528752 -41.363529 2884.1851 3.573968024e-21
81 252.537582 -41.341946 3474.6831 2.150638680e-21
82 252.985009 -41.116631 5300.3635 7.512473721e-21
83 252.943084 -41.116467 2563.0673 1.199197866e-20
84 252.481819 -41.505699 4124.1164 3.504032950e-21
85 252.684636 -41.811104 1739.5706 5.528665043e-20
86 252.865487 -41.120384 3887.7164 3.077710553e-21
87 252.625936 -41.221676 3127.7953 7.107185963e-21
88 252.507862 -41.351349 3286.9996 3.549705502e-21
89 252.479083 -41.589634 3738.6545 4.129429108e-21
90 252.757078 -41.859245 2270.8246 1.094835644e-20
91 252.554006 -41.272038 2492.9807 9.889697627e-21
92 252.471835 -41.598076 2736.3796 2.894022990e-21
93 252.542699 -41.276367 2475.8087 4.842431050e-21
94 252.511061 -41.312374 2496.4218 7.691660579e-21
95 252.554795 -41.746521 2306.537 2.806803951e-20
96 252.951303 -41.914600 2055.4688 2.919622148e-20
97 252.553309 -41.249672 2774.7686 3.598089692e-21
98 252.662749 -41.836929 2559.5274 6.298053060e-20
99 252.586034 -41.213211 2699.3648 1.272659394e-20
100 252.621310 -41.184315 2339.6539 5.517846047e-20
101 252.484728 -41.318321 3241.4826 3.034603522e-21
102 252.888068 -41.920795 2172.8239 1.178319618e-20
103 252.569062 -41.786888 1997.9861 2.540725373e-18
104 252.894850 -41.926277 3119.2456 6.282643464e-21
105 252.754071 -41.105736 2305.87 2.977926508e-19
106 252.416676 -41.480968 2584.3833 6.094485261e-21
107 252.475692 -41.304031 2771.0305 2.562855157e-21
108 252.959799 -41.940510 2928.3378 7.427776553e-21
109 252.489676 -41.275761 3113.5553 1.991796655e-21
110 252.818710 -41.075542 3718.8548 2.399741427e-21
111 252.402479 -41.491196 3794.1333 2.538537950e-21
112 252.442786 -41.333641 2729.4879 1.647642206e-20
113 252.511390 -41.766029 3978.4711 1.041812848e-19
114 252.733459 -41.908119 2356.8452 1.082943201e-19
115 252.827830 -41.937569 2212.9815 1.296106781e-20
116 252.590056 -41.160686 4482.565 4.093997833e-21
117 252.401278 -41.399200 4947.7347 2.579535530e-21
118 252.595412 -41.849270 3038.6398 2.195630587e-21
119 252.391907 -41.590279 2639.7551 6.874491362e-21
120 252.435847 -41.304939 2630.2127 9.154123002e-21
121 252.575461 -41.844299 3515.53 2.956347615e-21
122 252.735374 -41.926418 3943.3366 3.432362540e-21
123 252.543008 -41.825787 2449.224 5.869277802e-21
124 252.400547 -41.350430 2435.7419 2.802492442e-20
125 252.659622 -41.902222 1954.5765 1.958400627e-20
126 252.867911 -41.967499 2249.8926 7.604165132e-21
127 252.578956 -41.862316 3724.618 2.923059502e-21
128 252.797053 -41.043320 2319.464 9.471219009e-20
129 252.355937 -41.465790 3244.3183 2.446655993e-21
130 252.938864 -41.983559 2060.1537 2.139288089e-20
131 252.671688 -41.079185 2498.3696 1.368865176e-20
132 252.423228 -41.732479 3969.7407 4.496538401e-21
133 252.702582 -41.938839 3157.7626 2.251809079e-21
134 252.375407 -41.343994 4739.481 1.916162474e-21
135 252.747930 -41.958191 1976.0585 6.122852446e-19
136 252.488086 -41.817532 3065.1878 2.808993509e-21
137 252.531071 -41.855091 3461.697 2.165451775e-21
138 252.331859 -41.508068 3800.0226 1.289083783e-21
139 252.612445 -41.910809 2138.9346 1.076528786e-19
140 252.402738 -41.734364 2696.886 3.692306502e-21
141 252.742900 -41.032005 2248.3131 4.081614614e-20
142 252.403813 -41.744774 2392.2315 1.451514066e-20
143 252.694351 -41.044132 2796.9119 9.050642359e-21
144 252.449473 -41.805851 2583.8109 3.098494032e-21
145 252.361706 -41.310951 3088.8084 8.035276293e-20
146 252.628021 -41.936123 2165.4335 3.477380972e-20
147 252.628527 -41.062164 3525.6072 3.936962378e-21
148 252.498671 -41.862766 4455.1873 2.442442995e-21
149 252.547860 -41.900036 1829.2787 3.981719558e-19
150 252.511906 -41.123329 3048.4858 4.108573930e-19
151 252.299158 -41.447384 2850.0395 5.187928130e-21
152 252.335452 -41.684437 2307.2283 1.218874146e-20
153 252.403999 -41.211655 3878.6746 1.600194122e-21
154 252.313300 -41.647385 2577.9553 3.003599833e-20
155 252.571358 -41.070408 2709.2416 2.709037591e-20
156 252.425385 -41.826496 2525.6902 1.245343644e-20
157 252.501255 -41.108929 4557.5035 1.496484072e-21
158 252.419350 -41.828045 2417.7394 6.004864748e-21
159 252.300735 -41.656845 3045.2599 1.457684905e-20
160 252.553780 -41.066082 3864.3635 2.092158836e-21
161 252.512797 -41.088871 2482.2352 1.276192509e-20
162 252.585425 -41.043270 2532.8788 5.823061653e-21
163 252.269348 -41.407833 4001.3672 2.274827091e-21
164 252.366012 -41.794201 2198.7384 1.144758302e-20
165 252.340150 -41.238468 2289.0177 1.385972739e-19
166 252.343073 -41.774361 2905.8909 3.593985182e-21
167 252.408843 -41.852028 1865.391 5.198877258e-19
168 252.310223 -41.736164 3812.174 1.810697782e-21
169 252.320611 -41.757877 2169.6594 2.434838338e-20
170 252.270439 -41.333256 2365.5406 3.237555584e-20
171 252.348662 -41.199169 5067.5407 6.752510875e-22
172 252.426072 -41.885487 5469.2862 3.586713651e-20
173 252.539432 -41.965832 3103.0025 2.169955244e-21
174 252.312190 -41.232819 2607.8035 5.138810131e-21
175 252.322125 -41.213959 3032.9851 5.678482975e-21
176 252.275448 -41.723408 2303.4076 2.588029892e-20
177 252.501590 -41.045898 2858.9979 4.151636299e-21
178 252.404604 -41.113808 2089.8494 4.744769752e-19
179 252.244760 -41.323631 2463.2692 4.048981099e-20
180 252.533988 -41.983418 3385.5453 2.255859726e-21
181 252.277093 -41.756138 2616.2854 1.036789486e-20
182 252.212942 -41.389023 4550.4841 5.494747328e-21
183 252.327126 -41.833012 2606.1897 3.581718507e-20
184 252.192324 -41.478523 3399.6546 9.312523645e-21
185 252.195062 -41.580227 2432.3018 2.558664360e-20
186 252.351414 -41.132088 4835.2654 1.494196790e-20
187 252.219672 -41.316750 2757.7871 9.722954650e-21
188 252.179320 -41.542236 2505.6081 4.079715741e-20
189 252.384267 -41.089497 3098.6822 2.580183220e-21
190 252.286700 -41.818886 2391.4591 4.608540788e-21
191 252.404791 -41.065308 2725.8265 1.280171558e-20
192 252.348719 -41.109009 2563.7877 5.295587432e-21
193 252.275590 -41.183922 3136.0759 2.155352512e-21
194 252.296743 -41.850468 2642.1889 3.444749934e-21
195 252.155483 -41.546150 3067.0239 1.010821076e-20
196 252.425040 -41.032890 2191.7822 8.602034164e-20
197 252.257575 -41.187611 2620.5985 5.430920820e-21
198 252.209675 -41.750561 5933.4021 3.419106040e-21
199 252.139858 -41.511059 2304.5709 1.521337795e-20
200 252.280242 -41.859871 2554.1495 4.131733496e-20
201 252.290455 -41.875862 2252.1922 7.143409889e-21
202 252.207488 -41.773079 2741.2179 3.591469643e-21
203 252.268957 -41.861740 2870.4585 5.142293941e-21
204 252.164698 -41.705589 3226.7965 1.516741376e-21
205 252.136197 -41.370609 2639.5238 7.139074809e-21
206 252.208556 -41.799927 2404.5217 5.792148473e-21
207 252.121883 -41.400883 3451.9125 2.047169827e-21
208 252.111395 -41.560272 2620.36 2.629143700e-20
209 252.349896 -41.040703 2944.3872 3.233908544e-21
210 252.349523 -41.037327 2520.8525 7.111428303e-21
211 252.199753 -41.190865 4018.3583 1.468388429e-21
212 252.231351 -41.861416 2142.4034 3.580526979e-20
213 252.200156 -41.826633 2332.3668 1.323691175e-20
214 252.294760 -41.936317 2254.9961 8.466430175e-21
215 252.135159 -41.276543 2473.5397 1.114524356e-20
216 252.304821 -41.050865 4299.2924 1.154323215e-21
217 252.085210 -41.408707 2367.3699 1.484933061e-20
218 252.095827 -41.350533 2977.7993 2.310733205e-21
219 252.099867 -41.679367 4428.1414 1.260539465e-21
220 252.304979 -41.969177 2291.2197 7.570805420e-21
221 252.290798 -41.043411 4025.1584 1.694311145e-21
222 252.075776 -41.634266 2381.1205 8.869901372e-21
223 252.087812 -41.685959 4396.0093 1.769041975e-21
224 252.108782 -41.261692 2633.8123 3.379419937e-21
225 252.052929 -41.432144 2278.3046 7.148847792e-21
226 252.064960 -41.651070 2356.5411 1.168849360e-20
227 252.223106 -41.081467 2628.713 4.601469961e-21
228 252.232576 -41.937927 2617.5219 5.243548616e-21
229 252.190777 -41.899170 2013.1654 1.602521185e-20
230 252.081125 -41.269642 3819.9146 2.080052256e-21
231 252.210905 -41.930817 3236.2152 1.756321514e-21
232 252.035556 -41.629017 3964.5855 3.139396056e-21
233 252.111531 -41.189316 3886.2667 2.563179942e-21
234 252.035872 -41.348522 2956.2451 4.390503415e-21
235 252.085910 -41.218925 2288.183 6.623060966e-21
236 252.092595 -41.806648 3658.6782 1.857470436e-21
237 252.228109 -41.975403 2496.3252 1.669613407e-20
238 252.000450 -41.467415 2395.9855 4.911240002e-20
239 252.126775 -41.876106 2548.3508 8.029098280e-21
240 252.053633 -41.767536 2823.2556 2.497068082e-20
241 252.058645 -41.221397 1925.1259 1.985755782e-18
242 252.184620 -41.960602 2346.3856 1.004743319e-19
243 252.205453 -41.986469 2625.4111 6.558990736e-19
244 252.067377 -41.178082 2366.0375 1.062986514e-19
245 252.099065 -41.883869 2206.4486 1.462323794e-20
246 252.127616 -41.079384 5637.2404 2.605712833e-21
247 252.157563 -41.968189 3170.3861 3.110823479e-21
248 252.157831 -41.028790 3872.4118 1.005513251e-21
249 252.023196 -41.195976 2897.4044 3.948078463e-21
250 252.093282 -41.926586 2197.9598 2.684248811e-20
251 252.022030 -41.167690 2150.1569 1.986315993e-20
252 252.083875 -41.938160 1984.6353 1.319554431e-19
253 252.010117 -41.854439 3121.079 2.461648273e-21
254 252.015535 -41.126656 3400.0499 1.883892944e-21
255 252.010436 -41.114506 2878.126 3.049867123e-21
256 252.045690 -41.046795 4846.7315 2.780565962e-21
257 252.006986 -41.942474 4241.3759 1.703940942e-21
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.689 s
Frame 0: finding and prefetching catalog tiles...
Catalog prefetch: 64440 requested, 3 newly loaded (21087 stars), 64437 unavailable in 0.033 s; 4 loader workers
Frame 0: catalog prefetch finished (64440 candidate tiles).
Frame 0: splatting 130882 lens triangles...
Frame 0: catalog splatting finished in 1.9 s; writing image...
Rendered 156837 images from 21087 catalog stars to /tmp/gr-hip-clean-baseline-multi.png (ok; imported lens map)
PSF splats: cached 156837, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
HIP PSF: 156837 events in 10 batches (10 timed); upload 0.000304 s, kernel 1.496493 s, download 0.026518 s
OMP_NUM_THREADS=16 timeout --kill-after=5s 60s --all-sky-catalog 4 1e-8 12.48s user 0.25s system 421% cpu 3.016 total
+209
View File
@@ -0,0 +1,209 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.662 s
Frame 0: finding and prefetching catalog tiles...
Catalog prefetch: 64440 requested, 3 newly loaded (21087 stars), 64437 unavailable in 0.035 s; 4 loader workers
Frame 0: catalog prefetch finished (64440 candidate tiles).
Frame 0: splatting 130882 lens triangles...
Frame 0: splat worker 2/16 started.
Frame 0: splat worker 4/16 started.
Frame 0: splat worker 3/16 started.
Frame 0: splat worker 3/16 reached 8 local triangles.
Frame 0: splat worker 1/16 started.
Frame 0: splat worker 4/16 reached 8 local triangles.
Frame 0: splat worker 4/16 reached 16 local triangles.
Frame 0: splat worker 2/16 reached 8 local triangles.
Frame 0: splat worker 1/16 reached 8 local triangles.
Frame 0: splat worker 7/16 started.
Frame 0: splat worker 4/16 reached 32 local triangles.
Frame 0: splat worker 6/16 started.
Frame 0: splat worker 2/16 reached 16 local triangles.
Frame 0: splat worker 1/16 reached 16 local triangles.
Frame 0: splat worker 3/16 reached 16 local triangles.
Frame 0: splat worker 7/16 reached 8 local triangles.
Frame 0: splat worker 4/16 reached 64 local triangles.
Frame 0: splat worker 6/16 reached 8 local triangles.
Frame 0: splat worker 2/16 reached 32 local triangles.
Frame 0: splat worker 1/16 reached 32 local triangles.
Frame 0: splat worker 3/16 reached 32 local triangles.
Frame 0: splat worker 7/16 reached 16 local triangles.
Frame 0: splat worker 3/16 reached 64 local triangles.
Frame 0: splat worker 4/16 reached 128 local triangles.
Frame 0: splat worker 2/16 reached 64 local triangles.
Frame 0: splat worker 1/16 reached 64 local triangles.
Frame 0: splat worker 3/16 reached 128 local triangles.
Frame 0: splat worker 6/16 reached 16 local triangles.
Frame 0: splat worker 7/16 reached 32 local triangles.
Frame 0: splat worker 6/16 reached 32 local triangles.
Frame 0: splat worker 14/16 started.
Frame 0: splat worker 15/16 started.
Frame 0: splat worker 13/16 started.
Frame 0: splat worker 12/16 started.
Frame 0: splat worker 11/16 started.
Frame 0: splat worker 16/16 started.
Frame 0: splat worker 2/16 reached 128 local triangles.
Frame 0: splat worker 10/16 started.
Frame 0: splat worker 9/16 started.
Frame 0: splat worker 8/16 started.
Frame 0: splat worker 15/16 reached 8 local triangles.
Frame 0: splat worker 1/16 reached 128 local triangles.
Frame 0: splat worker 15/16 reached 16 local triangles.
Frame 0: splat worker 9/16 reached 8 local triangles.
Frame 0: splat worker 12/16 reached 8 local triangles.
Frame 0: splat worker 10/16 reached 8 local triangles.
Frame 0: splat worker 10/16 reached 16 local triangles.
Frame 0: splat worker 1/16 reached 256 local triangles.
Frame 0: splat worker 10/16 reached 32 local triangles.
Frame 0: splat worker 12/16 reached 16 local triangles.
Frame 0: splat worker 5/16 started.
Frame 0: splat worker 12/16 reached 32 local triangles.
Frame 0: splat worker 5/16 reached 8 local triangles.
Frame 0: splat worker 9/16 reached 16 local triangles.
Frame 0: splat worker 5/16 reached 16 local triangles.
Frame 0: splat worker 10/16 reached 64 local triangles.
Frame 0: splat worker 15/16 reached 32 local triangles.
Frame 0: splat worker 13/16 reached 8 local triangles.
Frame 0: splat worker 13/16 reached 16 local triangles.
Frame 0: splat worker 13/16 reached 32 local triangles.
Frame 0: splat worker 13/16 reached 64 local triangles.
Frame 0: splat worker 7/16 reached 64 local triangles.
Frame 0: splat worker 6/16 reached 64 local triangles.
Frame 0: splat worker 13/16 reached 128 local triangles.
Frame 0: splat worker 4/16 reached 256 local triangles.
Frame 0: splat worker 7/16 reached 128 local triangles.
Frame 0: splat worker 14/16 reached 8 local triangles.
Frame 0: splat worker 11/16 reached 8 local triangles.
Frame 0: splat worker 12/16 reached 64 local triangles.
Frame 0: splat worker 2/16 reached 256 local triangles.
Frame 0: splat worker 9/16 reached 32 local triangles.
Frame 0: splat worker 8/16 reached 8 local triangles.
Frame 0: splat worker 14/16 reached 16 local triangles.
Frame 0: splat worker 11/16 reached 16 local triangles.
Frame 0: splat worker 5/16 reached 32 local triangles.
Frame 0: splat worker 8/16 reached 16 local triangles.
Frame 0: splat worker 6/16 reached 128 local triangles.
Frame 0: splat worker 14/16 reached 32 local triangles.
Frame 0: splat worker 16/16 reached 8 local triangles.
Frame 0: splat worker 12/16 reached 128 local triangles.
Frame 0: splat worker 13/16 reached 256 local triangles.
Frame 0: splat worker 8/16 reached 32 local triangles.
Frame 0: splat worker 11/16 reached 32 local triangles.
Frame 0: splat worker 15/16 reached 64 local triangles.
Frame 0: splat worker 9/16 reached 64 local triangles.
Frame 0: splat worker 16/16 reached 16 local triangles.
Frame 0: splat worker 5/16 reached 64 local triangles.
Frame 0: splat worker 8/16 reached 64 local triangles.
Frame 0: splat worker 8/16 reached 128 local triangles.
Frame 0: splat worker 9/16 reached 128 local triangles.
Frame 0: splat worker 8/16 reached 256 local triangles.
Frame 0: splat worker 16/16 reached 32 local triangles.
Frame 0: splat worker 14/16 reached 64 local triangles.
Frame 0: splat worker 11/16 reached 64 local triangles.
Frame 0: splat worker 9/16 reached 256 local triangles.
Frame 0: splat worker 1/16 reached 512 local triangles.
Frame 0: splat worker 7/16 reached 256 local triangles.
Frame 0: splat worker 3/16 reached 256 local triangles.
Frame 0: splat worker 14/16 reached 128 local triangles.
Frame 0: splat worker 4/16 reached 512 local triangles.
Frame 0: splat worker 5/16 reached 128 local triangles.
Frame 0: splat worker 14/16 reached 256 local triangles.
Frame 0: splat worker 15/16 reached 128 local triangles.
Frame 0: splat worker 2/16 reached 512 local triangles.
Frame 0: splat worker 6/16 reached 256 local triangles.
Frame 0: splat worker 5/16 reached 256 local triangles.
Frame 0: splat worker 16/16 reached 64 local triangles.
Frame 0: splat worker 11/16 reached 128 local triangles.
Frame 0: splat worker 3/16 reached 512 local triangles.
Frame 0: splat worker 12/16 reached 256 local triangles.
Frame 0: splat worker 13/16 reached 512 local triangles.
Frame 0: splat worker 10/16 reached 128 local triangles.
Frame 0: splat worker 8/16 reached 512 local triangles.
Frame 0: splat worker 10/16 reached 256 local triangles.
Frame 0: splat worker 6/16 reached 512 local triangles.
Frame 0: splat worker 14/16 reached 512 local triangles.
Frame 0: splat worker 9/16 reached 512 local triangles.
Frame 0: splat worker 1/16 reached 1024 local triangles.
Frame 0: splat worker 4/16 reached 1024 local triangles.
Frame 0: splat worker 13/16 reached 1024 local triangles.
Frame 0: splat worker 11/16 reached 256 local triangles.
Frame 0: splat worker 5/16 reached 512 local triangles.
Frame 0: splat worker 15/16 reached 256 local triangles.
Frame 0: splat worker 16/16 reached 128 local triangles.
Frame 0: splat worker 7/16 reached 512 local triangles.
Frame 0: splat worker 12/16 reached 512 local triangles.
Frame 0: splat worker 15/16 reached 512 local triangles.
Frame 0: splat worker 16/16 reached 256 local triangles.
Frame 0: splat worker 11/16 reached 512 local triangles.
Frame 0: splat worker 6/16 reached 1024 local triangles.
Frame 0: splat worker 3/16 reached 1024 local triangles.
Frame 0: splat worker 2/16 reached 1024 local triangles.
Frame 0: splat worker 7/16 reached 1024 local triangles.
Frame 0: splat worker 8/16 reached 1024 local triangles.
Frame 0: splat worker 10/16 reached 512 local triangles.
Frame 0: splat worker 14/16 reached 1024 local triangles.
Frame 0: splat worker 13/16 reached 2048 local triangles.
Frame 0: splat worker 12/16 reached 1024 local triangles.
Frame 0: splat worker 5/16 reached 1024 local triangles.
Frame 0: splat worker 15/16 reached 1024 local triangles.
Frame 0: splat worker 9/16 reached 1024 local triangles.
Frame 0: splat worker 4/16 reached 2048 local triangles.
Frame 0: splat worker 11/16 reached 1024 local triangles.
Frame 0: splat worker 3/16 reached 2048 local triangles.
Frame 0: splat worker 16/16 reached 512 local triangles.
Frame 0: splat worker 14/16 reached 2048 local triangles.
Frame 0: splat worker 1/16 reached 2048 local triangles.
Frame 0: splat worker 10/16 reached 1024 local triangles.
Frame 0: splat worker 2/16 reached 2048 local triangles.
Frame 0: splat worker 8/16 reached 2048 local triangles.
Frame 0: splat worker 15/16 reached 2048 local triangles.
Frame 0: splat worker 11/16 reached 2048 local triangles.
Frame 0: splat worker 5/16 reached 2048 local triangles.
Frame 0: splat worker 9/16 reached 2048 local triangles.
Frame 0: splat worker 6/16 reached 2048 local triangles.
Frame 0: splat worker 13/16 reached 4096 local triangles.
Frame 0: splat worker 12/16 reached 2048 local triangles.
Frame 0: splat worker 7/16 reached 2048 local triangles.
Frame 0: splat worker 3/16 reached 4096 local triangles.
Frame 0: splat worker 4/16 reached 4096 local triangles.
Frame 0: splat worker 8/16 reached 4096 local triangles.
Frame 0: splat worker 14/16 reached 4096 local triangles.
Frame 0: splat worker 6/16 reached 4096 local triangles.
Frame 0: splat worker 15/16 reached 4096 local triangles.
Frame 0: splat worker 16/16 reached 1024 local triangles.
Frame 0: splat worker 5/16 reached 4096 local triangles.
Frame 0: splat worker 1/16 reached 4096 local triangles.
Frame 0: splat worker 10/16 reached 2048 local triangles.
Frame 0: splat worker 13/16 reached 8192 local triangles.
Frame 0: splat worker 7/16 reached 4096 local triangles.
Frame 0: splat worker 16/16 reached 2048 local triangles.
Frame 0: splat worker 9/16 reached 4096 local triangles.
Frame 0: splat worker 12/16 reached 4096 local triangles.
Frame 0: splat worker 11/16 reached 4096 local triangles.
Frame 0: splat worker 2/16 reached 4096 local triangles.
Frame 0: splat worker 3/16 reached 8192 local triangles.
Frame 0: splat worker 14/16 reached 8192 local triangles.
Frame 0: splat worker 15/16 reached 8192 local triangles.
Frame 0: splat worker 6/16 reached 8192 local triangles.
Frame 0: splat worker 4/16 reached 8192 local triangles.
Frame 0: splat worker 1/16 reached 8192 local triangles.
Frame 0: splat worker 16/16 reached 4096 local triangles.
Frame 0: splat worker 10/16 reached 4096 local triangles.
Frame 0: splat worker 8/16 reached 8192 local triangles.
Frame 0: splat worker 3/16 finished after 10458 local triangles.
Frame 0: splat worker 16/16 finished after 4920 local triangles.
Frame 0: splat worker 11/16 finished after 6992 local triangles.
Frame 0: splat worker 10/16 finished after 4986 local triangles.
Frame 0: splat worker 15/16 finished after 9498 local triangles.
Frame 0: splat worker 6/16 finished after 8930 local triangles.
Frame 0: splat worker 4/16 finished after 9108 local triangles.
Frame 0: splat worker 12/16 finished after 7689 local triangles.
Frame 0: splat worker 5/16 finished after 7943 local triangles.
Frame 0: splat worker 14/16 finished after 9623 local triangles.
Frame 0: splat worker 8/16 finished after 8856 local triangles.
Frame 0: splat worker 1/16 finished after 9031 local triangles.
Frame 0: splat worker 2/16 finished after 7194 local triangles.
Frame 0: splat worker 9/16 finished after 7002 local triangles.
Frame 0: splat worker 13/16 finished after 11036 local triangles.
Frame 0: splat worker 7/16 finished after 7616 local triangles.
Frame 0: catalog splatting finished in 0.6 s; writing image...
Rendered 156837 images from 21087 catalog stars to /tmp/gr-cpu-multi.png (ok; imported lens map)
PSF splats: cached 156837, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
OMP_NUM_THREADS=16 timeout --kill-after=5s 60s --all-sky-catalog 4 1e-8 17.59s user 1.25s system 1125% cpu 1.674 total
@@ -0,0 +1,41 @@
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc tests/test_observer.c src/catalog.c src/frame.c src/geodesic.c src/lens_map.c src/movie.c src/observer.c src/observer_track.c src/optics.c src/ray.c src/spacetime_common.c src/spacetime_minkowski.c -lm -lpng -o build/Release/test_observer_minkowski
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -DSPACETIME_SCHWARZSCHILD -Isrc tests/test_observer.c src/catalog.c src/frame.c src/geodesic.c src/lens_map.c src/movie.c src/observer.c src/observer_track.c src/optics.c src/ray.c src/spacetime_common.c src/spacetime_schwarzschild.c -lm -lpng -o build/Release/test_observer_schwarzschild
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc tests/test_geodesic.c src/catalog.c src/frame.c src/geodesic.c src/lens_map.c src/movie.c src/observer.c src/observer_track.c src/optics.c src/ray.c src/spacetime_common.c src/spacetime_minkowski.c -lm -lpng -o build/Release/test_geodesic
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc tests/test_frame.c src/catalog.c src/frame.c src/geodesic.c src/lens_map.c src/movie.c src/observer.c src/observer_track.c src/optics.c src/ray.c src/spacetime_common.c src/spacetime_minkowski.c -lm -lpng -o build/Release/test_frame
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc tests/test_schwarzschild.c src/catalog.c src/frame.c src/geodesic.c src/lens_map.c src/movie.c src/observer.c src/observer_track.c src/optics.c src/ray.c src/spacetime_common.c src/spacetime_schwarzschild.c -lm -lpng -o build/Release/test_schwarzschild
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc tests/test_observer_track.c src/catalog.c src/frame.c src/geodesic.c src/lens_map.c src/movie.c src/observer.c src/observer_track.c src/optics.c src/ray.c src/spacetime_common.c -lm -lpng -o build/Release/test_observer_track
cc -DENABLE_PNG -DFRAME_PSF_EVENT_SINK=1 -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp -Isrc tests/test_catalog_prefetch.c src/catalog.c src/frame.c src/geodesic.c src/lens_map.c src/movie.c src/observer.c src/observer_track.c src/optics.c src/ray.c src/spacetime_common.c src/spacetime_minkowski.c -lm -lpng -o build/Release/test_catalog_prefetch
make SPACETIME=minkowski ENABLE_HDR=1 backend
make[1]: Entering directory '/home/wyj/Code/C/GR_4d_raytracing'
cc -O2 -DNDEBUG -fopenmp build/Release/obj/minkowski/hdr_sink1_cpu/src/catalog.o build/Release/obj/minkowski/hdr_sink1_cpu/src/frame.o build/Release/obj/minkowski/hdr_sink1_cpu/src/geodesic.o build/Release/obj/minkowski/hdr_sink1_cpu/src/lens_map.o build/Release/obj/minkowski/hdr_sink1_cpu/src/movie.o build/Release/obj/minkowski/hdr_sink1_cpu/src/observer.o build/Release/obj/minkowski/hdr_sink1_cpu/src/observer_track.o build/Release/obj/minkowski/hdr_sink1_cpu/src/optics.o build/Release/obj/minkowski/hdr_sink1_cpu/src/ray.o build/Release/obj/minkowski/hdr_sink1_cpu/src/spacetime_common.o build/Release/obj/minkowski/hdr_sink1_cpu/src/spacetime_minkowski.o build/Release/obj/minkowski/hdr_sink1_cpu/src/main.o -lm -lpng -lcfitsio -o build/Release/minkowski_sky
make[1]: Leaving directory '/home/wyj/Code/C/GR_4d_raytracing'
mkdir -p /tmp/gr_psf_event_sink_reference
OMP_NUM_THREADS=16 build/Release/minkowski_sky --catalog assets/sky_grid_5deg.csv --output /tmp/gr_psf_event_sink_reference/minkowski_ra1_dec1_640x360.png --hdr-output --width 640 --height 360 --fov-deg 30 --look-ra-deg 1 --look-dec-deg 1 --exposure 0.1 --observer-radius 30 --observer-velocity 0 0 0 --psf-fwhm-pixels 2.7 --psf-moffat-beta 4.5 --max-magnification 1e300 --max-cache-psf-flux 1 --psf-relative-tail 1e-8 --psf-min-y 0 --coarse-cell-pixels 16 --refine-max-level 0 --refine-angle-abs-deg 0.001 --refine-angle-rel 0.1 --refine-jacobian-min 1e-3 --refine-min-edge-pixels 0.5 --refine-min-area-pixels2 0.25 --catalog-load-workers 4
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.677 s
Rendered 35 images from 5654 catalog stars to /tmp/gr_psf_event_sink_reference/minkowski_ra1_dec1_640x360.png (ok)
PSF splats: cached 35, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
python3 scripts/fits_floatdiff.py tests/data/psf_event_sink_reference/minkowski_ra1_dec1_640x360_HDR.fits /tmp/gr_psf_event_sink_reference/minkowski_ra1_dec1_640x360_HDR.fits
floatdiff: shape=(640, 360, 3) samples=691200 mismatches=0 max_abs=0 max_rel=0 worst_sample=0
make SPACETIME=schwarzschild ENABLE_HDR=1 backend
make[1]: Entering directory '/home/wyj/Code/C/GR_4d_raytracing'
cc -O2 -DNDEBUG -fopenmp build/Release/obj/schwarzschild/hdr_sink1_cpu/src/catalog.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/frame.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/geodesic.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/lens_map.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/movie.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/observer.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/observer_track.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/optics.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/ray.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/spacetime_common.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/spacetime_schwarzschild.o build/Release/obj/schwarzschild/hdr_sink1_cpu/src/main.o -lm -lpng -lcfitsio -o build/Release/schwarzschild_sky
make[1]: Leaving directory '/home/wyj/Code/C/GR_4d_raytracing'
OMP_NUM_THREADS=16 build/Release/schwarzschild_sky --catalog assets/sky_grid_5deg.csv --output /tmp/gr_psf_event_sink_reference/schwarzschild_ra1_dec1_fov60_640x360.png --hdr-output --width 640 --height 360 --fov-deg 60 --look-ra-deg 1 --look-dec-deg 1 --exposure 0.1 --observer-radius 30 --observer-velocity 0 0 0 --psf-fwhm-pixels 2.7 --psf-moffat-beta 4.5 --max-magnification 1e300 --max-cache-psf-flux 1 --psf-relative-tail 1e-8 --psf-min-y 0 --coarse-cell-pixels 16 --refine-max-level 0 --refine-angle-abs-deg 0.001 --refine-angle-rel 0.1 --refine-jacobian-min 1e-3 --refine-min-edge-pixels 0.5 --refine-min-area-pixels2 0.25 --catalog-load-workers 4
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.670 s
Rendered 5206 images from 5654 catalog stars to /tmp/gr_psf_event_sink_reference/schwarzschild_ra1_dec1_fov60_640x360.png (ok)
PSF splats: cached 5206, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
python3 scripts/fits_floatdiff.py tests/data/psf_event_sink_reference/schwarzschild_ra1_dec1_fov60_640x360_HDR.fits /tmp/gr_psf_event_sink_reference/schwarzschild_ra1_dec1_fov60_640x360_HDR.fits
floatdiff: shape=(640, 360, 3) samples=691200 mismatches=0 max_abs=0 max_rel=0 worst_sample=0
./build/Release/test_observer_minkowski
coordinate-camera regression passed
./build/Release/test_observer_schwarzschild
coordinate-camera regression passed
./build/Release/test_geodesic
./build/Release/test_frame
./build/Release/test_schwarzschild
./build/Release/test_observer_track
./build/Release/test_catalog_prefetch
python3 tests/test_camera_cli.py build/Release
minkowski: CLI checks passed; single/movie PNG identical, map max error 0
schwarzschild: movie lens map identical with 1, 4 and 16 threads
schwarzschild: CLI checks passed; single/movie PNG identical, map max error 4.44e-16
@@ -0,0 +1,3 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 1.636 s
HIP PSF backend failed during initialization: no ROCm-capable device is detected
exit_code=1
@@ -0,0 +1,208 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.674 s
Frame 0: finding and prefetching catalog tiles...
Catalog prefetch: 64440 requested, 1 newly loaded (8192 stars), 64439 unavailable in 0.034 s; 4 loader workers
Frame 0: catalog prefetch finished (64440 candidate tiles).
Frame 0: splatting 130882 lens triangles...
Frame 0: splat worker 13/16 started.
Frame 0: splat worker 1/16 started.
Frame 0: splat worker 9/16 started.
Frame 0: splat worker 13/16 reached 8 local triangles.
Frame 0: splat worker 4/16 started.
Frame 0: splat worker 16/16 started.
Frame 0: splat worker 15/16 started.
Frame 0: splat worker 16/16 reached 8 local triangles.
Frame 0: splat worker 11/16 started.
Frame 0: splat worker 3/16 started.
Frame 0: splat worker 7/16 started.
Frame 0: splat worker 1/16 reached 8 local triangles.
Frame 0: splat worker 3/16 reached 8 local triangles.
Frame 0: splat worker 1/16 reached 16 local triangles.
Frame 0: splat worker 12/16 started.
Frame 0: splat worker 5/16 started.
Frame 0: splat worker 9/16 reached 8 local triangles.
Frame 0: splat worker 12/16 reached 8 local triangles.
Frame 0: splat worker 9/16 reached 16 local triangles.
Frame 0: splat worker 12/16 reached 16 local triangles.
Frame 0: splat worker 4/16 reached 8 local triangles.
Frame 0: splat worker 2/16 started.
Frame 0: splat worker 16/16 reached 16 local triangles.
Frame 0: splat worker 15/16 reached 8 local triangles.
Frame 0: splat worker 11/16 reached 8 local triangles.
Frame 0: splat worker 15/16 reached 16 local triangles.
Frame 0: splat worker 8/16 started.
Frame 0: splat worker 11/16 reached 16 local triangles.
Frame 0: splat worker 7/16 reached 8 local triangles.
Frame 0: splat worker 15/16 reached 32 local triangles.
Frame 0: splat worker 8/16 reached 8 local triangles.
Frame 0: splat worker 7/16 reached 16 local triangles.
Frame 0: splat worker 13/16 reached 16 local triangles.
Frame 0: splat worker 10/16 started.
Frame 0: splat worker 4/16 reached 16 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 2/16 reached 16 local triangles.
Frame 0: splat worker 10/16 reached 16 local triangles.
Frame 0: splat worker 16/16 reached 32 local triangles.
Frame 0: splat worker 3/16 reached 16 local triangles.
Frame 0: splat worker 1/16 reached 32 local triangles.
Frame 0: splat worker 11/16 reached 32 local triangles.
Frame 0: splat worker 5/16 reached 8 local triangles.
Frame 0: splat worker 8/16 reached 16 local triangles.
Frame 0: splat worker 5/16 reached 16 local triangles.
Frame 0: splat worker 1/16 reached 64 local triangles.
Frame 0: splat worker 11/16 reached 64 local triangles.
Frame 0: splat worker 8/16 reached 32 local triangles.
Frame 0: splat worker 9/16 reached 32 local triangles.
Frame 0: splat worker 12/16 reached 32 local triangles.
Frame 0: splat worker 4/16 reached 32 local triangles.
Frame 0: splat worker 6/16 started.
Frame 0: splat worker 2/16 reached 32 local triangles.
Frame 0: splat worker 1/16 reached 128 local triangles.
Frame 0: splat worker 9/16 reached 64 local triangles.
Frame 0: splat worker 12/16 reached 64 local triangles.
Frame 0: splat worker 14/16 started.
Frame 0: splat worker 16/16 reached 64 local triangles.
Frame 0: splat worker 7/16 reached 32 local triangles.
Frame 0: splat worker 13/16 reached 32 local triangles.
Frame 0: splat worker 10/16 reached 32 local triangles.
Frame 0: splat worker 7/16 reached 64 local triangles.
Frame 0: splat worker 6/16 reached 8 local triangles.
Frame 0: splat worker 3/16 reached 32 local triangles.
Frame 0: splat worker 6/16 reached 16 local triangles.
Frame 0: splat worker 4/16 reached 64 local triangles.
Frame 0: splat worker 13/16 reached 64 local triangles.
Frame 0: splat worker 10/16 reached 64 local triangles.
Frame 0: splat worker 14/16 reached 8 local triangles.
Frame 0: splat worker 15/16 reached 64 local triangles.
Frame 0: splat worker 14/16 reached 16 local triangles.
Frame 0: splat worker 1/16 reached 256 local triangles.
Frame 0: splat worker 16/16 reached 128 local triangles.
Frame 0: splat worker 9/16 reached 128 local triangles.
Frame 0: splat worker 2/16 reached 64 local triangles.
Frame 0: splat worker 12/16 reached 128 local triangles.
Frame 0: splat worker 6/16 reached 32 local triangles.
Frame 0: splat worker 5/16 reached 32 local triangles.
Frame 0: splat worker 3/16 reached 64 local triangles.
Frame 0: splat worker 15/16 reached 128 local triangles.
Frame 0: splat worker 11/16 reached 128 local triangles.
Frame 0: splat worker 7/16 reached 128 local triangles.
Frame 0: splat worker 14/16 reached 32 local triangles.
Frame 0: splat worker 4/16 reached 128 local triangles.
Frame 0: splat worker 13/16 reached 128 local triangles.
Frame 0: splat worker 10/16 reached 128 local triangles.
Frame 0: splat worker 8/16 reached 64 local triangles.
Frame 0: splat worker 2/16 reached 128 local triangles.
Frame 0: splat worker 14/16 reached 64 local triangles.
Frame 0: splat worker 16/16 reached 256 local triangles.
Frame 0: splat worker 3/16 reached 128 local triangles.
Frame 0: splat worker 5/16 reached 64 local triangles.
Frame 0: splat worker 9/16 reached 256 local triangles.
Frame 0: splat worker 8/16 reached 128 local triangles.
Frame 0: splat worker 12/16 reached 256 local triangles.
Frame 0: splat worker 15/16 reached 256 local triangles.
Frame 0: splat worker 14/16 reached 128 local triangles.
Frame 0: splat worker 11/16 reached 256 local triangles.
Frame 0: splat worker 7/16 reached 256 local triangles.
Frame 0: splat worker 2/16 reached 256 local triangles.
Frame 0: splat worker 5/16 reached 128 local triangles.
Frame 0: splat worker 13/16 reached 256 local triangles.
Frame 0: splat worker 4/16 reached 256 local triangles.
Frame 0: splat worker 10/16 reached 256 local triangles.
Frame 0: splat worker 1/16 reached 512 local triangles.
Frame 0: splat worker 3/16 reached 256 local triangles.
Frame 0: splat worker 8/16 reached 256 local triangles.
Frame 0: splat worker 14/16 reached 256 local triangles.
Frame 0: splat worker 5/16 reached 256 local triangles.
Frame 0: splat worker 16/16 reached 512 local triangles.
Frame 0: splat worker 9/16 reached 512 local triangles.
Frame 0: splat worker 12/16 reached 512 local triangles.
Frame 0: splat worker 15/16 reached 512 local triangles.
Frame 0: splat worker 7/16 reached 512 local triangles.
Frame 0: splat worker 13/16 reached 512 local triangles.
Frame 0: splat worker 11/16 reached 512 local triangles.
Frame 0: splat worker 2/16 reached 512 local triangles.
Frame 0: splat worker 4/16 reached 512 local triangles.
Frame 0: splat worker 10/16 reached 512 local triangles.
Frame 0: splat worker 3/16 reached 512 local triangles.
Frame 0: splat worker 8/16 reached 512 local triangles.
Frame 0: splat worker 14/16 reached 512 local triangles.
Frame 0: splat worker 5/16 reached 512 local triangles.
Frame 0: splat worker 1/16 reached 1024 local triangles.
Frame 0: splat worker 13/16 reached 1024 local triangles.
Frame 0: splat worker 16/16 reached 1024 local triangles.
Frame 0: splat worker 9/16 reached 1024 local triangles.
Frame 0: splat worker 12/16 reached 1024 local triangles.
Frame 0: splat worker 7/16 reached 1024 local triangles.
Frame 0: splat worker 15/16 reached 1024 local triangles.
Frame 0: splat worker 11/16 reached 1024 local triangles.
Frame 0: splat worker 2/16 reached 1024 local triangles.
Frame 0: splat worker 4/16 reached 1024 local triangles.
Frame 0: splat worker 10/16 reached 1024 local triangles.
Frame 0: splat worker 8/16 reached 1024 local triangles.
Frame 0: splat worker 14/16 reached 1024 local triangles.
Frame 0: splat worker 3/16 reached 1024 local triangles.
Frame 0: splat worker 5/16 reached 1024 local triangles.
Frame 0: splat worker 16/16 reached 2048 local triangles.
Frame 0: splat worker 11/16 reached 2048 local triangles.
Frame 0: splat worker 2/16 reached 2048 local triangles.
Frame 0: splat worker 9/16 reached 2048 local triangles.
Frame 0: splat worker 13/16 reached 2048 local triangles.
Frame 0: splat worker 12/16 reached 2048 local triangles.
Frame 0: splat worker 16/16 reached 4096 local triangles.
Frame 0: splat worker 2/16 reached 4096 local triangles.
Frame 0: splat worker 11/16 reached 4096 local triangles.
Frame 0: splat worker 1/16 reached 2048 local triangles.
Frame 0: splat worker 6/16 reached 64 local triangles.
Frame 0: splat worker 9/16 reached 4096 local triangles.
Frame 0: splat worker 13/16 reached 4096 local triangles.
Frame 0: splat worker 6/16 reached 128 local triangles.
Frame 0: splat worker 6/16 reached 256 local triangles.
Frame 0: splat worker 5/16 reached 2048 local triangles.
Frame 0: splat worker 6/16 reached 512 local triangles.
Frame 0: splat worker 8/16 reached 2048 local triangles.
Frame 0: splat worker 6/16 reached 1024 local triangles.
Frame 0: splat worker 4/16 reached 2048 local triangles.
Frame 0: splat worker 12/16 reached 4096 local triangles.
Frame 0: splat worker 10/16 reached 2048 local triangles.
Frame 0: splat worker 3/16 reached 2048 local triangles.
Frame 0: splat worker 1/16 reached 4096 local triangles.
Frame 0: splat worker 14/16 reached 2048 local triangles.
Frame 0: splat worker 7/16 reached 2048 local triangles.
Frame 0: splat worker 4/16 reached 4096 local triangles.
Frame 0: splat worker 8/16 reached 4096 local triangles.
Frame 0: splat worker 5/16 reached 4096 local triangles.
Frame 0: splat worker 13/16 reached 8192 local triangles.
Frame 0: splat worker 10/16 reached 4096 local triangles.
Frame 0: splat worker 16/16 reached 8192 local triangles.
Frame 0: splat worker 3/16 reached 4096 local triangles.
Frame 0: splat worker 11/16 reached 8192 local triangles.
Frame 0: splat worker 6/16 reached 2048 local triangles.
Frame 0: splat worker 14/16 reached 4096 local triangles.
Frame 0: splat worker 9/16 reached 8192 local triangles.
Frame 0: splat worker 7/16 reached 4096 local triangles.
Frame 0: splat worker 15/16 reached 2048 local triangles.
Frame 0: splat worker 12/16 reached 8192 local triangles.
Frame 0: splat worker 1/16 reached 8192 local triangles.
Frame 0: splat worker 8/16 reached 8192 local triangles.
Frame 0: splat worker 10/16 finished after 7675 local triangles.
Frame 0: splat worker 15/16 finished after 3525 local triangles.
Frame 0: splat worker 8/16 finished after 8466 local triangles.
Frame 0: splat worker 14/16 finished after 6755 local triangles.
Frame 0: splat worker 3/16 finished after 7436 local triangles.
Frame 0: splat worker 1/16 finished after 9593 local triangles.
Frame 0: splat worker 5/16 finished after 8031 local triangles.
Frame 0: splat worker 11/16 finished after 11275 local triangles.
Frame 0: splat worker 2/16 finished after 8050 local triangles.
Frame 0: splat worker 13/16 finished after 13527 local triangles.
Frame 0: splat worker 9/16 finished after 10796 local triangles.
Frame 0: splat worker 12/16 finished after 9604 local triangles.
Frame 0: splat worker 7/16 finished after 6246 local triangles.
Frame 0: splat worker 4/16 finished after 8025 local triangles.
Frame 0: splat worker 6/16 finished after 3431 local triangles.
Frame 0: splat worker 16/16 finished after 8447 local triangles.
HIP producers: 16 workers; summed generation 0.218 s, submission/fallback 0.205 s; wall 0.066 s
Frame 0: catalog splatting finished in 0.1 s; writing image...
Rendered 12765 images from 8192 catalog stars to /tmp/gr-hip-final-indexed.png (ok; imported lens map)
PSF splats: cached 12765, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
HIP PSF: 12765 events in 15 batches (15 timed); upload 0.000218 s, kernel 0.028882 s, download 0.023217 s
OMP_NUM_THREADS=16 timeout --kill-after=5s 60s --all-sky-catalog 4 1e-8 11.10s user 0.26s system 940% cpu 1.208 total
@@ -0,0 +1,210 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.728 s
Frame 0: finding and prefetching catalog tiles...
Frame 0: catalog prefetch finished (0 candidate tiles).
Frame 0: splatting 130882 lens triangles...
Frame 0: splat worker 1/16 started.
Frame 0: splat worker 3/16 started.
Frame 0: splat worker 4/16 started.
Frame 0: splat worker 9/16 started.
Frame 0: splat worker 13/16 started.
Frame 0: splat worker 2/16 started.
Frame 0: splat worker 7/16 started.
Frame 0: splat worker 14/16 started.
Frame 0: splat worker 10/16 started.
Frame 0: splat worker 15/16 started.
Frame 0: splat worker 8/16 started.
Frame 0: splat worker 12/16 started.
Frame 0: splat worker 5/16 started.
Frame 0: splat worker 11/16 started.
Frame 0: splat worker 7/16 reached 8 local triangles.
Frame 0: splat worker 1/16 reached 8 local triangles.
Frame 0: splat worker 13/16 reached 8 local triangles.
Frame 0: splat worker 3/16 reached 8 local triangles.
Frame 0: splat worker 14/16 reached 8 local triangles.
Frame 0: splat worker 8/16 reached 8 local triangles.
Frame 0: splat worker 4/16 reached 8 local triangles.
Frame 0: splat worker 15/16 reached 8 local triangles.
Frame 0: splat worker 9/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 11/16 reached 8 local triangles.
Frame 0: splat worker 16/16 started.
Frame 0: splat worker 6/16 started.
Frame 0: splat worker 12/16 reached 8 local triangles.
Frame 0: splat worker 5/16 reached 8 local triangles.
Frame 0: splat worker 7/16 reached 16 local triangles.
Frame 0: splat worker 6/16 reached 8 local triangles.
Frame 0: splat worker 13/16 reached 16 local triangles.
Frame 0: splat worker 10/16 reached 16 local triangles.
Frame 0: splat worker 4/16 reached 16 local triangles.
Frame 0: splat worker 14/16 reached 16 local triangles.
Frame 0: splat worker 1/16 reached 16 local triangles.
Frame 0: splat worker 3/16 reached 16 local triangles.
Frame 0: splat worker 15/16 reached 16 local triangles.
Frame 0: splat worker 8/16 reached 16 local triangles.
Frame 0: splat worker 9/16 reached 16 local triangles.
Frame 0: splat worker 2/16 reached 16 local triangles.
Frame 0: splat worker 12/16 reached 16 local triangles.
Frame 0: splat worker 5/16 reached 16 local triangles.
Frame 0: splat worker 16/16 reached 8 local triangles.
Frame 0: splat worker 6/16 reached 16 local triangles.
Frame 0: splat worker 16/16 reached 16 local triangles.
Frame 0: splat worker 7/16 reached 32 local triangles.
Frame 0: splat worker 6/16 reached 32 local triangles.
Frame 0: splat worker 4/16 reached 32 local triangles.
Frame 0: splat worker 13/16 reached 32 local triangles.
Frame 0: splat worker 3/16 reached 32 local triangles.
Frame 0: splat worker 10/16 reached 32 local triangles.
Frame 0: splat worker 14/16 reached 32 local triangles.
Frame 0: splat worker 12/16 reached 32 local triangles.
Frame 0: splat worker 9/16 reached 32 local triangles.
Frame 0: splat worker 1/16 reached 32 local triangles.
Frame 0: splat worker 5/16 reached 32 local triangles.
Frame 0: splat worker 8/16 reached 32 local triangles.
Frame 0: splat worker 15/16 reached 32 local triangles.
Frame 0: splat worker 2/16 reached 32 local triangles.
Frame 0: splat worker 16/16 reached 32 local triangles.
Frame 0: splat worker 6/16 reached 64 local triangles.
Frame 0: splat worker 11/16 reached 16 local triangles.
Frame 0: splat worker 10/16 reached 64 local triangles.
Frame 0: splat worker 4/16 reached 64 local triangles.
Frame 0: splat worker 8/16 reached 64 local triangles.
Frame 0: splat worker 13/16 reached 64 local triangles.
Frame 0: splat worker 7/16 reached 64 local triangles.
Frame 0: splat worker 14/16 reached 64 local triangles.
Frame 0: splat worker 2/16 reached 64 local triangles.
Frame 0: splat worker 12/16 reached 64 local triangles.
Frame 0: splat worker 9/16 reached 64 local triangles.
Frame 0: splat worker 3/16 reached 64 local triangles.
Frame 0: splat worker 5/16 reached 64 local triangles.
Frame 0: splat worker 15/16 reached 64 local triangles.
Frame 0: splat worker 1/16 reached 64 local triangles.
Frame 0: splat worker 11/16 reached 32 local triangles.
Frame 0: splat worker 6/16 reached 128 local triangles.
Frame 0: splat worker 16/16 reached 64 local triangles.
Frame 0: splat worker 8/16 reached 128 local triangles.
Frame 0: splat worker 2/16 reached 128 local triangles.
Frame 0: splat worker 10/16 reached 128 local triangles.
Frame 0: splat worker 13/16 reached 128 local triangles.
Frame 0: splat worker 15/16 reached 128 local triangles.
Frame 0: splat worker 4/16 reached 128 local triangles.
Frame 0: splat worker 14/16 reached 128 local triangles.
Frame 0: splat worker 9/16 reached 128 local triangles.
Frame 0: splat worker 5/16 reached 128 local triangles.
Frame 0: splat worker 7/16 reached 128 local triangles.
Frame 0: splat worker 1/16 reached 128 local triangles.
Frame 0: splat worker 12/16 reached 128 local triangles.
Frame 0: splat worker 3/16 reached 128 local triangles.
Frame 0: splat worker 11/16 reached 64 local triangles.
Frame 0: splat worker 6/16 reached 256 local triangles.
Frame 0: splat worker 16/16 reached 128 local triangles.
Frame 0: splat worker 8/16 reached 256 local triangles.
Frame 0: splat worker 13/16 reached 256 local triangles.
Frame 0: splat worker 15/16 reached 256 local triangles.
Frame 0: splat worker 5/16 reached 256 local triangles.
Frame 0: splat worker 4/16 reached 256 local triangles.
Frame 0: splat worker 1/16 reached 256 local triangles.
Frame 0: splat worker 2/16 reached 256 local triangles.
Frame 0: splat worker 14/16 reached 256 local triangles.
Frame 0: splat worker 7/16 reached 256 local triangles.
Frame 0: splat worker 12/16 reached 256 local triangles.
Frame 0: splat worker 10/16 reached 256 local triangles.
Frame 0: splat worker 3/16 reached 256 local triangles.
Frame 0: splat worker 11/16 reached 128 local triangles.
Frame 0: splat worker 9/16 reached 256 local triangles.
Frame 0: splat worker 6/16 reached 512 local triangles.
Frame 0: splat worker 15/16 reached 512 local triangles.
Frame 0: splat worker 8/16 reached 512 local triangles.
Frame 0: splat worker 13/16 reached 512 local triangles.
Frame 0: splat worker 4/16 reached 512 local triangles.
Frame 0: splat worker 12/16 reached 512 local triangles.
Frame 0: splat worker 5/16 reached 512 local triangles.
Frame 0: splat worker 16/16 reached 256 local triangles.
Frame 0: splat worker 1/16 reached 512 local triangles.
Frame 0: splat worker 2/16 reached 512 local triangles.
Frame 0: splat worker 10/16 reached 512 local triangles.
Frame 0: splat worker 14/16 reached 512 local triangles.
Frame 0: splat worker 3/16 reached 512 local triangles.
Frame 0: splat worker 9/16 reached 512 local triangles.
Frame 0: splat worker 7/16 reached 512 local triangles.
Frame 0: splat worker 11/16 reached 256 local triangles.
Frame 0: splat worker 6/16 reached 1024 local triangles.
Frame 0: splat worker 16/16 reached 512 local triangles.
Frame 0: splat worker 11/16 reached 512 local triangles.
Frame 0: splat worker 13/16 reached 1024 local triangles.
Frame 0: splat worker 15/16 reached 1024 local triangles.
Frame 0: splat worker 1/16 reached 1024 local triangles.
Frame 0: splat worker 8/16 reached 1024 local triangles.
Frame 0: splat worker 4/16 reached 1024 local triangles.
Frame 0: splat worker 5/16 reached 1024 local triangles.
Frame 0: splat worker 12/16 reached 1024 local triangles.
Frame 0: splat worker 10/16 reached 1024 local triangles.
Frame 0: splat worker 14/16 reached 1024 local triangles.
Frame 0: splat worker 2/16 reached 1024 local triangles.
Frame 0: splat worker 3/16 reached 1024 local triangles.
Frame 0: splat worker 9/16 reached 1024 local triangles.
Frame 0: splat worker 7/16 reached 1024 local triangles.
Frame 0: splat worker 16/16 reached 1024 local triangles.
Frame 0: splat worker 11/16 reached 1024 local triangles.
Frame 0: splat worker 6/16 reached 2048 local triangles.
Frame 0: splat worker 15/16 reached 2048 local triangles.
Frame 0: splat worker 13/16 reached 2048 local triangles.
Frame 0: splat worker 12/16 reached 2048 local triangles.
Frame 0: splat worker 5/16 reached 2048 local triangles.
Frame 0: splat worker 14/16 reached 2048 local triangles.
Frame 0: splat worker 1/16 reached 2048 local triangles.
Frame 0: splat worker 2/16 reached 2048 local triangles.
Frame 0: splat worker 3/16 reached 2048 local triangles.
Frame 0: splat worker 4/16 reached 2048 local triangles.
Frame 0: splat worker 9/16 reached 2048 local triangles.
Frame 0: splat worker 7/16 reached 2048 local triangles.
Frame 0: splat worker 8/16 reached 2048 local triangles.
Frame 0: splat worker 10/16 reached 2048 local triangles.
Frame 0: splat worker 16/16 reached 2048 local triangles.
Frame 0: splat worker 11/16 reached 2048 local triangles.
Frame 0: splat worker 6/16 reached 4096 local triangles.
Frame 0: splat worker 13/16 reached 4096 local triangles.
Frame 0: splat worker 15/16 reached 4096 local triangles.
Frame 0: splat worker 8/16 reached 4096 local triangles.
Frame 0: splat worker 9/16 reached 4096 local triangles.
Frame 0: splat worker 12/16 reached 4096 local triangles.
Frame 0: splat worker 5/16 reached 4096 local triangles.
Frame 0: splat worker 4/16 reached 4096 local triangles.
Frame 0: splat worker 2/16 reached 4096 local triangles.
Frame 0: splat worker 1/16 reached 4096 local triangles.
Frame 0: splat worker 10/16 reached 4096 local triangles.
Frame 0: splat worker 3/16 reached 4096 local triangles.
Frame 0: splat worker 14/16 reached 4096 local triangles.
Frame 0: splat worker 7/16 reached 4096 local triangles.
Frame 0: splat worker 16/16 reached 4096 local triangles.
Frame 0: splat worker 11/16 reached 4096 local triangles.
Frame 0: splat worker 5/16 reached 8192 local triangles.
Frame 0: splat worker 6/16 reached 8192 local triangles.
Frame 0: splat worker 15/16 reached 8192 local triangles.
Frame 0: splat worker 13/16 reached 8192 local triangles.
Frame 0: splat worker 1/16 reached 8192 local triangles.
Frame 0: splat worker 12/16 reached 8192 local triangles.
Frame 0: splat worker 9/16 reached 8192 local triangles.
Frame 0: splat worker 10/16 reached 8192 local triangles.
Frame 0: splat worker 3/16 reached 8192 local triangles.
Frame 0: splat worker 1/16 finished after 8417 local triangles.
Frame 0: splat worker 3/16 finished after 8220 local triangles.
Frame 0: splat worker 13/16 finished after 8435 local triangles.
Frame 0: splat worker 5/16 finished after 8644 local triangles.
Frame 0: splat worker 9/16 finished after 8288 local triangles.
Frame 0: splat worker 8/16 finished after 8175 local triangles.
Frame 0: splat worker 14/16 finished after 7891 local triangles.
Frame 0: splat worker 6/16 finished after 8634 local triangles.
Frame 0: splat worker 11/16 finished after 7108 local triangles.
Frame 0: splat worker 7/16 finished after 7829 local triangles.
Frame 0: splat worker 10/16 finished after 8276 local triangles.
Frame 0: splat worker 4/16 finished after 8133 local triangles.
Frame 0: splat worker 15/16 finished after 8542 local triangles.
Frame 0: splat worker 16/16 finished after 7993 local triangles.
Frame 0: splat worker 2/16 finished after 7920 local triangles.
Frame 0: splat worker 12/16 finished after 8377 local triangles.
Frame 0: catalog splatting finished in 0.6 s; writing image...
Rendered 12765 images from 8192 catalog stars to /tmp/gr-hip-final-8192.png (ok; imported lens map)
PSF splats: cached 12765, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
HIP PSF: 12765 events in 14 batches (14 timed); upload 0.000188 s, kernel 0.023472 s, download 0.025256 s
OMP_NUM_THREADS=16 timeout --kill-after=5s 60s --catalog --psf-relative-tai 18.45s user 0.19s system 1092% cpu 1.706 total
@@ -0,0 +1,210 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.674 s
Frame 0: finding and prefetching catalog tiles...
Catalog prefetch: 64440 requested, 3 newly loaded (21087 stars), 64437 unavailable in 0.033 s; 4 loader workers
Frame 0: catalog prefetch finished (64440 candidate tiles).
Frame 0: splatting 130882 lens triangles...
Frame 0: splat worker 1/16 started.
Frame 0: splat worker 9/16 started.
Frame 0: splat worker 12/16 started.
Frame 0: splat worker 13/16 started.
Frame 0: splat worker 8/16 started.
Frame 0: splat worker 8/16 reached 8 local triangles.
Frame 0: splat worker 8/16 reached 16 local triangles.
Frame 0: splat worker 6/16 started.
Frame 0: splat worker 6/16 reached 8 local triangles.
Frame 0: splat worker 6/16 reached 16 local triangles.
Frame 0: splat worker 6/16 reached 32 local triangles.
Frame 0: splat worker 6/16 reached 64 local triangles.
Frame 0: splat worker 5/16 started.
Frame 0: splat worker 5/16 reached 8 local triangles.
Frame 0: splat worker 5/16 reached 16 local triangles.
Frame 0: splat worker 5/16 reached 32 local triangles.
Frame 0: splat worker 5/16 reached 64 local triangles.
Frame 0: splat worker 5/16 reached 128 local triangles.
Frame 0: splat worker 7/16 started.
Frame 0: splat worker 1/16 reached 8 local triangles.
Frame 0: splat worker 7/16 reached 8 local triangles.
Frame 0: splat worker 16/16 started.
Frame 0: splat worker 9/16 reached 8 local triangles.
Frame 0: splat worker 15/16 started.
Frame 0: splat worker 9/16 reached 16 local triangles.
Frame 0: splat worker 14/16 started.
Frame 0: splat worker 9/16 reached 32 local triangles.
Frame 0: splat worker 14/16 reached 8 local triangles.
Frame 0: splat worker 4/16 started.
Frame 0: splat worker 9/16 reached 64 local triangles.
Frame 0: splat worker 13/16 reached 8 local triangles.
Frame 0: splat worker 2/16 started.
Frame 0: splat worker 13/16 reached 16 local triangles.
Frame 0: splat worker 2/16 reached 8 local triangles.
Frame 0: splat worker 9/16 reached 128 local triangles.
Frame 0: splat worker 2/16 reached 16 local triangles.
Frame 0: splat worker 10/16 started.
Frame 0: splat worker 1/16 reached 16 local triangles.
Frame 0: splat worker 7/16 reached 16 local triangles.
Frame 0: splat worker 3/16 started.
Frame 0: splat worker 16/16 reached 8 local triangles.
Frame 0: splat worker 11/16 started.
Frame 0: splat worker 5/16 reached 256 local triangles.
Frame 0: splat worker 14/16 reached 16 local triangles.
Frame 0: splat worker 4/16 reached 8 local triangles.
Frame 0: splat worker 15/16 reached 8 local triangles.
Frame 0: splat worker 13/16 reached 32 local triangles.
Frame 0: splat worker 6/16 reached 128 local triangles.
Frame 0: splat worker 12/16 reached 8 local triangles.
Frame 0: splat worker 16/16 reached 16 local triangles.
Frame 0: splat worker 16/16 reached 32 local triangles.
Frame 0: splat worker 11/16 reached 8 local triangles.
Frame 0: splat worker 16/16 reached 64 local triangles.
Frame 0: splat worker 4/16 reached 16 local triangles.
Frame 0: splat worker 11/16 reached 16 local triangles.
Frame 0: splat worker 4/16 reached 32 local triangles.
Frame 0: splat worker 11/16 reached 32 local triangles.
Frame 0: splat worker 14/16 reached 32 local triangles.
Frame 0: splat worker 12/16 reached 16 local triangles.
Frame 0: splat worker 10/16 reached 8 local triangles.
Frame 0: splat worker 1/16 reached 32 local triangles.
Frame 0: splat worker 4/16 reached 64 local triangles.
Frame 0: splat worker 2/16 reached 32 local triangles.
Frame 0: splat worker 16/16 reached 128 local triangles.
Frame 0: splat worker 3/16 reached 8 local triangles.
Frame 0: splat worker 7/16 reached 32 local triangles.
Frame 0: splat worker 11/16 reached 64 local triangles.
Frame 0: splat worker 14/16 reached 64 local triangles.
Frame 0: splat worker 1/16 reached 64 local triangles.
Frame 0: splat worker 15/16 reached 16 local triangles.
Frame 0: splat worker 13/16 reached 64 local triangles.
Frame 0: splat worker 12/16 reached 32 local triangles.
Frame 0: splat worker 14/16 reached 128 local triangles.
Frame 0: splat worker 4/16 reached 128 local triangles.
Frame 0: splat worker 7/16 reached 64 local triangles.
Frame 0: splat worker 15/16 reached 32 local triangles.
Frame 0: splat worker 3/16 reached 16 local triangles.
Frame 0: splat worker 3/16 reached 32 local triangles.
Frame 0: splat worker 1/16 reached 128 local triangles.
Frame 0: splat worker 3/16 reached 64 local triangles.
Frame 0: splat worker 12/16 reached 64 local triangles.
Frame 0: splat worker 9/16 reached 256 local triangles.
Frame 0: splat worker 10/16 reached 16 local triangles.
Frame 0: splat worker 15/16 reached 64 local triangles.
Frame 0: splat worker 10/16 reached 32 local triangles.
Frame 0: splat worker 3/16 reached 128 local triangles.
Frame 0: splat worker 8/16 reached 32 local triangles.
Frame 0: splat worker 2/16 reached 64 local triangles.
Frame 0: splat worker 11/16 reached 128 local triangles.
Frame 0: splat worker 10/16 reached 64 local triangles.
Frame 0: splat worker 1/16 reached 256 local triangles.
Frame 0: splat worker 12/16 reached 128 local triangles.
Frame 0: splat worker 4/16 reached 256 local triangles.
Frame 0: splat worker 8/16 reached 64 local triangles.
Frame 0: splat worker 7/16 reached 128 local triangles.
Frame 0: splat worker 16/16 reached 256 local triangles.
Frame 0: splat worker 13/16 reached 128 local triangles.
Frame 0: splat worker 3/16 reached 256 local triangles.
Frame 0: splat worker 6/16 reached 256 local triangles.
Frame 0: splat worker 13/16 reached 256 local triangles.
Frame 0: splat worker 15/16 reached 128 local triangles.
Frame 0: splat worker 2/16 reached 128 local triangles.
Frame 0: splat worker 11/16 reached 256 local triangles.
Frame 0: splat worker 7/16 reached 256 local triangles.
Frame 0: splat worker 9/16 reached 512 local triangles.
Frame 0: splat worker 5/16 reached 512 local triangles.
Frame 0: splat worker 1/16 reached 512 local triangles.
Frame 0: splat worker 10/16 reached 128 local triangles.
Frame 0: splat worker 8/16 reached 128 local triangles.
Frame 0: splat worker 14/16 reached 256 local triangles.
Frame 0: splat worker 3/16 reached 512 local triangles.
Frame 0: splat worker 10/16 reached 256 local triangles.
Frame 0: splat worker 15/16 reached 256 local triangles.
Frame 0: splat worker 12/16 reached 256 local triangles.
Frame 0: splat worker 4/16 reached 512 local triangles.
Frame 0: splat worker 2/16 reached 256 local triangles.
Frame 0: splat worker 6/16 reached 512 local triangles.
Frame 0: splat worker 11/16 reached 512 local triangles.
Frame 0: splat worker 16/16 reached 512 local triangles.
Frame 0: splat worker 14/16 reached 512 local triangles.
Frame 0: splat worker 12/16 reached 512 local triangles.
Frame 0: splat worker 8/16 reached 256 local triangles.
Frame 0: splat worker 10/16 reached 512 local triangles.
Frame 0: splat worker 3/16 reached 1024 local triangles.
Frame 0: splat worker 15/16 reached 512 local triangles.
Frame 0: splat worker 7/16 reached 512 local triangles.
Frame 0: splat worker 13/16 reached 512 local triangles.
Frame 0: splat worker 5/16 reached 1024 local triangles.
Frame 0: splat worker 9/16 reached 1024 local triangles.
Frame 0: splat worker 4/16 reached 1024 local triangles.
Frame 0: splat worker 1/16 reached 1024 local triangles.
Frame 0: splat worker 2/16 reached 512 local triangles.
Frame 0: splat worker 16/16 reached 1024 local triangles.
Frame 0: splat worker 6/16 reached 1024 local triangles.
Frame 0: splat worker 11/16 reached 1024 local triangles.
Frame 0: splat worker 15/16 reached 1024 local triangles.
Frame 0: splat worker 8/16 reached 512 local triangles.
Frame 0: splat worker 14/16 reached 1024 local triangles.
Frame 0: splat worker 12/16 reached 1024 local triangles.
Frame 0: splat worker 3/16 reached 2048 local triangles.
Frame 0: splat worker 10/16 reached 1024 local triangles.
Frame 0: splat worker 7/16 reached 1024 local triangles.
Frame 0: splat worker 2/16 reached 1024 local triangles.
Frame 0: splat worker 5/16 reached 2048 local triangles.
Frame 0: splat worker 16/16 reached 2048 local triangles.
Frame 0: splat worker 4/16 reached 2048 local triangles.
Frame 0: splat worker 11/16 reached 2048 local triangles.
Frame 0: splat worker 6/16 reached 2048 local triangles.
Frame 0: splat worker 14/16 reached 2048 local triangles.
Frame 0: splat worker 3/16 reached 4096 local triangles.
Frame 0: splat worker 12/16 reached 2048 local triangles.
Frame 0: splat worker 8/16 reached 1024 local triangles.
Frame 0: splat worker 15/16 reached 2048 local triangles.
Frame 0: splat worker 9/16 reached 2048 local triangles.
Frame 0: splat worker 10/16 reached 2048 local triangles.
Frame 0: splat worker 2/16 reached 2048 local triangles.
Frame 0: splat worker 13/16 reached 1024 local triangles.
Frame 0: splat worker 1/16 reached 2048 local triangles.
Frame 0: splat worker 15/16 reached 4096 local triangles.
Frame 0: splat worker 5/16 reached 4096 local triangles.
Frame 0: splat worker 4/16 reached 4096 local triangles.
Frame 0: splat worker 6/16 reached 4096 local triangles.
Frame 0: splat worker 7/16 reached 2048 local triangles.
Frame 0: splat worker 11/16 reached 4096 local triangles.
Frame 0: splat worker 16/16 reached 4096 local triangles.
Frame 0: splat worker 3/16 reached 8192 local triangles.
Frame 0: splat worker 12/16 reached 4096 local triangles.
Frame 0: splat worker 14/16 reached 4096 local triangles.
Frame 0: splat worker 2/16 reached 4096 local triangles.
Frame 0: splat worker 13/16 reached 2048 local triangles.
Frame 0: splat worker 10/16 reached 4096 local triangles.
Frame 0: splat worker 8/16 reached 2048 local triangles.
Frame 0: splat worker 9/16 reached 4096 local triangles.
Frame 0: splat worker 1/16 reached 4096 local triangles.
Frame 0: splat worker 7/16 reached 4096 local triangles.
Frame 0: splat worker 15/16 reached 8192 local triangles.
Frame 0: splat worker 4/16 reached 8192 local triangles.
Frame 0: splat worker 10/16 reached 8192 local triangles.
Frame 0: splat worker 2/16 reached 8192 local triangles.
Frame 0: splat worker 8/16 reached 4096 local triangles.
Frame 0: splat worker 13/16 reached 4096 local triangles.
Frame 0: splat worker 11/16 reached 8192 local triangles.
Frame 0: splat worker 16/16 reached 8192 local triangles.
Frame 0: splat worker 1/16 finished after 7660 local triangles.
Frame 0: splat worker 10/16 finished after 9346 local triangles.
Frame 0: splat worker 4/16 finished after 9445 local triangles.
Frame 0: splat worker 13/16 finished after 4644 local triangles.
Frame 0: splat worker 11/16 finished after 8415 local triangles.
Frame 0: splat worker 12/16 finished after 7133 local triangles.
Frame 0: splat worker 14/16 finished after 7809 local triangles.
Frame 0: splat worker 16/16 finished after 8215 local triangles.
Frame 0: splat worker 15/16 finished after 10883 local triangles.
Frame 0: splat worker 9/16 finished after 6522 local triangles.
Frame 0: splat worker 5/16 finished after 8082 local triangles.
Frame 0: splat worker 7/16 finished after 6345 local triangles.
Frame 0: splat worker 2/16 finished after 8812 local triangles.
Frame 0: splat worker 3/16 finished after 14980 local triangles.
Frame 0: splat worker 6/16 finished after 7718 local triangles.
Frame 0: splat worker 8/16 finished after 4873 local triangles.
HIP producers: 16 workers; summed generation 2.053 s, submission/fallback 1.157 s; wall 0.326 s
Frame 0: catalog splatting finished in 0.4 s; writing image...
Rendered 156837 images from 21087 catalog stars to /tmp/gr-hip-final-multi.png (ok; imported lens map)
PSF splats: cached 156837, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
HIP PSF: 156837 events in 16 batches (16 timed); upload 0.000565 s, kernel 0.168641 s, download 0.027545 s
OMP_NUM_THREADS=16 timeout --kill-after=5s 60s --all-sky-catalog 4 1e-8 13.75s user 0.26s system 941% cpu 1.487 total
@@ -0,0 +1,3 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.671 s
device=AMD Radeon RX 9070 arch=gfx1201 events=65536 spread=16 frame=3840x2160 event_bytes=56 CPU_reference=0.842402 s
HIP create=0.031723 replay_wall=0.083762 upload=0.000203 kernel=0.078268 download=0.005152 batches=4 timed=4 max_abs=1.7053025658242404e-13 max_rel=3.3472443502765663e-15 flux_rel=-1.3316774058238102e-17
@@ -0,0 +1,13 @@
RUN ['/home/wyj/Code/C/GR_4d_raytracing/build/Release/minkowski_sky', '--catalog', '/home/wyj/Code/C/GR_4d_raytracing/tests/data/hip_psf_mixed_catalog.csv', '--width', '96', '--height', '64', '--fov-deg', '30', '--look-ra-deg', '2', '--look-dec-deg', '1', '--coarse-cell-pixels', '16', '--refine-max-level', '0', '--exposure', '2', '--psf-fwhm-pixels', '2.7', '--psf-moffat-beta', '4.5', '--psf-relative-tail', '1e-8', '--max-cache-psf-flux', '1', '--psf-min-y', '0', '--hdr-output', '--output', '/tmp/gr-hip-renderer-test-z25me3rh/cpu-0.png']
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 1.641 s
Rendered 3 images from 3 catalog stars to /tmp/gr-hip-renderer-test-z25me3rh/cpu-0.png (ok)
PSF splats: cached 3, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0
Traceback (most recent call last):
File "/home/wyj/Code/C/GR_4d_raytracing/tests/test_hip_renderer.py", line 61, in <module>
main()
~~~~^^
File "/home/wyj/Code/C/GR_4d_raytracing/tests/test_hip_renderer.py", line 47, in main
assert (stats[0], stats[2], stats[3]) == expected, stats
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: (3, 0, 0, 0)
@@ -0,0 +1,9 @@
gr-hip-baseline-8192 gr-hip-final-8192 shape (3840, 2160, 3) samples 24883200 HDR_payload_exact True candidate_payload_sha256 423da7b025bf4815a5044e5d81c2f2330138cb8536b8058c19c9cba2d50f2f65
PNG_exact True
gr-hip-baseline-indexed gr-hip-final-indexed shape (3840, 2160, 3) samples 24883200 HDR_payload_exact True candidate_payload_sha256 423da7b025bf4815a5044e5d81c2f2330138cb8536b8058c19c9cba2d50f2f65
PNG_exact True
gr-hip-baseline-multi gr-hip-final-multi shape (3840, 2160, 3) samples 24883200 HDR_payload_exact True candidate_payload_sha256 a935becded15185af9e680aee9923ba51ecfee451a6bba34634a7e8be9a22ab8
PNG_exact True
gr-cpu-multi gr-hip-final-multi shape (3840, 2160, 3) samples 24883200 HDR_payload_exact True candidate_payload_sha256 a935becded15185af9e680aee9923ba51ecfee451a6bba34634a7e8be9a22ab8
PNG_exact True
clean baseline vs final: HDR_payload_exact True
@@ -0,0 +1,3 @@
tile_ra252_dec048.csv source_stars 54160 sampled 8192 source_sha256 6ece2dc86b09709f3292a9d20f49d04cb53d520bd1b7d949f3a81306229ab48d sample_sha256 7c5516ff9ae92d0cfc8acfd67f578139a1ea2d3e2ca260cf9a382c38730d5095
tile_ra262_dec060.csv source_stars 76933 sampled 8192 source_sha256 9cc74db30205fe63fe8feb5581abc892efad44a079499f9185c2b162861b0bd7 sample_sha256 f6c9b4b0db950a660102497376778981322ce95187b1311ae515070fd6a5b88f
tile_ra082_dec090.csv source_stars 4703 sampled 4703 source_sha256 36f0713ac3c3d7cd849b5886a40228d1c535864e390cc5c055c80534aeef7b65 sample_sha256 36f0713ac3c3d7cd849b5886a40228d1c535864e390cc5c055c80534aeef7b65
@@ -0,0 +1,31 @@
{
"base_commit": "265d7b95d5b916ec4768d174d73ad963a43f0088",
"optimized_source": "uncommitted worktree changes",
"compiler": "HIP version: 7.2.53210-9999\nclang version 22.1.8\nTarget: x86_64-pc-linux-gnu\nThread model: posix\nInstalledDir: /usr/lib/llvm/22/bin\nConfiguration file: /etc/clang/22/x86_64-pc-linux-gnu-clang++.cfg",
"hip_config_version": "7.2.53210-9999",
"kernel": "Linux 6.18.41-gentoo",
"cpu": [
"CPU(s): 16",
"Model name: 12th Gen Intel(R) Core(TM) i7-12700K",
"Thread(s) per core: 2",
"Core(s) per socket: 8",
"NUMA node0 CPU(s): 0-15"
],
"OMP_NUM_THREADS": 16,
"catalog_workers": 4,
"hip_flags": "--offload-arch=gfx1201 -std=c++17 -O2 -Wall -Wextra -Wpedantic",
"cpu_flags": "-std=c11 -march=native -pipe -Wall -Wextra -Wpedantic -O2 -DNDEBUG -fopenmp",
"event_bytes": 56,
"event_capacity": 16384,
"device_staging_slots": 2,
"sha256": {
"src/frame.c": "338d24eaa89d2d4c1e5a7f34d08ca827db13bb79ac3a6caeb155a731390ab023",
"src/hip_psf.hip": "b93fed04034a97e1eb25f3fc234da995287bf0c3fcde50609f95b0b3f4052a75",
"src/hip_psf.h": "00502f3d95c30d4c3d346e49dcf0e3cb846b5d461c2bfd5b3f24c7257791fad0",
"tests/benchmark_hip_psf.hip": "56cccf515b66762acb824556681c9f6986c0ffe3e3346eeadac23bc6d5926aa4",
"build/Release/schwarzschild_sky_hip": "1c340e1d8ab008e892101b46132069255ab92eb0d200bd91b2b300a4f4dacf6e",
"/tmp/gr-schwarzschild-hip-baseline": "de945e3dc826d559e1f8218a56d24f524c06e5382c8aa43667f9ac1fe5d2d719",
"/tmp/gr-hip-baseline-src/build/Release/schwarzschild_sky_hip": "de945e3dc826d559e1f8218a56d24f524c06e5382c8aa43667f9ac1fe5d2d719",
"output/lens/schwarzschild_galactic_center_R100_45deg_16_4_4k_.grlens": "905f960aea2d276f9586c79fba545a72cf742311e9e7e18faea293835c68bf28"
}
}
@@ -0,0 +1,27 @@
#!/usr/bin/env python3
"""Recreate the bounded 2MASS samples used in this investigation."""
import hashlib
from pathlib import Path
repo = Path(__file__).resolve().parents[2]
source = repo / "assets/2mass/processed/all_sky"
multi = Path("/tmp/gr-hip-catalog-multi")
single = Path("/tmp/gr-hip-catalog-subset")
multi.mkdir(exist_ok=True)
single.mkdir(exist_ok=True)
for name in ["tile_ra252_dec048.csv", "tile_ra262_dec060.csv", "tile_ra082_dec090.csv"]:
raw = (source / name).read_bytes()
rows = raw.decode().splitlines()
n = min(8192, len(rows) - 1)
sample = ("\n".join([rows[0]] + [rows[1 + i * (len(rows) - 1) // n]
for i in range(n)]) + "\n").encode()
(multi / name).write_bytes(sample)
if name == "tile_ra252_dec048.csv":
(single / name).write_bytes(sample)
(Path(__file__).parent / "catalog_8192.csv").write_bytes(sample)
small = "\n".join([rows[0]] + [rows[1 + i * (len(rows) - 1) // 256]
for i in range(256)]) + "\n"
(Path(__file__).parent / "catalog_256.csv").write_text(small)
print(name, "source_stars", len(rows) - 1, "sampled", n,
"source_sha256", hashlib.sha256(raw).hexdigest(),
"sample_sha256", hashlib.sha256(sample).hexdigest())
@@ -0,0 +1,27 @@
RUN ['/home/wyj/Code/C/GR_4d_raytracing/build/Release/minkowski_sky', '--catalog', '/home/wyj/Code/C/GR_4d_raytracing/tests/data/hip_psf_mixed_catalog.csv', '--width', '96', '--height', '64', '--fov-deg', '30', '--look-ra-deg', '2', '--look-dec-deg', '1', '--coarse-cell-pixels', '16', '--refine-max-level', '0', '--exposure', '1000', '--psf-fwhm-pixels', '2.7', '--psf-moffat-beta', '4.5', '--psf-relative-tail', '1e-8', '--max-cache-psf-flux', '1', '--psf-min-y', '0', '--hdr-output', '--output', '/tmp/gr-hip-renderer-test-s9nk0w12/cpu-0.png']
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 1.667 s
Rendered 3 images from 3 catalog stars to /tmp/gr-hip-renderer-test-s9nk0w12/cpu-0.png (ok)
PSF splats: cached 2, cached wing-clipped 0, direct fallbacks 1, discarded below min-Y 0
RUN ['/home/wyj/Code/C/GR_4d_raytracing/build/Release/minkowski_sky_hip', '--catalog', '/home/wyj/Code/C/GR_4d_raytracing/tests/data/hip_psf_mixed_catalog.csv', '--width', '96', '--height', '64', '--fov-deg', '30', '--look-ra-deg', '2', '--look-dec-deg', '1', '--coarse-cell-pixels', '16', '--refine-max-level', '0', '--exposure', '1000', '--psf-fwhm-pixels', '2.7', '--psf-moffat-beta', '4.5', '--psf-relative-tail', '1e-8', '--max-cache-psf-flux', '1', '--psf-min-y', '0', '--hdr-output', '--output', '/tmp/gr-hip-renderer-test-s9nk0w12/hip-0.png']
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 1.700 s
HIP producers: 4 workers; summed generation 0.000 s, submission/fallback 0.020 s; wall 0.007 s
Rendered 3 images from 3 catalog stars to /tmp/gr-hip-renderer-test-s9nk0w12/hip-0.png (ok)
PSF splats: cached 2, cached wing-clipped 0, direct fallbacks 1, discarded below min-Y 0
HIP PSF: 2 events in 2 batches (2 timed); upload 0.000029 s, kernel 0.000887 s, download 0.000107 s
min_y=0: statistics match; HDR max_abs=0.0; exact=True
RUN ['/home/wyj/Code/C/GR_4d_raytracing/build/Release/minkowski_sky', '--catalog', '/home/wyj/Code/C/GR_4d_raytracing/tests/data/hip_psf_mixed_catalog.csv', '--width', '96', '--height', '64', '--fov-deg', '30', '--look-ra-deg', '2', '--look-dec-deg', '1', '--coarse-cell-pixels', '16', '--refine-max-level', '0', '--exposure', '1000', '--psf-fwhm-pixels', '2.7', '--psf-moffat-beta', '4.5', '--psf-relative-tail', '1e-8', '--max-cache-psf-flux', '1', '--psf-min-y', '1e30', '--hdr-output', '--output', '/tmp/gr-hip-renderer-test-s9nk0w12/cpu-1e30.png']
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 1.655 s
Rendered 3 images from 3 catalog stars to /tmp/gr-hip-renderer-test-s9nk0w12/cpu-1e30.png (ok)
PSF splats: cached 0, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 3
Warning: --psf-min-y discarded one or more PSF events.
RUN ['/home/wyj/Code/C/GR_4d_raytracing/build/Release/minkowski_sky_hip', '--catalog', '/home/wyj/Code/C/GR_4d_raytracing/tests/data/hip_psf_mixed_catalog.csv', '--width', '96', '--height', '64', '--fov-deg', '30', '--look-ra-deg', '2', '--look-dec-deg', '1', '--coarse-cell-pixels', '16', '--refine-max-level', '0', '--exposure', '1000', '--psf-fwhm-pixels', '2.7', '--psf-moffat-beta', '4.5', '--psf-relative-tail', '1e-8', '--max-cache-psf-flux', '1', '--psf-min-y', '1e30', '--hdr-output', '--output', '/tmp/gr-hip-renderer-test-s9nk0w12/hip-1e30.png']
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 1.664 s
HIP producers: 4 workers; summed generation 0.000 s, submission/fallback 0.000 s; wall 0.002 s
Rendered 3 images from 3 catalog stars to /tmp/gr-hip-renderer-test-s9nk0w12/hip-1e30.png (ok)
PSF splats: cached 0, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 3
Warning: --psf-min-y discarded one or more PSF events.
min_y=1e30: statistics match; HDR max_abs=0.0; exact=True
@@ -0,0 +1 @@
HIP PSF cache comparison: max_abs=2.8421709430404007e-14 max_rel=7.5319184269262976e-16
@@ -0,0 +1 @@
HIP PSF cache comparison: max_abs=2.8421709430404007e-14 max_rel=7.5319184269262976e-16
@@ -0,0 +1,3 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.691 s
device=AMD Radeon RX 9070 arch=gfx1201 events=4096 spread=16 frame=3840x2160 event_bytes=56 CPU_reference=0.051886 s
HIP create=0.023212 replay_wall=0.010834 upload=0.000021 kernel=0.005702 download=0.004809 batches=1 timed=1 max_abs=7.9936057773011271e-15 max_rel=2.9244848757288279e-15 flux_rel=3.55416413758235e-17
@@ -0,0 +1,3 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.671 s
device=AMD Radeon RX 9070 arch=gfx1201 events=16384 spread=1 frame=3840x2160 event_bytes=56 CPU_reference=0.208507 s
HIP create=0.024260 replay_wall=0.029202 upload=0.000050 kernel=0.023976 download=0.004869 batches=1 timed=1 max_abs=5.1159076974727213e-13 max_rel=4.4106699745012541e-15 flux_rel=3.1370299104282862e-18
@@ -0,0 +1,3 @@
PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.703 s
device=AMD Radeon RX 9070 arch=gfx1201 events=16384 spread=3840 frame=3840x2160 event_bytes=56 CPU_reference=0.422135 s
HIP create=0.025980 replay_wall=0.026740 upload=0.000047 kernel=0.021492 download=0.004899 batches=1 timed=1 max_abs=2.7755575615628914e-17 max_rel=5.6947355265748357e-16 flux_rel=4.0906184864912441e-20
+35
View File
@@ -89,6 +89,41 @@ mapping remain on the CPU. PSFs requiring direct evaluation retain the CPU
reference path with ordered HDR transfers. HIP initialization or execution
errors terminate the render instead of silently selecting the CPU backend.
HIP catalog mapping uses OpenMP producers (`OMP_NUM_THREADS`) with one private
16,384-event chunk per worker. A shared GPU sink owns one double HDR image and
PSF cache, plus two pinned upload slots protected by completion events. Each
PSF uses a group of 32 threads to visit adjacent pixels; weights, support and
HDR precision remain unchanged. CPU direct fallbacks exclude other submissions
through the complete download/evaluate/upload boundary.
Every batch contributes to the final HIP timings. Long submissions print
progress about every five seconds (completed counts cover reclaimed slots).
The producer summary reports **summed worker wall time** in generation and
submission/fallback, including lock/device waits in the latter; these overlapping
times must not be added to GPU timings or interpreted as process CPU time.
The two upload slots bound staging memory and allow CPU production ahead of GPU
completion; copies and kernels still execute in order on one stream.
With both Minkowski binaries built using `ENABLE_HDR=1`,
`python3 tests/test_hip_renderer.py build/Release/minkowski_sky build/Release/minkowski_sky_hip`
runs small CPU/HIP fallback and min-Y comparisons sequentially. Each renderer
subprocess has a 30-second timeout.
For a bounded production-cache benchmark, build and then run **one process at
a time**, with a timeout:
```sh
make PSF_BACKEND=hip SPACETIME=minkowski hip-psf-bench
./build/Release/benchmark_hip_psf --help
OMP_NUM_THREADS=16 timeout --kill-after=5s 45s ./build/Release/benchmark_hip_psf 4096 16
```
Arguments are event count (default 4096, maximum 65536) and screen spread in
pixels (default 16, maximum 3840). The benchmark runs a serial CPU HDR reference
before HIP and checks double values. See the [bounded investigation and original
logs](benchmarks/hip_psf_2026-09-07.md); its speedups do not establish a full-sky
render time.
## Rebuilding and checks
Build type, spacetime, HDR, and PSF backend configurations have separate object
+15
View File
@@ -1,5 +1,20 @@
# GPU PSF 累积计划
## 2026-09-07 更新
有界实测后,production HIP 已改为 32-thread/event 协作 kernel,并恢复 OpenMP
catalog/inverse-map/颜色计算。每个 worker 拥有一个 16,384-event 私有块,共享的
GPU sink 只在批量提交和完整 CPU direct-fallback 边界加锁,保留单份 cache/HDR。
两个 pinned host/device slot 通过 kernel completion event 控制复用;所有 batch
均计时,长任务会周期报告已提交与已回收的完成事件数。详细结果、限制、重现命令及
原始输出见 [有界排查记录](benchmarks/hip_psf_2026-09-07.md)。
三种受控事件分布支持协作 kernel 的收益;真实三 tile 子集也改善了端到端耗时。
没有据此把全部 kernel 时间归因为 atomic contention,未引入 tile-local reduction、
float HDR 或黑体近似。下面第 7 节的 2026-09-05 状态是历史基线,单线程 producer
和前 64 批计时限制已被此次实现取代。实际 `PsfCachedEvent` 为 56 B,16,384 项为
896 KiB;早期按 24–32 B 估算的整帧内存不是当前结构的实际成本。
## 1. 目的与边界
本文件规划的是**最终点源 PSF 到 HDR framebuffer 的累积**加速,而不是 GPU
+19
View File
@@ -958,6 +958,25 @@ while (!queue_empty()) {
---
## 22.3 可选 HIP PSF 后端
CPU reference 验证后,HIP 只替换最终 PSF 累积;catalog/source-triangle 查询、
inverse mapping、频移和黑体积分仍由 OpenMP worker 按 triangle 粗粒度并行完成。
每 worker 独占最多 16,384 项的 event chunk,不创建 per-star task。GPU sink 独占
一份 immutable cache 和 double RGB HDR;仅在 chunk 提交和 direct fallback 边界
使用共享锁。direct fallback 的完成 GPU 工作、下载、CPU 累积、上传必须在同一锁内。
每个 PSF 用 32 个线程协作访问相邻像素,仍使用原来的四点 phase cache 插值、圆形
support 和 double atomic 累积。两个 pinned host/device staging slot 只有在先前
kernel 完成后才能复用;所有 GPU 工作保持单 stream 顺序,不要求整个帧事件驻留内存。
计时 event 随 slot 复用,覆盖所有 batch,不再只测前 64 批。
以上参数由 [RX 9070 有界实验](benchmarks/hip_psf_2026-09-07.md) 支持,尚不是跨设备
最优值。该实验未运行完整全天渲染,不能用缩小样本直接宣称整帧加速比。分桶规约、
降低 HDR 精度或近似黑体积分均未作为此次优化的一部分。
---
# 23. Metric evaluator 的 thread-local workspace
nmesh 单点查询需要:
+133 -22
View File
@@ -133,6 +133,9 @@ typedef struct {
const PsfKernelCache *cache;
#ifdef PSF_BACKEND_HIP
HipPsfSink *hip;
omp_lock_t *hip_lock; /* Shared sink lock; acquired only per chunk/fallback. */
int borrowed_hip;
double submit_seconds;
char hip_message[256];
HipPsfTiming hip_timing;
#endif
@@ -176,7 +179,7 @@ static int psf_event_sink_init(PsfEventSink *sink, double *hdr, int width,
return 0;
}
static int psf_event_sink_flush(PsfEventSink *sink) {
static int psf_event_sink_flush_unlocked(PsfEventSink *sink) {
if (sink->failed)
return -1;
#ifdef PSF_BACKEND_HIP
@@ -197,8 +200,27 @@ static int psf_event_sink_flush(PsfEventSink *sink) {
return 0;
}
static int psf_event_sink_flush(PsfEventSink *sink) {
#ifdef PSF_BACKEND_HIP
const double start = omp_get_wtime();
if (sink->hip_lock) omp_set_lock(sink->hip_lock);
#endif
const int result = psf_event_sink_flush_unlocked(sink);
#ifdef PSF_BACKEND_HIP
if (sink->hip_lock) omp_unset_lock(sink->hip_lock);
sink->submit_seconds += omp_get_wtime() - start;
#endif
return result;
}
/* A borrowed sink calls this only while holding hip_lock across the entire
* download -> CPU fallback -> upload transaction. */
static int psf_event_sink_finish_for_cpu(PsfEventSink *sink) {
#ifdef PSF_BACKEND_HIP
if (psf_event_sink_flush_unlocked(sink))
#else
if (psf_event_sink_flush(sink))
#endif
return -1;
#ifdef PSF_BACKEND_HIP
if (sink->hip != NULL && hip_psf_sink_finish(sink->hip, sink->hdr,
@@ -226,6 +248,13 @@ static int psf_event_sink_resume_gpu(PsfEventSink *sink) {
}
static int psf_event_sink_destroy(PsfEventSink *sink) {
#ifdef PSF_BACKEND_HIP
if (sink->borrowed_hip) {
const int result = psf_event_sink_flush(sink);
free(sink->events);
return result;
}
#endif
int result = psf_event_sink_finish_for_cpu(sink);
#ifdef PSF_BACKEND_HIP
if (sink->hip != NULL && hip_psf_sink_get_timing(sink->hip, &sink->hip_timing)) {
@@ -238,7 +267,7 @@ static int psf_event_sink_destroy(PsfEventSink *sink) {
return result;
}
#if FRAME_PSF_EVENT_SINK
#if FRAME_PSF_EVENT_SINK || defined(PSF_BACKEND_HIP)
static void psf_event_sink_emit(PsfEventSink *sink, const PsfCachedEvent *event) {
if (sink->failed)
return;
@@ -1086,16 +1115,27 @@ static int splat_catalog_tile(const Star *stars, size_t count,
&event, image_x, image_y, color, flux, context->psf, context->psf_cache,
context->max_cache_psf_flux, context->psf_relative_tail, context->psf_min_y);
if (direct_fallback == 1) {
/* A direct fallback forms an explicit ordered CPU/GPU boundary. */
if (psf_event_sink_finish_for_cpu(context->event_sink))
return -1;
splat_moffat_direct(context->hdr, context->width, context->height, image_x,
image_y, color, flux, context->psf,
context->psf_relative_tail, context->psf_min_y);
if (psf_event_sink_resume_gpu(context->event_sink))
return -1;
/* Exclude every other submit and fallback until HDR is back on device. */
#ifdef PSF_BACKEND_HIP
const double submit_start = omp_get_wtime();
if (context->event_sink->hip_lock)
omp_set_lock(context->event_sink->hip_lock);
#endif
int failed = psf_event_sink_finish_for_cpu(context->event_sink);
if (!failed) {
splat_moffat_direct(context->hdr, context->width, context->height, image_x,
image_y, color, flux, context->psf,
context->psf_relative_tail, context->psf_min_y);
failed = psf_event_sink_resume_gpu(context->event_sink);
}
#ifdef PSF_BACKEND_HIP
if (context->event_sink->hip_lock)
omp_unset_lock(context->event_sink->hip_lock);
context->event_sink->submit_seconds += omp_get_wtime() - submit_start;
#endif
if (failed) return -1;
} else if (direct_fallback != 3) {
#if FRAME_PSF_EVENT_SINK
#if FRAME_PSF_EVENT_SINK || defined(PSF_BACKEND_HIP)
psf_event_sink_emit(context->event_sink, &event);
#else
splat_prepared_cached_event(context->hdr, context->width, context->height,
@@ -1261,20 +1301,91 @@ size_t frame_splat_catalog(const FrameLensMesh *mesh,
mesh->triangle_count);
#ifdef PSF_BACKEND_HIP
/* A single GPU HDR framebuffer owns all cached events. Keep catalog/lens
* work serial for this first direct-atomic integration; the CPU parallel
* private-HDR path remains the PSF_BACKEND=cpu implementation. */
const CatalogSplatStats hip_stats = splat_catalog_triangles(
mesh, catalog, hdr, width, height, exposure, psf, psf_cache,
max_magnification, max_cache_psf_flux, psf_relative_tail, psf_min_y,
0, mesh->triangle_count, NULL);
copy_psf_splat_stats(psf_stats, hip_stats);
if (hip_stats.failed)
return SIZE_MAX;
/* CPU workers own only bounded event chunks. A single device cache/HDR is
* borrowed under a coarse submission lock, never duplicated per worker. */
PsfEventSink owner;
if (psf_event_sink_init(&owner, hdr, width, height, psf_cache)) return SIZE_MAX;
omp_lock_t submit_lock;
omp_init_lock(&submit_lock);
size_t hip_images = 0, hip_direct = 0, hip_clipped = 0, hip_discarded = 0;
int hip_failed = 0, hip_workers = 0;
double hip_generate_seconds = 0.0, hip_submit_seconds = 0.0;
const double hip_start = omp_get_wtime();
#ifdef GR_DEBUG
double hip_max_magnification = 0.0;
size_t hip_clamped = 0;
#pragma omp parallel reduction(+ : hip_images, hip_direct, hip_clipped, hip_discarded, hip_clamped, hip_generate_seconds, hip_submit_seconds) reduction(max : hip_failed, hip_max_magnification)
#else
#pragma omp parallel reduction(+ : hip_images, hip_direct, hip_clipped, hip_discarded, hip_generate_seconds, hip_submit_seconds) reduction(max : hip_failed)
#endif
{
const double worker_start = omp_get_wtime();
#pragma omp single
hip_workers = omp_get_num_threads();
PsfEventSink local = {.hdr = hdr, .width = width, .height = height,
.cache = psf_cache, .hip = owner.hip, .hip_lock = &submit_lock,
.borrowed_hip = 1};
local.events = malloc(PSF_EVENT_SINK_CAPACITY * sizeof *local.events);
if (!local.events) {
snprintf(local.hip_message, sizeof local.hip_message, "worker event allocation failed");
psf_event_sink_mark_failed(&local, "producer initialization");
}
const size_t worker = (size_t)omp_get_thread_num();
const size_t workers = (size_t)omp_get_num_threads();
size_t completed = 0, next_report = 8;
if (progress && progress->worker_callback)
progress->worker_callback(progress->context, worker, workers, 0, 0);
#pragma omp for schedule(dynamic, 1) nowait
for (size_t t = 0; t < mesh->triangle_count; ++t) {
if (local.failed) continue;
const CatalogSplatStats stats = splat_catalog_triangles(
mesh, catalog, hdr, width, height, exposure, psf, psf_cache,
max_magnification, max_cache_psf_flux, psf_relative_tail, psf_min_y,
t, t + 1, &local);
hip_images += stats.images;
hip_direct += stats.direct_fallbacks;
hip_clipped += stats.cached_wing_clipped;
hip_discarded += stats.discarded_below_min_y;
hip_failed |= stats.failed;
#ifdef GR_DEBUG
hip_max_magnification = fmax(hip_max_magnification, stats.max_raw_magnification);
hip_clamped += stats.magnification_clamped_triangles;
#endif
++completed;
if (progress && progress->worker_callback && completed == next_report) {
progress->worker_callback(progress->context, worker, workers, completed, 0);
if (next_report <= SIZE_MAX / 2) next_report *= 2;
}
}
if (psf_event_sink_destroy(&local)) hip_failed = 1;
hip_submit_seconds += local.submit_seconds;
hip_generate_seconds += omp_get_wtime() - worker_start - local.submit_seconds;
if (progress && progress->worker_callback)
progress->worker_callback(progress->context, worker, workers, completed, 1);
}
omp_destroy_lock(&submit_lock);
if (psf_event_sink_destroy(&owner)) hip_failed = 1;
fprintf(stderr, "HIP producers: %d workers; summed generation %.3f s, submission/fallback %.3f s; wall %.3f s\n",
hip_workers, hip_generate_seconds, hip_submit_seconds, omp_get_wtime() - hip_start);
copy_psf_splat_stats(psf_stats, (CatalogSplatStats){
.images = hip_images, .direct_fallbacks = hip_direct,
.cached_wing_clipped = hip_clipped, .discarded_below_min_y = hip_discarded,
.gpu_event_count = owner.hip_timing.event_count,
.gpu_batch_count = owner.hip_timing.batch_count,
.gpu_timed_batch_count = owner.hip_timing.timed_batch_count,
.gpu_upload_seconds = owner.hip_timing.upload_seconds,
.gpu_kernel_seconds = owner.hip_timing.kernel_seconds,
.gpu_download_seconds = owner.hip_timing.download_seconds,
#ifdef GR_DEBUG
.max_raw_magnification = hip_max_magnification,
.magnification_clamped_triangles = hip_clamped,
#endif
});
if (hip_failed) return SIZE_MAX;
if (progress != NULL && progress->callback != NULL)
progress->callback(progress->context, FRAME_SPLAT_PROGRESS_END,
mesh->triangle_count, mesh->triangle_count);
return hip_stats.images;
return hip_images;
#endif
const size_t pixel_count = (size_t)width * height * 3;
+6 -4
View File
@@ -32,16 +32,18 @@ int hip_psf_sink_create(HipPsfSink **sink, int width, int height,
int hip_psf_sink_load_hdr(HipPsfSink *sink, const double *hdr,
char *message, size_t message_size);
/* Queues a cached-event chunk. Direct fallbacks and min-Y discards stay with
* the caller; event_count must not exceed the creation capacity. */
/* Copies a chunk into one of two owned pinned staging slots; caller memory
* may be reused on return. Slot reuse waits for its previous kernel. Calls
* sharing a sink must be serialized by the owner. Direct fallbacks and min-Y
* discards stay with the caller; event_count must not exceed capacity. */
int hip_psf_sink_submit(HipPsfSink *sink, const PsfCachedEvent *events,
size_t event_count, char *message, size_t message_size);
/* Completes all work and overwrites hdr with double linear RGB device HDR. */
int hip_psf_sink_finish(HipPsfSink *sink, double *hdr, char *message,
size_t message_size);
/* Valid after hip_psf_sink_finish(); timings are accumulated without a
* per-batch host synchronization. */
/* Complete after finish(); otherwise includes recycled/completed slots only.
* Every batch is timed with a fixed-size reusable event pool. */
int hip_psf_sink_get_timing(const HipPsfSink *sink, HipPsfTiming *timing);
void hip_psf_sink_destroy(HipPsfSink *sink);
+103 -64
View File
@@ -5,27 +5,34 @@
#include <cmath>
#include <cstdio>
#include <limits>
#include <vector>
#include <chrono>
#include <cstring>
struct HipPsfBatchTiming {
enum { PSF_LANES_PER_EVENT = 32, PSF_THREADS_PER_BLOCK = 128 };
/* Two reusable staging slots bound host/device queue memory. A slot may be
* overwritten only after its kernel_end event completes. All API calls for a
* sink are serialized by its owner, including calls from CPU producer workers. */
struct HipPsfBatch {
PsfCachedEvent *host = nullptr, *device = nullptr;
hipEvent_t upload_start = nullptr, upload_end = nullptr;
hipEvent_t kernel_start = nullptr, kernel_end = nullptr;
size_t count = 0;
};
enum { HIP_PSF_MAX_TIMED_BATCHES = 64 };
struct HipPsfSink {
PsfCachedEvent *events = nullptr;
HipPsfBatch slots[2];
float *weights = nullptr;
double *hdr = nullptr;
hipStream_t stream = nullptr;
size_t event_capacity = 0, hdr_values = 0;
size_t completed_events = 0;
int device = 0;
int width = 0, height = 0, phase_resolution = 0, radius_pixels = 0;
double max_radius_pixels = 0.0;
hipEvent_t download_start = nullptr, download_end = nullptr;
std::vector<HipPsfBatchTiming> batches;
size_t measured_batches = 0;
HipPsfTiming timing = {};
std::chrono::steady_clock::time_point last_report = std::chrono::steady_clock::now();
};
static int report(hipError_t status, char *message, size_t message_size) {
@@ -37,13 +44,19 @@ static void ok(char *message, size_t message_size) {
if (message && message_size) std::snprintf(message, message_size, "ok");
}
static void destroy_batch_timing(HipPsfBatchTiming *timing) {
if (!timing) return;
(void)hipEventDestroy(timing->upload_start);
(void)hipEventDestroy(timing->upload_end);
(void)hipEventDestroy(timing->kernel_start);
(void)hipEventDestroy(timing->kernel_end);
*timing = {};
static int collect_batch(HipPsfSink *sink, HipPsfBatch *batch,
char *message, size_t message_size) {
if (!batch->count) return 0;
float upload_ms = 0.0f, kernel_ms = 0.0f;
if (report(hipEventSynchronize(batch->kernel_end), message, message_size) ||
report(hipEventElapsedTime(&upload_ms, batch->upload_start, batch->upload_end), message, message_size) ||
report(hipEventElapsedTime(&kernel_ms, batch->kernel_start, batch->kernel_end), message, message_size)) return -1;
sink->timing.upload_seconds += upload_ms * 1e-3;
sink->timing.kernel_seconds += kernel_ms * 1e-3;
++sink->timing.timed_batch_count;
sink->completed_events += batch->count;
batch->count = 0;
return 0;
}
__device__ static size_t weight_index(int phase_resolution, int radius_pixels,
@@ -71,7 +84,11 @@ __global__ static void splat_kernel(const PsfCachedEvent *events, size_t count,
int width, int height, const float *weights,
int phase_resolution, int radius_pixels,
double max_radius_pixels, double *hdr) {
const size_t index = (size_t)blockIdx.x * blockDim.x + threadIdx.x;
/* Consecutive lanes visit consecutive pixels of the same phase plane.
* Fixed 32-lane groups also work on wave64 devices without wave intrinsics. */
const size_t thread = (size_t)blockIdx.x * blockDim.x + threadIdx.x;
const size_t index = thread / PSF_LANES_PER_EVENT;
const int lane = thread % PSF_LANES_PER_EVENT;
if (index >= count) return;
const PsfCachedEvent event = events[index];
const int base_x = (int)floor(event.x), base_y = (int)floor(event.y);
@@ -88,7 +105,7 @@ __global__ static void splat_kernel(const PsfCachedEvent *events, size_t count,
if (!row_range(event.support_radius, fx, fy, support, offset_y, &first, &last)) continue;
if (first < -base_x) first = -base_x;
if (last >= width - base_x) last = width - base_x - 1;
for (int offset_x = first; offset_x <= last; ++offset_x) {
for (int offset_x = first + lane; offset_x <= last; offset_x += PSF_LANES_PER_EVENT) {
const int px = base_x + offset_x;
const double w00 = weights[weight_index(phase_resolution, radius_pixels, x0, y0, offset_x, offset_y)];
const double w10 = weights[weight_index(phase_resolution, radius_pixels, x1, y0, offset_x, offset_y)];
@@ -119,15 +136,18 @@ extern "C" int hip_psf_sink_create(HipPsfSink **out, int width, int height,
const PsfKernelCache *cache, size_t event_capacity,
char *message, size_t message_size) {
if (!out || width <= 0 || height <= 0 || !cache || !cache->ready || !cache->weights ||
cache->phase_resolution <= 0 || cache->radius_pixels < 0 || event_capacity == 0) {
cache->phase_resolution <= 0 || cache->radius_pixels < 0 || event_capacity == 0 ||
event_capacity > std::numeric_limits<size_t>::max() / sizeof(PsfCachedEvent)) {
if (message && message_size) std::snprintf(message, message_size, "invalid HIP PSF sink arguments");
return -1;
}
const size_t nodes = (size_t)cache->phase_resolution + 1;
const size_t side = (size_t)cache->radius_pixels * 2 + 1;
if (nodes > std::numeric_limits<size_t>::max() / nodes || nodes * nodes > std::numeric_limits<size_t>::max() / side ||
nodes * nodes * side > std::numeric_limits<size_t>::max() / side || (size_t)width > std::numeric_limits<size_t>::max() / (size_t)height ||
(size_t)width * (size_t)height > std::numeric_limits<size_t>::max() / 3) {
nodes * nodes * side > std::numeric_limits<size_t>::max() / side ||
nodes * nodes * side * side > std::numeric_limits<size_t>::max() / sizeof(float) ||
(size_t)width > std::numeric_limits<size_t>::max() / (size_t)height ||
(size_t)width * (size_t)height > std::numeric_limits<size_t>::max() / (3 * sizeof(double))) {
if (message && message_size) std::snprintf(message, message_size, "HIP PSF sink size overflow");
return -1;
}
@@ -138,16 +158,30 @@ extern "C" int hip_psf_sink_create(HipPsfSink **out, int width, int height,
sink->width = width; sink->height = height; sink->phase_resolution = cache->phase_resolution;
sink->radius_pixels = cache->radius_pixels; sink->max_radius_pixels = cache->max_radius_pixels;
const size_t weight_count = nodes * nodes * side * side;
if (report(hipStreamCreate(&sink->stream), message, message_size) ||
if (report(hipGetDevice(&sink->device), message, message_size) ||
report(hipStreamCreate(&sink->stream), message, message_size) ||
report(hipEventCreate(&sink->download_start), message, message_size) ||
report(hipEventCreate(&sink->download_end), message, message_size) ||
report(hipMalloc(&sink->events, event_capacity * sizeof *sink->events), message, message_size) ||
report(hipMalloc(&sink->weights, weight_count * sizeof *sink->weights), message, message_size) ||
report(hipMalloc(&sink->hdr, sink->hdr_values * sizeof *sink->hdr), message, message_size) ||
report(hipMemcpyAsync(sink->weights, cache->weights, weight_count * sizeof *sink->weights, hipMemcpyHostToDevice, sink->stream), message, message_size) ||
report(hipMemsetAsync(sink->hdr, 0, sink->hdr_values * sizeof *sink->hdr, sink->stream), message, message_size)) {
hip_psf_sink_destroy(sink); return -1;
}
for (HipPsfBatch &batch : sink->slots) {
if (report(hipHostMalloc(&batch.host, event_capacity * sizeof(PsfCachedEvent)), message, message_size) ||
report(hipMalloc(&batch.device, event_capacity * sizeof(PsfCachedEvent)), message, message_size) ||
report(hipEventCreate(&batch.upload_start), message, message_size) ||
report(hipEventCreate(&batch.upload_end), message, message_size) ||
report(hipEventCreate(&batch.kernel_start), message, message_size) ||
report(hipEventCreate(&batch.kernel_end), message, message_size)) {
hip_psf_sink_destroy(sink); return -1;
}
}
/* The caller may release the immutable host cache after creation. */
if (report(hipStreamSynchronize(sink->stream), message, message_size)) {
hip_psf_sink_destroy(sink); return -1;
}
*out = sink; ok(message, message_size); return 0;
}
@@ -158,37 +192,37 @@ extern "C" int hip_psf_sink_submit(HipPsfSink *sink, const PsfCachedEvent *event
return -1;
}
if (!event_count) { ok(message, message_size); return 0; }
const unsigned int threads = 128;
const size_t blocks = (event_count + threads - 1) / threads;
HipPsfBatchTiming timing;
const int timed = sink->batches.size() < HIP_PSF_MAX_TIMED_BATCHES;
if (blocks > std::numeric_limits<unsigned int>::max() ||
(timed && (report(hipEventCreate(&timing.upload_start), message, message_size) ||
report(hipEventCreate(&timing.upload_end), message, message_size) ||
report(hipEventCreate(&timing.kernel_start), message, message_size) ||
report(hipEventCreate(&timing.kernel_end), message, message_size) ||
report(hipEventRecord(timing.upload_start, sink->stream), message, message_size))) ||
report(hipMemcpyAsync(sink->events, events, event_count * sizeof *events,
hipMemcpyHostToDevice, sink->stream), message, message_size) ||
(timed && (report(hipEventRecord(timing.upload_end, sink->stream), message, message_size) ||
report(hipEventRecord(timing.kernel_start, sink->stream), message, message_size)))) {
destroy_batch_timing(&timing);
if (report(hipSetDevice(sink->device), message, message_size)) return -1;
const unsigned int threads = PSF_THREADS_PER_BLOCK;
const size_t per_block = PSF_THREADS_PER_BLOCK / PSF_LANES_PER_EVENT;
const size_t blocks = event_count / per_block + (event_count % per_block != 0);
if (blocks > std::numeric_limits<unsigned int>::max()) {
if (message && message_size) std::snprintf(message, message_size, "HIP PSF grid too large");
return -1;
}
HipPsfBatch &batch = sink->slots[sink->timing.batch_count % 2];
if (collect_batch(sink, &batch, message, message_size)) return -1;
std::memcpy(batch.host, events, event_count * sizeof *events);
if (report(hipEventRecord(batch.upload_start, sink->stream), message, message_size) ||
report(hipMemcpyAsync(batch.device, batch.host, event_count * sizeof *events,
hipMemcpyHostToDevice, sink->stream), message, message_size) ||
report(hipEventRecord(batch.upload_end, sink->stream), message, message_size) ||
report(hipEventRecord(batch.kernel_start, sink->stream), message, message_size)) return -1;
hipLaunchKernelGGL(splat_kernel, dim3((unsigned int)blocks), dim3(threads), 0, sink->stream,
sink->events, event_count, sink->width, sink->height, sink->weights,
batch.device, event_count, sink->width, sink->height, sink->weights,
sink->phase_resolution, sink->radius_pixels, sink->max_radius_pixels, sink->hdr);
if (report(hipGetLastError(), message, message_size) ||
(timed && report(hipEventRecord(timing.kernel_end, sink->stream), message, message_size))) {
destroy_batch_timing(&timing);
return -1;
}
if (timed) {
sink->batches.push_back(timing);
++sink->timing.timed_batch_count;
}
report(hipEventRecord(batch.kernel_end, sink->stream), message, message_size)) return -1;
batch.count = event_count;
++sink->timing.batch_count;
sink->timing.event_count += event_count;
const auto now = std::chrono::steady_clock::now();
if (std::chrono::duration<double>(now - sink->last_report).count() >= 5.0) {
std::fprintf(stderr, "HIP PSF progress: %zu submitted / %zu completed events; %zu / %zu batches timed; kernel %.3f s\n",
sink->timing.event_count, sink->completed_events, sink->timing.timed_batch_count,
sink->timing.batch_count, sink->timing.kernel_seconds);
sink->last_report = now;
}
ok(message, message_size); return 0;
}
@@ -198,29 +232,24 @@ extern "C" int hip_psf_sink_load_hdr(HipPsfSink *sink, const double *hdr,
if (message && message_size) std::snprintf(message, message_size, "invalid HIP PSF HDR upload");
return -1;
}
if (report(hipMemcpyAsync(sink->hdr, hdr, sink->hdr_values * sizeof *hdr,
hipMemcpyHostToDevice, sink->stream), message, message_size))
if (report(hipSetDevice(sink->device), message, message_size) ||
report(hipMemcpyAsync(sink->hdr, hdr, sink->hdr_values * sizeof *hdr,
hipMemcpyHostToDevice, sink->stream), message, message_size) ||
report(hipStreamSynchronize(sink->stream), message, message_size))
return -1;
ok(message, message_size); return 0;
}
extern "C" int hip_psf_sink_finish(HipPsfSink *sink, double *hdr, char *message, size_t message_size) {
if (!sink || !hdr) { if (message && message_size) std::snprintf(message, message_size, "invalid HIP PSF HDR download"); return -1; }
if (report(hipEventRecord(sink->download_start, sink->stream), message, message_size) ||
if (report(hipSetDevice(sink->device), message, message_size) ||
report(hipEventRecord(sink->download_start, sink->stream), message, message_size) ||
report(hipMemcpyAsync(hdr, sink->hdr, sink->hdr_values * sizeof *hdr, hipMemcpyDeviceToHost, sink->stream), message, message_size) ||
report(hipEventRecord(sink->download_end, sink->stream), message, message_size) ||
report(hipStreamSynchronize(sink->stream), message, message_size)) return -1;
float milliseconds = 0.0f;
for (size_t i = sink->measured_batches; i < sink->batches.size(); ++i) {
const HipPsfBatchTiming &batch = sink->batches[i];
if (report(hipEventElapsedTime(&milliseconds, batch.upload_start, batch.upload_end),
message, message_size)) return -1;
sink->timing.upload_seconds += milliseconds * 1e-3;
if (report(hipEventElapsedTime(&milliseconds, batch.kernel_start, batch.kernel_end),
message, message_size)) return -1;
sink->timing.kernel_seconds += milliseconds * 1e-3;
}
sink->measured_batches = sink->batches.size();
for (HipPsfBatch &batch : sink->slots)
if (collect_batch(sink, &batch, message, message_size)) return -1;
if (report(hipEventElapsedTime(&milliseconds, sink->download_start, sink->download_end),
message, message_size)) return -1;
sink->timing.download_seconds += milliseconds * 1e-3;
@@ -235,10 +264,20 @@ extern "C" int hip_psf_sink_get_timing(const HipPsfSink *sink, HipPsfTiming *tim
extern "C" void hip_psf_sink_destroy(HipPsfSink *sink) {
if (!sink) return;
for (HipPsfBatchTiming &timing : sink->batches)
destroy_batch_timing(&timing);
(void)hipEventDestroy(sink->download_start);
(void)hipEventDestroy(sink->download_end);
(void)hipFree(sink->events); (void)hipFree(sink->weights); (void)hipFree(sink->hdr);
(void)hipStreamDestroy(sink->stream); delete sink;
(void)hipSetDevice(sink->device);
if (sink->stream) (void)hipStreamSynchronize(sink->stream);
for (HipPsfBatch &batch : sink->slots) {
if (batch.upload_start) (void)hipEventDestroy(batch.upload_start);
if (batch.upload_end) (void)hipEventDestroy(batch.upload_end);
if (batch.kernel_start) (void)hipEventDestroy(batch.kernel_start);
if (batch.kernel_end) (void)hipEventDestroy(batch.kernel_end);
if (batch.host) (void)hipHostFree(batch.host);
if (batch.device) (void)hipFree(batch.device);
}
if (sink->download_start) (void)hipEventDestroy(sink->download_start);
if (sink->download_end) (void)hipEventDestroy(sink->download_end);
if (sink->weights) (void)hipFree(sink->weights);
if (sink->hdr) (void)hipFree(sink->hdr);
if (sink->stream) (void)hipStreamDestroy(sink->stream);
delete sink;
}
+96
View File
@@ -0,0 +1,96 @@
#include "hip_psf.h"
#include <hip/hip_runtime.h>
#include <omp.h>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
/* Bounded production-cache replay. One process runs CPU reference then HIP;
* no catalog loading or geodesic work. Arguments: events, spread pixels. */
int main(int argc, char **argv) {
if (argc == 2 && !std::strcmp(argv[1], "--help")) {
std::puts("Usage: benchmark_hip_psf [EVENTS [SPREAD_PIXELS]]\n"
" EVENTS Cached events, 1..65536 (default: 4096)\n"
" SPREAD_PIXELS Star-center spread, 1..3840 (default: 16)\n"
"Runs a serial CPU reference, then HIP, at 3840x2160; PSF 2.7/4.5, tail 1e-8.\n"
"Use an external timeout and run only one benchmark process at a time.");
return 0;
}
auto number = [](const char *s, long upper) {
char *end = nullptr;
const long n = std::strtol(s, &end, 10);
return s != end && !*end && n >= 1 && n <= upper ? (int)n : 0;
};
const int count = argc > 1 ? number(argv[1], 65536) : 4096;
const int spread = argc > 2 ? number(argv[2], 3840) : 16;
if (argc > 3 || !count || !spread) {
std::fputs("Invalid bounded benchmark arguments; see --help.\n", stderr);
return 2;
}
std::setvbuf(stdout, nullptr, _IOLBF, 0);
const int width = 3840, height = 2160;
const size_t values = (size_t)width * height * 3;
PsfKernelCache cache = {};
const PointSpreadFunction psf = {2.7, 4.5};
if (psf_kernel_cache_init(&cache, &psf, 1e-8)) return 1;
psf_kernel_cache_report_ready(&cache, stdout);
std::vector<PsfCachedEvent> events(count);
unsigned state = 12345;
auto uniform = [&]() { state = state * 1664525u + 1013904223u;
return (state >> 8) * (1.0 / 16777216.0); };
for (auto &event : events) {
const double x = (width - spread) * 0.5 + uniform() * spread;
const double sy = spread < height ? spread : height;
const double y = (height - sy) * 0.5 + uniform() * sy;
const LinearRgb color = {0.1 + uniform(), 0.1 + uniform(), 0.1 + uniform()};
const int result = psf_prepare_cached_event(&event, x, y, color,
0.1 + uniform(), &psf, &cache, 1e8, 1e-8, 0);
if (result != 0) return 1;
}
std::vector<double> cpu(values, 0), gpu(values, 0);
double start = omp_get_wtime();
for (const auto &event : events)
splat_prepared_cached_event(cpu.data(), width, height, &event, &cache);
const double cpu_seconds = omp_get_wtime() - start;
char message[256] = {};
hipDeviceProp_t prop;
if (hipGetDeviceProperties(&prop, 0) != hipSuccess) return 1;
std::printf("device=%s arch=%s events=%d spread=%d frame=%dx%d event_bytes=%zu CPU_reference=%.6f s\n",
prop.name, prop.gcnArchName, count, spread, width, height, sizeof(PsfCachedEvent), cpu_seconds);
HipPsfSink *sink = nullptr;
start = omp_get_wtime();
if (hip_psf_sink_create(&sink, width, height, &cache, 16384, message, sizeof message)) {
std::fprintf(stderr, "create: %s\n", message); return 1;
}
const double create_seconds = omp_get_wtime() - start;
start = omp_get_wtime();
for (size_t i = 0; i < events.size(); i += 16384) {
size_t n = events.size() - i;
if (n > 16384) n = 16384;
if (hip_psf_sink_submit(sink, events.data() + i, n, message, sizeof message)) {
std::fprintf(stderr, "submit: %s\n", message); return 1;
}
}
if (hip_psf_sink_finish(sink, gpu.data(), message, sizeof message)) {
std::fprintf(stderr, "finish: %s\n", message); return 1;
}
const double wall = omp_get_wtime() - start;
HipPsfTiming timing = {};
hip_psf_sink_get_timing(sink, &timing);
double max_abs = 0, max_rel = 0, sum = 0, diff = 0;
for (size_t i = 0; i < values; ++i) {
if (!std::isfinite(gpu[i])) return 1;
const double d = std::fabs(gpu[i] - cpu[i]);
max_abs = std::fmax(max_abs, d);
if (cpu[i] != 0) max_rel = std::fmax(max_rel, d / std::fabs(cpu[i]));
sum += cpu[i]; diff += gpu[i] - cpu[i];
}
std::printf("HIP create=%.6f replay_wall=%.6f upload=%.6f kernel=%.6f download=%.6f batches=%zu timed=%zu max_abs=%.17g max_rel=%.17g flux_rel=%.17g\n",
create_seconds, wall, timing.upload_seconds, timing.kernel_seconds, timing.download_seconds,
timing.batch_count, timing.timed_batch_count, max_abs, max_rel, diff / sum);
hip_psf_sink_destroy(sink);
psf_kernel_cache_destroy(&cache);
return max_abs < 1e-10 && max_rel < 1e-10 ? 0 : 1;
}
+32 -1
View File
@@ -57,7 +57,38 @@ int main() {
return 1;
}
double max_abs = 0.0, max_rel = 0.0;
/* Exercise both reusable slots, more than the old 64-batch timing limit,
* immediate caller-buffer reuse, edge clipping and an ordered CPU boundary. */
for (int batch = 0; batch < 70; ++batch) {
for (int j = 0; j < 3; ++j) {
events[j] = PsfCachedEvent{};
const int result = psf_prepare_cached_event(&events[j],
-4.75 + (batch * 7 + j * 13) % 75,
-3.125 + (batch * 11 + j * 5) % 58, colors[j],
batch % 7 == 0 ? 1000.0 : 0.01, &psf, &cache, 1e8, 1e-8, 0.0);
if (result != 0 && result != 2) return 1;
splat_prepared_cached_event(cpu_hdr, width, height, &events[j], &cache);
}
if (hip_psf_sink_submit(sink, events, 3, message, sizeof message)) {
std::fprintf(stderr, "streaming submit failed: %s\n", message); return 1;
}
for (auto &event : events) event = PsfCachedEvent{};
if (batch == 35) {
if (hip_psf_sink_finish(sink, gpu_hdr, message, sizeof message)) return 1;
for (double *hdr : {cpu_hdr, gpu_hdr})
splat_moffat_direct(hdr, width, height, 12.25, 20.75, colors[0],
0.2, &psf, 1e-8, 0.0);
if (hip_psf_sink_load_hdr(sink, gpu_hdr, message, sizeof message)) return 1;
}
}
if (hip_psf_sink_finish(sink, gpu_hdr, message, sizeof message) ||
hip_psf_sink_get_timing(sink, &timing) || timing.event_count != 213 ||
timing.batch_count != 71 || timing.timed_batch_count != 71) {
std::fprintf(stderr, "streaming completion/accounting failed: %s\n", message);
return 1;
}
for (size_t i = 0; i < values; ++i) {
if (!std::isfinite(cpu_hdr[i]) || !std::isfinite(gpu_hdr[i])) return 1;
const double absolute = std::fabs(cpu_hdr[i] - gpu_hdr[i]);
max_abs = std::fmax(max_abs, absolute);
if (std::fabs(cpu_hdr[i]) > 1e-30)
@@ -66,5 +97,5 @@ int main() {
std::printf("HIP PSF cache comparison: max_abs=%.17g max_rel=%.17g\n", max_abs, max_rel);
hip_psf_sink_destroy(sink);
std::free(cpu_hdr); std::free(gpu_hdr); psf_kernel_cache_destroy(&cache);
return max_abs <= 1e-12 && max_rel <= 1e-12 ? 0 : 1;
return max_abs <= 1e-10 && max_rel <= 1e-12 ? 0 : 1;
}
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env python3
"""Sequential, bounded CPU/HIP renderer checks for shared-HDR fallback safety."""
import argparse
import importlib.util
import math
import os
from pathlib import Path
import re
import struct
import subprocess
import tempfile
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("cpu", type=Path, help="Minkowski CPU executable")
parser.add_argument("hip", type=Path, help="Minkowski HIP executable")
args = parser.parse_args()
repo = Path(__file__).resolve().parents[1]
spec = importlib.util.spec_from_file_location("fits", repo / "scripts/fits_floatdiff.py")
fits = importlib.util.module_from_spec(spec)
spec.loader.exec_module(fits)
env = dict(os.environ, OMP_NUM_THREADS="4")
with tempfile.TemporaryDirectory(prefix="gr-hip-renderer-test-") as directory:
for min_y, expected in [("0", (2, 1, 0)), ("1e30", (0, 0, 3))]:
results = []
for label, binary in [("cpu", args.cpu), ("hip", args.hip)]:
output = Path(directory) / f"{label}-{min_y}.png"
command = [str(binary.resolve()), "--catalog",
str(repo / "tests/data/hip_psf_mixed_catalog.csv"),
"--width", "96", "--height", "64", "--fov-deg", "30",
"--look-ra-deg", "2", "--look-dec-deg", "1",
"--coarse-cell-pixels", "16", "--refine-max-level", "0",
"--exposure", "1000", "--psf-fwhm-pixels", "2.7",
"--psf-moffat-beta", "4.5", "--psf-relative-tail", "1e-8",
"--max-cache-psf-flux", "1", "--psf-min-y", min_y,
"--hdr-output", "--output", str(output)]
print("RUN", command, flush=True)
run = subprocess.run(command, env=env, text=True, capture_output=True, timeout=30)
print(run.stdout, run.stderr, flush=True)
run.check_returncode()
match = re.search(r"PSF splats: cached (\d+), cached wing-clipped (\d+), "
r"direct fallbacks (\d+), discarded below min-Y (\d+)",
run.stdout + run.stderr)
assert match, "missing splat accounting"
stats = tuple(map(int, match.groups()))
assert (stats[0], stats[2], stats[3]) == expected, stats
results.append((stats, fits.read_fits(output.with_name(output.stem + "_HDR.fits"))))
assert results[0][0] == results[1][0], "CPU/HIP statistics differ"
(shape, cpu), (gpu_shape, gpu) = results[0][1], results[1][1]
assert shape == gpu_shape
maximum = 0.0
for (a,), (b,) in zip(struct.iter_unpack(">f", cpu), struct.iter_unpack(">f", gpu)):
assert math.isfinite(a) and math.isfinite(b)
assert math.isclose(a, b, rel_tol=2**-23, abs_tol=0), (a, b)
maximum = max(maximum, abs(a - b))
print(f"min_y={min_y}: statistics match; HDR max_abs={maximum}; exact={cpu == gpu}", flush=True)
if __name__ == "__main__":
main()