Capture prepared events through a test-only producer consumer and measure serial and indexed parallel generation independently. Compare the production atomic kernel with bounded pixel-owned tile reductions while preserving double HDR, cache support, and direct fallback ordering. Validate captured inputs, edge and multichunk fixtures, CPU/HIP renderer regressions, and 45 isolated final replays. Keep the production HIP algorithm unchanged because gains depend on event distribution.
199 lines
7.9 KiB
Makefile
199 lines
7.9 KiB
Makefile
CC ?= cc
|
|
CFLAGS ?= -std=c11 -march=native -pipe -Wall -Wextra -Wpedantic
|
|
OPENMP_FLAGS ?= -fopenmp
|
|
LDLIBS ?= -lm
|
|
ENABLE_PNG ?= 1
|
|
SPACETIME ?= minkowski
|
|
BUILD_TYPE ?= Release
|
|
ENABLE_HDR ?= 0
|
|
PSF_EVENT_SINK ?= 1
|
|
PSF_BACKEND ?= cpu
|
|
HIPCC ?= hipcc
|
|
HIP_CXXFLAGS ?= -std=c++17 -O2 -Wall -Wextra -Wpedantic
|
|
|
|
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
|
|
LDLIBS += -lpng
|
|
IMAGE_EXT := png
|
|
else
|
|
IMAGE_EXT := ppm
|
|
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
|
|
BUILD_DIR := build/$(BUILD_TYPE)
|
|
TARGET_BASENAME := $(SPACETIME)_sky
|
|
OBJECT_DIR := $(BUILD_DIR)/obj/$(SPACETIME)
|
|
CORE_MINKOWSKI_SOURCES := $(COMMON_SOURCES) src/spacetime_minkowski.c
|
|
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
|
|
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 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)
|
|
endif
|
|
BUILD_CPPFLAGS += -DFRAME_PSF_EVENT_SINK=$(PSF_EVENT_SINK)
|
|
|
|
ifeq ($(PSF_BACKEND),cpu)
|
|
RENDER_LINKER := $(CC)
|
|
else ifeq ($(PSF_BACKEND),hip)
|
|
RENDER_LINKER := $(HIPCC)
|
|
BUILD_CPPFLAGS += -DPSF_BACKEND_HIP
|
|
else
|
|
$(error Unknown PSF_BACKEND '$(PSF_BACKEND)'; choose cpu or hip)
|
|
endif
|
|
|
|
ifeq ($(SPACETIME),minkowski)
|
|
BACKEND_CPPFLAGS := -DSPACETIME_MINKOWSKI
|
|
else ifeq ($(SPACETIME),schwarzschild)
|
|
BACKEND_CPPFLAGS := -DSPACETIME_SCHWARZSCHILD
|
|
else
|
|
$(error Unknown SPACETIME '$(SPACETIME)'; choose minkowski or schwarzschild)
|
|
endif
|
|
|
|
ifeq ($(ENABLE_HDR),1)
|
|
HDR_CPPFLAGS := -DENABLE_HDR_OUTPUT $(shell pkg-config --cflags cfitsio)
|
|
HDR_LDLIBS := $(shell pkg-config --libs cfitsio)
|
|
HDR_BUILD_TAG := hdr_sink$(PSF_EVENT_SINK)_$(PSF_BACKEND)
|
|
else ifeq ($(ENABLE_HDR),0)
|
|
HDR_BUILD_TAG := standard_sink$(PSF_EVENT_SINK)_$(PSF_BACKEND)
|
|
else
|
|
$(error Unknown ENABLE_HDR '$(ENABLE_HDR)'; choose 0 or 1)
|
|
endif
|
|
|
|
ifeq ($(PSF_BACKEND),hip)
|
|
TARGET := $(BUILD_DIR)/$(TARGET_BASENAME)_hip
|
|
else
|
|
TARGET := $(BUILD_DIR)/$(TARGET_BASENAME)
|
|
endif
|
|
RENDER_SOURCES := $(COMMON_SOURCES) $(PROVIDER_SOURCE) src/main.c
|
|
RENDER_OBJECTS := $(patsubst %.c,$(OBJECT_DIR)/$(HDR_BUILD_TAG)/%.o,$(RENDER_SOURCES))
|
|
ifeq ($(PSF_BACKEND),hip)
|
|
HIP_PSF_OBJECT := $(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/hip_psf.o
|
|
RENDER_OBJECTS += $(HIP_PSF_OBJECT)
|
|
endif
|
|
RENDER_DEPS := $(RENDER_OBJECTS:.o=.d)
|
|
|
|
# With no explicit backend choice, all means every currently supported
|
|
# production spacetime backend. An explicit SPACETIME selects that backend,
|
|
# so `make SPACETIME=schwarzschild` remains the direct build command.
|
|
ifneq ($(filter command\ line environment environment\ override,$(origin SPACETIME)),)
|
|
all: backend
|
|
else
|
|
all: minkowski schwarzschild
|
|
endif
|
|
|
|
minkowski:
|
|
$(MAKE) SPACETIME=minkowski ENABLE_HDR=$(ENABLE_HDR) backend
|
|
|
|
schwarzschild:
|
|
$(MAKE) SPACETIME=schwarzschild ENABLE_HDR=$(ENABLE_HDR) backend
|
|
|
|
# Build exactly the selected backend/configuration, e.g.
|
|
# make SPACETIME=schwarzschild ENABLE_HDR=1 backend
|
|
backend: $(TARGET)
|
|
|
|
$(TARGET): $(RENDER_OBJECTS) FORCE | $(BUILD_DIR)
|
|
$(RENDER_LINKER) $(BUILD_CFLAGS) $(OPENMP_FLAGS) $(RENDER_OBJECTS) $(LDLIBS) $(HDR_LDLIBS) -o $@
|
|
|
|
FORCE:
|
|
|
|
$(OBJECT_DIR)/$(HDR_BUILD_TAG)/%.o: %.c
|
|
@mkdir -p $(dir $@)
|
|
$(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(BACKEND_CPPFLAGS) $(HDR_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc -MMD -MP -c $< -o $@
|
|
|
|
$(BUILD_DIR):
|
|
mkdir -p $@
|
|
|
|
$(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/hip_psf.o: src/hip_psf.hip src/hip_psf.h src/optics.h
|
|
@mkdir -p $(dir $@)
|
|
$(HIPCC) $(HIP_CXXFLAGS) $(BUILD_CPPFLAGS) -Isrc -c $< -o $@
|
|
|
|
# This is a production-sink regression, not the removed float analytic spike.
|
|
# 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) $(HDR_LDLIBS) -o $@
|
|
else
|
|
hip-psf-test hip-psf-bench:
|
|
$(error HIP PSF checks require PSF_BACKEND=hip)
|
|
endif
|
|
|
|
run: $(TARGET)
|
|
mkdir -p output/imgs
|
|
./$(TARGET) --catalog assets/sky_grid_5deg.csv --output output/imgs/$(SPACETIME)_sky.$(IMAGE_EXT)
|
|
|
|
$(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_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_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_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_DIR)
|
|
$(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@
|
|
|
|
$(BUILD_DIR)/test_observer_minkowski: tests/test_observer.c $(CORE_MINKOWSKI_SOURCES) | $(BUILD_DIR)
|
|
$(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $^ $(LDLIBS) -o $@
|
|
|
|
$(BUILD_DIR)/test_observer_schwarzschild: tests/test_observer.c $(COMMON_SOURCES) src/spacetime_schwarzschild.c | $(BUILD_DIR)
|
|
$(CC) $(CPPFLAGS) $(BUILD_CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -DSPACETIME_SCHWARZSCHILD -Isrc $^ $(LDLIBS) -o $@
|
|
|
|
test: $(CAMERA_TEST_TARGETS) $(TEST_TARGET) $(FRAME_TEST_TARGET) $(SCHWARZSCHILD_TEST_TARGET) $(OBSERVER_TRACK_TEST_TARGET) $(CATALOG_PREFETCH_TEST_TARGET)
|
|
./$(BUILD_DIR)/test_observer_minkowski
|
|
./$(BUILD_DIR)/test_observer_schwarzschild
|
|
./$(TEST_TARGET)
|
|
./$(FRAME_TEST_TARGET)
|
|
./$(SCHWARZSCHILD_TEST_TARGET)
|
|
./$(OBSERVER_TRACK_TEST_TARGET)
|
|
./$(CATALOG_PREFETCH_TEST_TARGET)
|
|
python3 tests/test_camera_cli.py $(BUILD_DIR)
|
|
|
|
clean:
|
|
rm -rf build
|
|
|
|
-include $(RENDER_DEPS)
|
|
include mk/reference_images.mk
|
|
|
|
# Test-only producer consumer: never linked into a renderer.
|
|
.PHONY: psf-capture
|
|
psf-capture: $(BUILD_DIR)/capture_psf
|
|
$(BUILD_DIR)/capture_psf: tests/capture_psf.c $(CORE_MINKOWSKI_SOURCES) | $(BUILD_DIR)
|
|
$(CC) $(CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $< $(filter-out src/frame.c,$(CORE_MINKOWSKI_SOURCES)) $(LDLIBS) -o $@
|
|
|
|
.PHONY: hip-psf-replay
|
|
hip-psf-replay: $(BUILD_DIR)/replay_psf
|
|
$(BUILD_DIR)/replay_psf: tests/replay_psf.hip src/hip_psf.hip src/hip_psf.h src/optics.h $(OBJECT_DIR)/$(HDR_BUILD_TAG)/src/optics.o | $(BUILD_DIR)
|
|
$(HIPCC) $(HIP_CXXFLAGS) $(OPENMP_FLAGS) -Isrc -x hip $< -x none $(filter %.o,$^) $(LDLIBS) $(HDR_LDLIBS) -o $@
|
|
|
|
$(BUILD_DIR)/make_psf_fixture: tests/make_psf_fixture.c src/optics.c src/optics.h | $(BUILD_DIR)
|
|
$(CC) $(CPPFLAGS) $(CFLAGS) $(BUILD_CFLAGS) $(OPENMP_FLAGS) -Isrc $< src/optics.c $(LDLIBS) -o $@
|