From 14ead65f3db3875789082dff0723d7b2c6b83dda Mon Sep 17 00:00:00 2001 From: Avril Date: Mon, 23 Nov 2020 02:06:43 +0000 Subject: [PATCH] start pgo target --- Makefile | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++-- profile/gen | 33 +++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 2 deletions(-) create mode 100755 profile/gen diff --git a/Makefile b/Makefile index 1d29dba..4799328 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,18 @@ DEBUG_LDFLAGS?= -O0 CFLAGS+= $(FEAT_CFLAGS) -Wall -pedantic --std=gnu11 $(addprefix -I,$(INCLUDE)) LDFLAGS+= $(FEAT_LDFLAGS) +# PGO specific vars + +PROF_ITERATIONS=1000 +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 @@ -25,12 +36,18 @@ release: | dirs $(PROJECT)-release .PHONY: debug debug: | dirs $(PROJECT)-debug +.PHONY: pgo +pgo: | dirs $(PROJECT)-pgo + dirs: - @mkdir -p obj/src + @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) @@ -42,6 +59,42 @@ $(PROJECT)-debug: LDFLAGS := $(DEBUG_LDFLAGS) $(LDFLAGS) $(PROJECT)-debug: $(OBJ) $(CC) $^ $(CFLAGS) -o $@ $(LDFLAGS) +pgo-generate: $(PGO_OBJ) + $(CC) -c $< $(CFLAGS) $(PROF_FLAGS) -o $@ $(LDFLAGS) $(PROF_FLAGS) + +pgo-reset: + find ./prof -name \*.gcda -exec rm {} + + +pgo-profile: | pgo-reset pgo-generate + @mkdir -p $(PROF_LOCATION)/{large,small} + #./profile/gen $(PROF_LARGE_BOUND) "$(PROF_LOCATION)/large" + #./profile/gen $(PROF_SMALL_BOUND) "$(PROF_LOCATION)/small" + for i in {1..$(PROF_ITERATIONS)}; do \ + ./profile/gen $(PROF_LARGE_BOUND) "$(PROF_LOCATION)/large"; \ + ./profile/gen $(PROF_SMALL_BOUND) "$(PROF_LOCATION)/small"; \ + ./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; \ + #TODO: More combinations \ + done + 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 +pgo-use: $(PGO_OBJ) + $(CC) -c $< $(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: - rm -rf obj + rm -rf {obj,prof} rm -f $(PROJECT)-{release,debug} diff --git a/profile/gen b/profile/gen new file mode 100755 index 0000000..e6563d8 --- /dev/null +++ b/profile/gen @@ -0,0 +1,33 @@ +#!/bin/bash + +# Generate 100 matching +bound=$1 + +ITERATIONS=${ITERATIONS:-100} +BREAK_AT=50 + +cd $2 || exit 1 + +echo ">>> Generating ${ITERATIONS} matching files" +mkdir matching +dd if=/dev/urandom of=./matching/0 bs=$bound count=1 >> /dev/null 2>&1 || exit 1 +pushd matching >>/dev/null + for i in $(seq 1 ${ITERATIONS}); do + cp -f 0 $i || exit 1 + done +popd >>/dev/null + +echo ">>> Generatig ${ITERATIONS} with unmatching file" +mkdir unmatching +dd if=/dev/urandom of=./unmatching/0 bs=$bound count=1 >> /dev/null 2>&1 || exit 1 +pushd unmatching >> /dev/null + for i in $(seq 1 ${ITERATIONS}); do + if [[ $i == ${BREAK_AT} ]]; then + echo " $i < unmatching" + dd if=/dev/urandom of=$i bs=$bound count=1 >>/dev/null 2>&1 || exit + else + cp -f 0 $i || exit 1 + fi + done +popd >> /dev/null +echo ">>> Generated in $2"