# Standalone kernel harness (no backend linked).
#   nice make -j4          build test + bench into $(OUT)
#   make test [N=2]        N million random iterations per kernel family + exhaustive grid
#   make bench             throughput per level (under flock /tmp/sift-perf.lock)
#   make bench-col         the same for the column kernels (src/col/kern*.c)
#   make bench-shred       the shredder kernels (src/col/shred_kern*.c) against their composition from the shared slots
#   make SANITIZE=1 test   ASan + UBSan build (into $(OUT)-san)
#   make colodd [R=20]     the column kernels at lengths 0..4097 around every vector width, on exact-size buffers (use SANITIZE=1)
OUT     ?= /tmp/sift-kernels-tools
N       ?= 2

LIB      = $(SRC)/bm25/kernels.c $(SRC)/bm25/kernels_avx2.c $(SRC)/bm25/kernels_avx512.c $(SRC)/bm25/kernels_neon.c \
           $(SRC)/col/kern.c $(SRC)/col/kern_avx2.c $(SRC)/col/kern_avx512.c $(SRC)/col/kern_neon.c \
           $(SRC)/col/shred_kern.c $(SRC)/col/shred_kern_avx2.c $(SRC)/col/shred_kern_avx512.c $(SRC)/col/shred_kern_neon.c \
           $(SRC)/col/codec_kern.c $(SRC)/col/codec_avx2.c $(SRC)/col/codec_avx512.c $(SRC)/col/codec_neon.c \
           $(SRC)/agg/kern.c $(SRC)/agg/kern_avx2.c $(SRC)/agg/kern_avx512.c $(SRC)/agg/kern_neon.c \
           $(SRC)/bm25/bitmap_scalar.c $(SRC)/bm25/bitmap_avx2.c $(SRC)/bm25/bitmap_avx512.c $(SRC)/bm25/bitmap_neon.c
HDR      = $(SRC)/bm25/kernels.h $(SRC)/bm25/kernels_int.h $(SRC)/col/kern.h $(SRC)/col/kern_int.h $(SRC)/col/shred.h $(SRC)/agg/kern.h $(SRC)/col/codec.h $(SRC)/col/codec_int.h $(SRC)/col/codec_vec.h harness.h

include ../tools.mk

$(OUT)/bench: $(OUT)/bench.o $(OUT)/bench_col.o $(OUT)/bench_shred.o $(OUT)/alt.o $(OBJ)
	$(CC) $(CFLAGS) -o $@ $^ $(LDLIBS)

$(OUT)/colodd: $(OUT)/colodd.o $(OBJ)
	$(CC) $(CFLAGS) -o $@ $^ $(LDLIBS)

colodd: $(OUT)/colodd
	$(OUT)/colodd $(R)

bench-col: $(OUT)/bench
	$(FLOCK) $(OUT)/bench col

bench-shred: $(OUT)/bench
	$(FLOCK) $(OUT)/bench shred

.PHONY: bench-col bench-shred colodd
