From 2fc2b43e8d1b5a71d814f6d6ac79b2460fb94fa2 Mon Sep 17 00:00:00 2001 From: Yingjie Wang Date: Fri, 11 Sep 2026 23:28:02 -0400 Subject: [PATCH] Doc: Record production PSF chunk geometry Preserve the protected full-catalog dummy run, its initial harness failure, input and output hashes, distribution quantiles, and the resulting sparse-tile scheduling conclusions. --- .../dummy_psf_chunks_2026-09-11/README.md | 84 +++++++ .../full_catalog.log | 235 ++++++++++++++++++ .../full_catalog_missing_time.log | 6 + gpu_psf_acceleration_plan.md | 16 ++ nr_spacetime_movie_renderer_design.md | 21 ++ 5 files changed, 362 insertions(+) create mode 100644 benchmarks/dummy_psf_chunks_2026-09-11/README.md create mode 100644 benchmarks/dummy_psf_chunks_2026-09-11/full_catalog.log create mode 100644 benchmarks/dummy_psf_chunks_2026-09-11/full_catalog_missing_time.log diff --git a/benchmarks/dummy_psf_chunks_2026-09-11/README.md b/benchmarks/dummy_psf_chunks_2026-09-11/README.md new file mode 100644 index 0000000..5e3a48e --- /dev/null +++ b/benchmarks/dummy_psf_chunks_2026-09-11/README.md @@ -0,0 +1,84 @@ +# Production chunk geometry diagnostic (2026-09-11) + +## Scope + +This run measures the event stream that the production HIP sink would receive +for the supplied Schwarzschild Galactic-center render. `PSF_BACKEND=dummy` +keeps the real imported lens map, all-sky prefetch, OpenMP dynamic triangle +scheduling, inverse mapping, redshift/color/flux work, PSF cache eligibility, +and 16,384-event per-worker chunk boundaries. It does not initialize HIP, +allocate a full HDR framebuffer, splat pixels, or write PNG/FITS output. + +The run used repository revision `11e703e33dffb1ff168ba11dd922e68b448116b9` +plus the uncommitted dummy-backend work. The complete stdout/stderr, executable +and input hashes, process resource use, and protected-output hashes are in +[`full_catalog.log`](full_catalog.log). An initial harness-only failure before +the renderer started is retained as +[`full_catalog_missing_time.log`](full_catalog_missing_time.log). + +## Build and run + +```sh +make -j1 PSF_BACKEND=dummy SPACETIME=schwarzschild ENABLE_HDR=1 backend +python3 benchmarks/dummy_psf_chunks_2026-09-11/run.py +``` + +The runner fixes `OMP_NUM_THREADS=16` and `OMP_DYNAMIC=FALSE`, uses a 600-second +timeout and a process lock, refuses to overwrite its log, and hashes both the +named PNG and companion FITS before and after the run. Its renderer arguments +are exactly the user-supplied command except that the `_hip` executable is +replaced by `_dummy`; the exact expanded command is the first line of the log. + +Inputs and protected outputs: + +- lens map SHA-256: + `905f960aea2d276f9586c79fba545a72cf742311e9e7e18faea293835c68bf28` +- existing PNG SHA-256 before/after: + `3e01feb911e60acce545a6a86870ca05f96250022e874eb8097bec88a8879bfd` +- existing FITS SHA-256 before/after: + `2408e62dcc22f147da284d87af9a2b0fdd0050eda2dabc23b6ec2554b2f1d38e` + +Both protected files retained the same size and nanosecond mtime as well as the +same hash. No HIP backend was run. + +## Result + +The catalog prefetch loaded 343,363,141 stars for 130,882 lens triangles. The +producer classified 598,264,924 cache events, with zero direct fallbacks, +wing-clipped events, or min-Y discards. Sixteen workers produced 36,524 chunks: +36,508 full chunks and one final partial chunk per worker. + +| full-chunk metric | min | p10 | p25 | p50 | p75 | p90 | p99 | max | +|---|---:|---:|---:|---:|---:|---:|---:|---:| +| event-producing triangles | 1 | 1 | 1 | 2 | 3 | 10 | 31 | 59 | +| occupied 32px center tiles | 1 | 1 | 1 | 1 | 2 | 5 | 30 | 45 | +| event bbox diagonal (px) | 0.199 | 0.742 | 3.250 | 12.651 | 57.018 | 429.306 | 3759.261 | 3834.557 | +| triangle-centroid bbox diagonal (px) | 0 | 0 | 0 | 9.618 | 49.477 | 424.149 | 3744.061 | 3824.075 | +| maximum successive centroid jump (px) | 0 | 0 | 0 | 8.724 | 25.157 | 144.000 | 3744.034 | 3792.034 | + +All 36,508 full chunks satisfy the replay prototype's current selector: +`events >= 8192 && events / occupied_32px_tiles >= 32`. + +Catalog prefetch took 55.469 s. Producer classification and chunk accounting +took 232.340 s; total process wall time was 288.872 s. These are diagnostic CPU +costs and do not estimate HIP tile-kernel speed. + +## Interpretation and limits + +The measured production event order strongly supports the hypothesis that a +full worker chunk is usually filled by very few image-plane triangles: the +median is two and 75% contain at most three. Center-tile occupancy is even more +concentrated. This is favorable for a tile16 path because the same output pixels +receive many contributions that can be reduced before the final double HDR +write. + +The rare tail matters: p99 chunks can contain a few clusters separated by +nearly the full 4K image width. “Few triangles” therefore does not imply one +small contiguous bounding rectangle. A production implementation should use a +sparse occupied-tile list, retain the atomic fallback, and measure the complete +streaming sink including binning and synchronization. + +This is one Schwarzschild Galactic-center frame with one 16-worker dynamic +schedule. Worker-to-triangle assignment is nondeterministic, so exact quantiles +may vary between runs. The result establishes event geometry for this input; it +does not by itself establish single-BH/BBH universality or a HIP speedup. diff --git a/benchmarks/dummy_psf_chunks_2026-09-11/full_catalog.log b/benchmarks/dummy_psf_chunks_2026-09-11/full_catalog.log new file mode 100644 index 0000000..328aad4 --- /dev/null +++ b/benchmarks/dummy_psf_chunks_2026-09-11/full_catalog.log @@ -0,0 +1,235 @@ +COMMAND OMP_NUM_THREADS=16 OMP_DYNAMIC=FALSE /home/wyj/Code/C/GR_4d_raytracing/build/Release/schwarzschild_sky_dummy --verbose --psf-relative-tail 1e-8 --psf-min-y 0 --max-cache-psf-flux 1e8 --all-sky-catalog assets/2mass/processed/all_sky --exposure 1e13 --psf-fwhm-pixels 2.7 --psf-moffat-beta 4.5 --catalog-load-workers 4 --hdr-output --lens-map-input output/lens/schwarzschild_galactic_center_R100_45deg_16_4_4k_.grlens --output output/imgs/2mass_galactic_center_schwarzschild_R100_4k_1e13_beta4.5_16_4-full-gpu.png +GIT 11e703e33dffb1ff168ba11dd922e68b448116b9 +BINARY_SHA256 c71a843a6064cd730b4694c5fe4e61249a995106526da0fdca97bc625c7db470 +LENS_SHA256 905f960aea2d276f9586c79fba545a72cf742311e9e7e18faea293835c68bf28 +PROTECTED_BEFORE output/imgs/2mass_galactic_center_schwarzschild_R100_4k_1e13_beta4.5_16_4-full-gpu.png sha256=3e01feb911e60acce545a6a86870ca05f96250022e874eb8097bec88a8879bfd size=13072572 mtime_ns=1788744728751407011 +PROTECTED_BEFORE output/imgs/2mass_galactic_center_schwarzschild_R100_4k_1e13_beta4.5_16_4-full-gpu_HDR.fits sha256=2408e62dcc22f147da284d87af9a2b0fdd0050eda2dabc23b6ec2554b2f1d38e size=99535680 mtime_ns=1788744726380022561 +Dummy PSF backend: --output and --hdr-output are accepted for command parity but no image files will be written. +PSF cache ready: 64x64 phases, radius 47 px, relative tail 1e-08, tail abs 1e-06, boundary 1e-07, build 0.678 s +Frame 0: finding and prefetching catalog tiles... +Catalog prefetch: 64440 requested, 64440 newly loaded (343363141 stars), 0 unavailable in 55.469 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 1/16 started. +Frame 0: splat worker 4/16 started. +Frame 0: splat worker 3/16 started. +Frame 0: splat worker 5/16 started. +Frame 0: splat worker 10/16 started. +Frame 0: splat worker 7/16 started. +Frame 0: splat worker 8/16 started. +Frame 0: splat worker 13/16 started. +Frame 0: splat worker 11/16 started. +Frame 0: splat worker 6/16 started. +Frame 0: splat worker 12/16 started. +Frame 0: splat worker 9/16 started. +Frame 0: splat worker 14/16 started. +Frame 0: splat worker 16/16 started. +Frame 0: splat worker 15/16 started. +Frame 0: splat worker 1/16 reached 8 local triangles. +Frame 0: splat worker 6/16 reached 8 local triangles. +Frame 0: splat worker 10/16 reached 8 local triangles. +Frame 0: splat worker 14/16 reached 8 local triangles. +Frame 0: splat worker 12/16 reached 8 local triangles. +Frame 0: splat worker 2/16 reached 8 local triangles. +Frame 0: splat worker 5/16 reached 8 local triangles. +Frame 0: splat worker 3/16 reached 8 local triangles. +Frame 0: splat worker 7/16 reached 8 local triangles. +Frame 0: splat worker 15/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 11/16 reached 8 local triangles. +Frame 0: splat worker 13/16 reached 8 local triangles. +Frame 0: splat worker 9/16 reached 8 local triangles. +Frame 0: splat worker 16/16 reached 8 local triangles. +Frame 0: splat worker 12/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 6/16 reached 16 local triangles. +Frame 0: splat worker 1/16 reached 16 local triangles. +Frame 0: splat worker 8/16 reached 16 local triangles. +Frame 0: splat worker 3/16 reached 16 local triangles. +Frame 0: splat worker 7/16 reached 16 local triangles. +Frame 0: splat worker 2/16 reached 16 local triangles. +Frame 0: splat worker 15/16 reached 16 local triangles. +Frame 0: splat worker 5/16 reached 16 local triangles. +Frame 0: splat worker 11/16 reached 16 local triangles. +Frame 0: splat worker 13/16 reached 16 local triangles. +Frame 0: splat worker 9/16 reached 16 local triangles. +Frame 0: splat worker 16/16 reached 16 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 7/16 reached 32 local triangles. +Frame 0: splat worker 6/16 reached 32 local triangles. +Frame 0: splat worker 8/16 reached 32 local triangles. +Frame 0: splat worker 2/16 reached 32 local triangles. +Frame 0: splat worker 3/16 reached 32 local triangles. +Frame 0: splat worker 11/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 15/16 reached 32 local triangles. +Frame 0: splat worker 16/16 reached 32 local triangles. +Frame 0: splat worker 14/16 reached 32 local triangles. +Frame 0: splat worker 5/16 reached 32 local triangles. +Frame 0: splat worker 13/16 reached 32 local triangles. +Frame 0: splat worker 10/16 reached 16 local triangles. +Frame 0: splat worker 10/16 reached 32 local triangles. +Frame 0: splat worker 4/16 reached 64 local triangles. +Frame 0: splat worker 6/16 reached 64 local triangles. +Frame 0: splat worker 8/16 reached 64 local triangles. +Frame 0: splat worker 2/16 reached 64 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 11/16 reached 64 local triangles. +Frame 0: splat worker 15/16 reached 64 local triangles. +Frame 0: splat worker 16/16 reached 64 local triangles. +Frame 0: splat worker 14/16 reached 64 local triangles. +Frame 0: splat worker 5/16 reached 64 local triangles. +Frame 0: splat worker 9/16 reached 64 local triangles. +Frame 0: splat worker 1/16 reached 64 local triangles. +Frame 0: splat worker 7/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 4/16 reached 128 local triangles. +Frame 0: splat worker 12/16 reached 128 local triangles. +Frame 0: splat worker 11/16 reached 128 local triangles. +Frame 0: splat worker 6/16 reached 128 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 5/16 reached 128 local triangles. +Frame 0: splat worker 8/16 reached 128 local triangles. +Frame 0: splat worker 3/16 reached 128 local triangles. +Frame 0: splat worker 16/16 reached 128 local triangles. +Frame 0: splat worker 14/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 13/16 reached 128 local triangles. +Frame 0: splat worker 9/16 reached 128 local triangles. +Frame 0: splat worker 10/16 reached 128 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 16/16 reached 256 local triangles. +Frame 0: splat worker 8/16 reached 256 local triangles. +Frame 0: splat worker 11/16 reached 256 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 3/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 7/16 reached 256 local triangles. +Frame 0: splat worker 4/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 14/16 reached 256 local triangles. +Frame 0: splat worker 9/16 reached 256 local triangles. +Frame 0: splat worker 8/16 reached 512 local triangles. +Frame 0: splat worker 12/16 reached 512 local triangles. +Frame 0: splat worker 16/16 reached 512 local triangles. +Frame 0: splat worker 5/16 reached 512 local triangles. +Frame 0: splat worker 13/16 reached 512 local triangles. +Frame 0: splat worker 3/16 reached 512 local triangles. +Frame 0: splat worker 7/16 reached 512 local triangles. +Frame 0: splat worker 11/16 reached 512 local triangles. +Frame 0: splat worker 1/16 reached 512 local triangles. +Frame 0: splat worker 15/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 4/16 reached 512 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 8/16 reached 1024 local triangles. +Frame 0: splat worker 7/16 reached 1024 local triangles. +Frame 0: splat worker 12/16 reached 1024 local triangles. +Frame 0: splat worker 3/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 5/16 reached 1024 local triangles. +Frame 0: splat worker 14/16 reached 1024 local triangles. +Frame 0: splat worker 15/16 reached 1024 local triangles. +Frame 0: splat worker 4/16 reached 1024 local triangles. +Frame 0: splat worker 9/16 reached 1024 local triangles. +Frame 0: splat worker 13/16 reached 1024 local triangles. +Frame 0: splat worker 6/16 reached 1024 local triangles. +Frame 0: splat worker 1/16 reached 1024 local triangles. +Frame 0: splat worker 10/16 reached 1024 local triangles. +Frame 0: splat worker 2/16 reached 1024 local triangles. +Frame 0: splat worker 8/16 reached 2048 local triangles. +Frame 0: splat worker 12/16 reached 2048 local triangles. +Frame 0: splat worker 16/16 reached 2048 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 3/16 reached 2048 local triangles. +Frame 0: splat worker 4/16 reached 2048 local triangles. +Frame 0: splat worker 1/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 13/16 reached 2048 local triangles. +Frame 0: splat worker 15/16 reached 2048 local triangles. +Frame 0: splat worker 6/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 10/16 reached 2048 local triangles. +Frame 0: splat worker 3/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 14/16 reached 4096 local triangles. +Frame 0: splat worker 9/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 8/16 reached 4096 local triangles. +Frame 0: splat worker 13/16 reached 4096 local triangles. +Frame 0: splat worker 5/16 reached 4096 local triangles. +Frame 0: splat worker 10/16 reached 4096 local triangles. +Frame 0: splat worker 15/16 reached 4096 local triangles. +Frame 0: splat worker 11/16 reached 4096 local triangles. +Frame 0: splat worker 12/16 reached 4096 local triangles. +Frame 0: splat worker 1/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 7/16 reached 8192 local triangles. +Frame 0: splat worker 16/16 reached 8192 local triangles. +Frame 0: splat worker 13/16 reached 8192 local triangles. +Frame 0: splat worker 9/16 reached 8192 local triangles. +Frame 0: splat worker 4/16 reached 8192 local triangles. +Frame 0: splat worker 8/16 reached 8192 local triangles. +Frame 0: splat worker 2/16 finished after 7916 local triangles. +Frame 0: splat worker 8/16 finished after 8212 local triangles. +Frame 0: splat worker 6/16 finished after 8150 local triangles. +Frame 0: splat worker 1/16 finished after 7784 local triangles. +Frame 0: splat worker 4/16 finished after 8227 local triangles. +Frame 0: splat worker 15/16 finished after 7878 local triangles. +Frame 0: splat worker 14/16 finished after 8186 local triangles. +Frame 0: splat worker 11/16 finished after 7962 local triangles. +Frame 0: splat worker 9/16 finished after 8276 local triangles. +Frame 0: splat worker 16/16 finished after 8477 local triangles. +Frame 0: splat worker 3/16 finished after 8967 local triangles. +Frame 0: splat worker 7/16 finished after 8576 local triangles. +Frame 0: splat worker 10/16 finished after 7772 local triangles. +Frame 0: splat worker 13/16 finished after 8295 local triangles. +Frame 0: splat worker 12/16 finished after 8013 local triangles. +Frame 0: splat worker 5/16 finished after 8191 local triangles. +Dummy PSF diagnostic only: no HDR or image was accumulated/written. +Dummy PSF chunks: total=36524 full=36508 partial=16 events=598264924 capacity=16384 selector_tile=32px +Dummy PSF all events: min=263.000 p10=16384.000 p25=16384.000 p50=16384.000 p75=16384.000 p90=16384.000 p99=16384.000 max=16384.000 +Dummy PSF all distinct_triangles: min=1.000 p10=1.000 p25=1.000 p50=2.000 p75=4.000 p90=10.000 p99=31.000 max=59.000 +Dummy PSF all occupied_32px_tiles: min=1.000 p10=1.000 p25=1.000 p50=1.000 p75=2.000 p90=5.000 p99=30.000 max=45.000 +Dummy PSF all event_bbox_diagonal_px: min=0.199 p10=0.743 p25=3.252 p50=12.667 p75=57.123 p90=432.049 p99=3759.261 max=3834.557 +Dummy PSF all triangle_centroid_bbox_diagonal_px: min=0.000 p10=0.000 p25=0.000 p50=9.621 p75=49.817 p90=425.680 p99=3744.061 max=3824.075 +Dummy PSF all maximum_successive_triangle_jump_px: min=0.000 p10=0.000 p25=0.000 p50=8.750 p75=25.157 p90=144.000 p99=3744.034 max=3792.034 +Dummy PSF all adaptive criterion: 36516/36524 chunks tile16-eligible (events>=8192 and events/occupied_32px_tiles>=32) +Dummy PSF full events: min=16384.000 p10=16384.000 p25=16384.000 p50=16384.000 p75=16384.000 p90=16384.000 p99=16384.000 max=16384.000 +Dummy PSF full distinct_triangles: min=1.000 p10=1.000 p25=1.000 p50=2.000 p75=3.000 p90=10.000 p99=31.000 max=59.000 +Dummy PSF full occupied_32px_tiles: min=1.000 p10=1.000 p25=1.000 p50=1.000 p75=2.000 p90=5.000 p99=30.000 max=45.000 +Dummy PSF full event_bbox_diagonal_px: min=0.199 p10=0.742 p25=3.250 p50=12.651 p75=57.018 p90=429.306 p99=3759.261 max=3834.557 +Dummy PSF full triangle_centroid_bbox_diagonal_px: min=0.000 p10=0.000 p25=0.000 p50=9.618 p75=49.477 p90=424.149 p99=3744.061 max=3824.075 +Dummy PSF full maximum_successive_triangle_jump_px: min=0.000 p10=0.000 p25=0.000 p50=8.724 p75=25.157 p90=144.000 p99=3744.034 max=3792.034 +Dummy PSF full adaptive criterion: 36508/36508 chunks tile16-eligible (events>=8192 and events/occupied_32px_tiles>=32) +Dummy PSF producers: 16 workers; classification/chunk wall 232.340 s +Frame 0: catalog classification finished in 232.3 s; reporting chunk statistics... +Dummy PSF classified 598264924 images from 343363141 catalog stars; no HDR, PNG, or PPM was written. +PSF splats: cached 598264924, cached wing-clipped 0, direct fallbacks 0, discarded below min-Y 0 +PROCESS_WALL 288.871615309 EXIT 0 +PROCESS_USER 3815.986955000 PROCESS_SYSTEM 12.140569000 MAX_RSS_KIB 13769936 +PROTECTED_AFTER output/imgs/2mass_galactic_center_schwarzschild_R100_4k_1e13_beta4.5_16_4-full-gpu.png sha256=3e01feb911e60acce545a6a86870ca05f96250022e874eb8097bec88a8879bfd size=13072572 mtime_ns=1788744728751407011 unchanged=yes +PROTECTED_AFTER output/imgs/2mass_galactic_center_schwarzschild_R100_4k_1e13_beta4.5_16_4-full-gpu_HDR.fits sha256=2408e62dcc22f147da284d87af9a2b0fdd0050eda2dabc23b6ec2554b2f1d38e size=99535680 mtime_ns=1788744726380022561 unchanged=yes diff --git a/benchmarks/dummy_psf_chunks_2026-09-11/full_catalog_missing_time.log b/benchmarks/dummy_psf_chunks_2026-09-11/full_catalog_missing_time.log new file mode 100644 index 0000000..4a7d26e --- /dev/null +++ b/benchmarks/dummy_psf_chunks_2026-09-11/full_catalog_missing_time.log @@ -0,0 +1,6 @@ +COMMAND OMP_NUM_THREADS=16 OMP_DYNAMIC=FALSE /usr/bin/time -v /home/wyj/Code/C/GR_4d_raytracing/build/Release/schwarzschild_sky_dummy --verbose --psf-relative-tail 1e-8 --psf-min-y 0 --max-cache-psf-flux 1e8 --all-sky-catalog assets/2mass/processed/all_sky --exposure 1e13 --psf-fwhm-pixels 2.7 --psf-moffat-beta 4.5 --catalog-load-workers 4 --hdr-output --lens-map-input output/lens/schwarzschild_galactic_center_R100_45deg_16_4_4k_.grlens --output output/imgs/2mass_galactic_center_schwarzschild_R100_4k_1e13_beta4.5_16_4-full-gpu.png +GIT 11e703e33dffb1ff168ba11dd922e68b448116b9 +BINARY_SHA256 c71a843a6064cd730b4694c5fe4e61249a995106526da0fdca97bc625c7db470 +LENS_SHA256 905f960aea2d276f9586c79fba545a72cf742311e9e7e18faea293835c68bf28 +PROTECTED_BEFORE output/imgs/2mass_galactic_center_schwarzschild_R100_4k_1e13_beta4.5_16_4-full-gpu.png sha256=3e01feb911e60acce545a6a86870ca05f96250022e874eb8097bec88a8879bfd size=13072572 mtime_ns=1788744728751407011 +PROTECTED_BEFORE output/imgs/2mass_galactic_center_schwarzschild_R100_4k_1e13_beta4.5_16_4-full-gpu_HDR.fits sha256=2408e62dcc22f147da284d87af9a2b0fdd0050eda2dabc23b6ec2554b2f1d38e size=99535680 mtime_ns=1788744726380022561 diff --git a/gpu_psf_acceleration_plan.md b/gpu_psf_acceleration_plan.md index f43c2dc..57a4135 100644 --- a/gpu_psf_acceleration_plan.md +++ b/gpu_psf_acceleration_plan.md @@ -26,6 +26,22 @@ production HIP 尚未替换为 tile 算法;收益与事件分布有关,不 全天加速比。未运行完整全天 catalog。测试工具与原型已于 2026-09-11 提交为 `7f5ec1a`;以下保留原执行计划作为验收依据。 +同日后续实验在 replay 中增加了按 chunk 的中心 tile 密度选择器。当前 RX 9070 配对数据中, +65,536-event 银心输入的 adaptive/atomic/tile16 中位数为 67.834/95.018/67.354 ms, +同贡献分散输入为 80.092/78.203/99.693 ms;选择扫描中位成本不超过 0.455 ms。 +mixed fixture 已覆盖同一 stream 内 atomic、tile 与 direct fallback 的组合。结果支持下一步 +做 production 流式集成原型,但选择器和 tile sink 目前仍只在测试程序中,未改变生产默认。 + +随后用只计数的 `PSF_BACKEND=dummy` 跑过用户给定的 45 度 Schwarzschild 银心全天命令, +没有启动 HIP,也没有写 HDR/PNG。598,264,924 个 cache event 中有 36,508 个满 +16,384-event chunk;满 chunk 的 event-producing triangle 数 p50/p75/p90/p99 为 +2/3/10/31,occupied 32px center tile 数为 1/2/5/30,全部满足当前 adaptive tile16 +阈值。这把“dense replay”提升成了真实 production producer 顺序的证据,支持把 adaptive +tile16 接入 production sink 作为下一步候选。限制是 16-worker dynamic schedule 会有运行间 +波动,而且 p99 chunk 含相距约 3.7K px 的稀疏簇;实现必须保留稀疏 tile 列表和 atomic +fallback,不能假定单一连续小矩形。详见 +[dummy chunk 全量记录](benchmarks/dummy_psf_chunks_2026-09-11/README.md)。 + ## 下一步执行计划(2026-09-07,原计划;有界实验已实施) ### 依据与目标 diff --git a/nr_spacetime_movie_renderer_design.md b/nr_spacetime_movie_renderer_design.md index 9a2b5da..2a42d8f 100644 --- a/nr_spacetime_movie_renderer_design.md +++ b/nr_spacetime_movie_renderer_design.md @@ -993,6 +993,27 @@ CPU 按完整、经 cache 限制的 support 矩形建立 tile 引用;GPU 仍 合并、清理和下载的完整成本及分布依赖,不能只引用无 atomic kernel 的单项耗时。 本轮生产 HIP 路径保持原实现,尚未进行新的完整全天渲染。 +2026-09-11 的后续有界实验加入了按 chunk 的分布选择器:先统计 32px 中心 tile 占用, +再在高中心密度 chunk 使用 16×16 像素归约,其余保留 atomic。RX 9070 的配对回放中, +它在银心密集输入接近固定 tile16,同时在同贡献分散输入选择 atomic,详情见上述回放记录。 +此选择器仍仅存在于测试程序;阈值来自固定样本,尚未验证 production producer/sink 锁竞争 +或完整全天事件序列,因此不能成为 renderer 默认策略。 + +2026-09-11 又加入了 `PSF_BACKEND=dummy` 的只统计后端。它要求导入 `.grlens`,复用 +production 的 OpenMP `schedule(dynamic,1)`、每 worker 16,384-event chunk,以及完整的 +catalog/inverse-map/颜色/flux/cache 分类,但不分配完整 HDR,也绝不写 PNG/FITS。对银心 +45 度 Schwarzschild 全天输入的一次 16-worker 全量运行中,598,264,924 个 cache event +形成 36,508 个满 chunk;满 chunk 跨越的 event-producing triangle 数为 p50=2、p75=3、 +p90=10、p99=31、max=59,32px 中心 tile 占用为 p50=1、p75=2、p90=5、p99=30、 +max=45。全部满 chunk 都满足当前测试选择器的 tile16 条件。 + +这个结果支持“真实宽视场下一个 worker 的满 chunk 通常集中在少数三角形/少数局部 +tile”这一调度假设,但也揭示了稀有的远距离簇:满 chunk 的三角形质心包围盒对角线 +p99 约 3744px,最大相邻三角形跳跃 p99 也约 3744px。因而不能把“少数三角形”等同于 +“全 chunk 单个连续矩形”;production tile 原型仍应按稀疏 occupied-tile 列表处理,并用 +真实流式端到端数据验证分桶成本。完整命令、hash、输出保护和原始记录见 +[dummy chunk 统计](benchmarks/dummy_psf_chunks_2026-09-11/README.md)。 + ---