From 6f8ec50c6408d328804f5c13896644f0f98cea08 Mon Sep 17 00:00:00 2001 From: Yingjie Wang Date: Sat, 29 Aug 2026 19:23:50 -0400 Subject: [PATCH] Makefile: add Debug build diagnostics --- Makefile | 58 ++++++++++++++++++++++++++++++++--------------------- src/frame.c | 23 ++++++++++++++++++--- src/main.c | 10 +++++++++ 3 files changed, 65 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 2f8bdb5..2ec71a8 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,20 @@ CC ?= cc -CFLAGS ?= -std=c11 -march=native -O2 -pipe -Wall -Wextra -Wpedantic +CFLAGS ?= -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic OPENMP_FLAGS ?= -fopenmp LDLIBS ?= -lm ENABLE_PNG ?= 1 SPACETIME ?= minkowski +BUILD_TYPE ?= Release + +ifeq ($(BUILD_TYPE),Release) +BUILD_CFLAGS := -O2 -DNDEBUG +BUILD_CPPFLAGS := +else ifeq ($(BUILD_TYPE),Debug) +BUILD_CFLAGS := -O0 -g3 +BUILD_CPPFLAGS := -DGR_DEBUG +else +$(error Unknown BUILD_TYPE '$(BUILD_TYPE)'; choose Release or Debug) +endif ifeq ($(ENABLE_PNG),1) CPPFLAGS += -DENABLE_PNG @@ -15,14 +26,15 @@ endif COMMON_SOURCES := $(filter-out src/main.c src/spacetime_minkowski.c src/spacetime_schwarzschild.c,$(wildcard src/*.c)) PROVIDER_SOURCE := src/spacetime_$(SPACETIME).c -TARGET := build/$(SPACETIME)_sky +BUILD_DIR := build/$(BUILD_TYPE) +TARGET := $(BUILD_DIR)/$(SPACETIME)_sky CORE_MINKOWSKI_SOURCES := $(COMMON_SOURCES) src/spacetime_minkowski.c -TEST_TARGET := build/test_geodesic -FRAME_TEST_TARGET := build/test_frame -SCHWARZSCHILD_TEST_TARGET := build/test_schwarzschild -OBSERVER_TRACK_TEST_TARGET := build/test_observer_track -CATALOG_PREFETCH_TEST_TARGET := build/test_catalog_prefetch -PSF_HDR_TEST_TARGET := build/minkowski_psf_hdr_test +TEST_TARGET := $(BUILD_DIR)/test_geodesic +FRAME_TEST_TARGET := $(BUILD_DIR)/test_frame +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 +PSF_HDR_TEST_TARGET := $(BUILD_DIR)/minkowski_psf_hdr_test .PHONY: all clean run test minkowski schwarzschild psf-hdr-test @@ -36,10 +48,10 @@ endif all: $(TARGET) -$(TARGET): $(COMMON_SOURCES) $(PROVIDER_SOURCE) src/main.c | build - $(CC) $(CPPFLAGS) $(BACKEND_CPPFLAGS) $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ +$(TARGET): $(COMMON_SOURCES) $(PROVIDER_SOURCE) src/main.c | $(BUILD_DIR) + $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(BACKEND_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ -build: +$(BUILD_DIR): mkdir -p $@ run: $(TARGET) @@ -53,25 +65,25 @@ schwarzschild: $(MAKE) SPACETIME=schwarzschild all # Deliberately separate from the production binary: enables --hdr-output FITS. -$(PSF_HDR_TEST_TARGET): $(COMMON_SOURCES) src/spacetime_minkowski.c src/main.c | build - $(CC) $(CPPFLAGS) -DENABLE_HDR_DEBUG -DSPACETIME_MINKOWSKI $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) $(shell pkg-config --libs cfitsio) -o $@ +$(PSF_HDR_TEST_TARGET): $(COMMON_SOURCES) src/spacetime_minkowski.c src/main.c | $(BUILD_DIR) + $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) -DENABLE_HDR_DEBUG -DSPACETIME_MINKOWSKI $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) $(shell pkg-config --libs cfitsio) -o $@ psf-hdr-test: $(PSF_HDR_TEST_TARGET) -$(TEST_TARGET): tests/test_geodesic.c $(CORE_MINKOWSKI_SOURCES) | build - $(CC) $(CPPFLAGS) $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ +$(TEST_TARGET): tests/test_geodesic.c $(CORE_MINKOWSKI_SOURCES) | $(BUILD_DIR) + $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ -$(FRAME_TEST_TARGET): tests/test_frame.c $(CORE_MINKOWSKI_SOURCES) | build - $(CC) $(CPPFLAGS) $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ +$(FRAME_TEST_TARGET): tests/test_frame.c $(CORE_MINKOWSKI_SOURCES) | $(BUILD_DIR) + $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ -$(SCHWARZSCHILD_TEST_TARGET): tests/test_schwarzschild.c $(COMMON_SOURCES) src/spacetime_schwarzschild.c | build - $(CC) $(CPPFLAGS) $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ +$(SCHWARZSCHILD_TEST_TARGET): tests/test_schwarzschild.c $(COMMON_SOURCES) src/spacetime_schwarzschild.c | $(BUILD_DIR) + $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ -$(OBSERVER_TRACK_TEST_TARGET): tests/test_observer_track.c $(COMMON_SOURCES) | build - $(CC) $(CPPFLAGS) $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ +$(OBSERVER_TRACK_TEST_TARGET): tests/test_observer_track.c $(COMMON_SOURCES) | $(BUILD_DIR) + $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ -$(CATALOG_PREFETCH_TEST_TARGET): tests/test_catalog_prefetch.c $(CORE_MINKOWSKI_SOURCES) | build - $(CC) $(CPPFLAGS) $(CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ +$(CATALOG_PREFETCH_TEST_TARGET): tests/test_catalog_prefetch.c $(CORE_MINKOWSKI_SOURCES) | $(BUILD_DIR) + $(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@ test: $(TEST_TARGET) $(FRAME_TEST_TARGET) $(SCHWARZSCHILD_TEST_TARGET) $(OBSERVER_TRACK_TEST_TARGET) $(CATALOG_PREFETCH_TEST_TARGET) ./$(TEST_TARGET) diff --git a/src/frame.c b/src/frame.c index c0c5294..ce2860b 100644 --- a/src/frame.c +++ b/src/frame.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -780,6 +781,7 @@ static int owns_source_boundary(const LensTriangle *triangle, typedef struct { const LensVertex *vertex[3]; const LensTriangle *triangle; + size_t triangle_index; double *hdr; int width, height; double exposure, magnification; @@ -820,10 +822,24 @@ static int splat_catalog_tile(const Star *stars, size_t count, weights[1] * context->vertex[1]->log_frequency_ratio + weights[2] * context->vertex[2]->log_frequency_ratio; const LinearRgb color = blackbody_to_linear_rgb(star->temperature_K * exp(log_g)); - context->direct_fallbacks += splat_moffat_cached( + const double flux = context->exposure * star->amplitude * context->magnification; + const int direct_fallback = splat_moffat_cached( context->hdr, context->width, context->height, image_x, image_y, color, - context->exposure * star->amplitude * context->magnification, + flux, context->psf, context->psf_cache); + context->direct_fallbacks += direct_fallback; +#ifdef GR_DEBUG + if (direct_fallback) + /* This is deliberately emitted by the active splat worker: a direct + * fallback can be the long-running work a Debug render is waiting on. + * Do not add a critical section here; interleaved Debug lines are more + * useful than stalling the other workers. */ + fprintf(stderr, + "Debug: %.3f s splat worker %d triangle %zu star %zu uses direct " + "PSF fallback (image %.3f, %.3f; flux %.6g).\n", + omp_get_wtime(), omp_get_thread_num(), context->triangle_index, + s, image_x, image_y, flux); +#endif ++context->images; } return 0; @@ -853,7 +869,8 @@ static size_t splat_catalog_triangles(const FrameLensMesh *mesh, {vertex[1]->n_infinity[0], vertex[1]->n_infinity[1], vertex[1]->n_infinity[2]}, {vertex[2]->n_infinity[0], vertex[2]->n_infinity[1], vertex[2]->n_infinity[2]}}; TriangleSplatContext context = {.vertex = {vertex[0], vertex[1], vertex[2]}, - .triangle = &mesh->triangles[t], .hdr = hdr, + .triangle = &mesh->triangles[t], + .triangle_index = t, .hdr = hdr, .width = width, .height = height, .exposure = exposure, .magnification = magnification, .psf = psf, .psf_cache = psf_cache}; diff --git a/src/main.c b/src/main.c index df2ee7c..de9350a 100644 --- a/src/main.c +++ b/src/main.c @@ -137,6 +137,12 @@ static int parse_args(int argc, char **argv, Settings *s, *s = (Settings){.width = 1280, .height = 720, .coarse_cell_pixels = 16, +#ifdef GR_DEBUG + /* Debug builds make existing low-frequency render progress + * visible by default. Their worker heartbeats are local + * 8/16/32... milestones, not shared progress counters. */ + .verbose = 1, +#endif .horizontal_fov_deg = 30.0, .look_ra_deg = 270.0, .look_dec_deg = 0.0, @@ -651,6 +657,10 @@ int main(int argc, char **argv) { argv[0]); return 2; } +#ifdef GR_DEBUG + fputs("Debug build: low-frequency render progress is enabled; direct PSF " + "fallbacks log immediately from their splat worker.\n", stderr); +#endif if (write_path != NULL) return catalog_write_octant_grid(write_path) == 0 ? 0 : (perror(write_path), 1);