SRC = $(wildcard src/*.c) INCLUDE=include PROJECT=fcmp OPT_FLAGS_RUST?= -C target-cpu=native OPT_FLAGS?= -march=native -fgraphite -fopenmp -floop-parallelize-all -ftree-parallelize-loops=4 \ -floop-interchange -ftree-loop-distribution -floop-strip-mine -floop-block FEAT_RUST?= threads FEAT_CFLAGS?= -D_RUN_THREADED=0 FEAT_LDFLAGS?= -lpthread RELEASE_CFLAGS?= -O3 -flto $(OPT_FLAGS) RELEASE_LDFLAGS?= -O3 -flto DEBUG_CFLAGS?= -DDEBUG -O0 -g DEBUG_LDFLAGS?= -O0 CFLAGS+= $(FEAT_CFLAGS) -Wall -pedantic --std=gnu11 $(addprefix -I,$(INCLUDE)) LDFLAGS+= $(FEAT_LDFLAGS) # PGO specific vars PROF_ITERATIONS=50 PROF_LARGE_BOUND= $$(( 1024 * 1024 * 10 )) PROF_SMALL_BOUND= $$(( 1024 * 10 )) PROF_LOCATION?=/tmp/fcmp-pgo PROF_FLAGS = -fprofile-generate OBJ = $(addprefix obj/,$(SRC:.c=.o)) PGO_OBJ = $(addprefix prof/,$(SRC:.c=.o)) .PHONY: release release: | dirs $(PROJECT)-release .PHONY: debug debug: | dirs $(PROJECT)-debug .PHONY: pgo pgo: | dirs $(PROJECT)-pgo .PHONY: rs rs: | $(PROJECT)-rs dirs: @mkdir -p {obj,prof}/src obj/%.o: %.c $(CC) -c $< $(CFLAGS) -o $@ $(LDFLAGS) prof/%.o: %.c $(CC) -c $< $(CFLAGS) $(PROF_FLAGS) -o $@ $(LDFLAGS) $(PROF_FLAGS) $(PROJECT)-release: CFLAGS := $(RELEASE_CFLAGS) $(CFLAGS) $(PROJECT)-release: LDFLAGS := $(RELEASE_LDFLAGS) $(LDFLAGS) $(PROJECT)-release: $(OBJ) $(CC) $^ $(CFLAGS) -o $@ $(LDFLAGS) strip $@ $(PROJECT)-debug: CFLAGS := $(DEBUG_CFLAGS) $(CFLAGS) $(PROJECT)-debug: LDFLAGS := $(DEBUG_LDFLAGS) $(LDFLAGS) $(PROJECT)-debug: $(OBJ) $(CC) $^ $(CFLAGS) -o $@ $(LDFLAGS) $(PROJECT)-rs: cd fcmprs && OPT_FLAGS="$(OPT_FLAGS_RUST)" CARGO_FEATURES="$(FEAT_RUST)" $(MAKE) cp -f ./fcmprs/target/release/fcmprs $@ pgo-generate: CFLAGS := $(RELEASE_CFLAGS) $(CFLAGS) pgo-generate: LDFLAGS := $(RELEASE_LDFLAGS) $(LDFLAGS) pgo-generate: $(PGO_OBJ) $(CC) $^ $(CFLAGS) $(PROF_FLAGS) -o $@ $(LDFLAGS) $(PROF_FLAGS) pgo-reset: find ./prof -name \*.gcda -exec rm {} + pgo-profile: | pgo-generate pgo-reset #./profile/gen $(PROF_LARGE_BOUND) "$(PROF_LOCATION)/large" #./profile/gen $(PROF_SMALL_BOUND) "$(PROF_LOCATION)/small" for i in {1..$(PROF_ITERATIONS)}; do \ rm -rf $(PROF_LOCATION); \ mkdir -p $(PROF_LOCATION)/{large,small}; \ printf "Iteration $$i of $(PROF_ITERATIONS)\r"; \ ./profile/gen $(PROF_LARGE_BOUND) "$(PROF_LOCATION)/large" >> /dev/null; \ ./profile/gen $(PROF_SMALL_BOUND) "$(PROF_LOCATION)/small" >> /dev/null; \ ./pgo-generate $(PROF_LOCATION)/large/matching/* & > $(PROF_LOCATION)/stdout; \ ./pgo-generate $(PROF_LOCATION)/large/unmatching/* & > $(PROF_LOCATION)/stdout; \ ./pgo-generate $(PROF_LOCATION)/small/matching/* & > $(PROF_LOCATION)/stdout; \ ./pgo-generate $(PROF_LOCATION)/small/unmatching/* & > $(PROF_LOCATION)/stdout; \ \ ./pgo-generate $(PROF_LOCATION)/small/matching/{1,2} & > $(PROF_LOCATION)/stdout; \ ./pgo-generate $(PROF_LOCATION)/large/matching/{1,2} & > $(PROF_LOCATION)/stdout; \ ./pgo-generate $(PROF_LOCATION)/small/unmatching/{1,2} & > $(PROF_LOCATION)/stdout; \ ./pgo-generate $(PROF_LOCATION)/large/unmatching/{1,2} & > $(PROF_LOCATION)/stdout; \ wait; \ rm -rf $(PROF_LOCATION)/{large,small}; \ done @echo "" rm -rf $(PROF_LOCATION) rm pgo-generate pgo-use: CFLAGS := $(RELEASE_CFLAGS) $(CFLAGS) pgo-use: LDFLAGS := $(RELEASE_LDFLAGS) $(LDFLAGS) pgo-use: PROF_FLAGS = -fprofile-use -fprofile-correction pgo-use: $(PGO_OBJ) $(CC) $^ $(CFLAGS) $(PROF_FLAGS) -o $@ $(LDFLAGS) $(PROF_FLAGS) $(PROJECT)-pgo: CFLAGS := $(RELEASE_CFLAGS) $(CFLAGS) $(PROJECT)-pgo: LDFLAGS := $(RELEASE_LDFLAGS) $(LDFLAGS) $(PROJECT)-pgo: pgo-profile find ./prof -name \*.o -exec rm {} + $(MAKE) pgo-use mv pgo-use $@ strip $@ clean: cd fcmprs && make clean rm -rf {obj,prof} rm -f $(PROJECT)-{release,debug,pgo,rs}