diff --git a/.gitignore b/.gitignore index 6953907..e84abe3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ test* obj/ hexview +hexview-pgo profile/ diff --git a/Makefile b/Makefile index 33af327..115d4f8 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,18 @@ LDFLAGS+= -lfmt PROJ = hexview OBJ = $(addprefix obj/,$(SRC:.cpp=.o)) -PROF_OBJ = $(addprefix profile/,$(SRC:.cpp=.o)) + +### PGO target specific ### + +# Number of times to run profiling +PGO_ITERATIONS = 512 +# Size in kb of training files +PGO_DATASET_SIZE = $$(( 1024 * 4 )) + +PGO_OBJ = $(addprefix profile/,$(SRC:.cpp=.o)) +PROF_FLAGS = -fprofile-generate + +### .PHONY: all all: dirs $(PROJ) @@ -24,24 +35,38 @@ obj/%.o: %.cpp $(CXX) -c $< $(_HX_FEAT) $(CXXFLAGS) -o $@ $(LDFLAGS) profile/%.o: %.cpp - $(CXX) -c $< $(_HX_FEAT) $(CXXFLAGS) -fprofile-generate -o $@ $(LDFLAGS) + $(CXX) -c $< $(_HX_FEAT) $(CXXFLAGS) $(PROF_FLAGS) -o $@ $(LDFLAGS) $(PROF_FLAGS) $(PROJ): $(OBJ) $(CXX) $^ $(CXXFLAGS) -o $@ $(LDFLAGS) strip $@ -pgo-generate: $(PROF_OBJ) - $(CXX) $^ $(CXXFLAGS) -fprofile-generate -o $@ $(LDFLAGS) +pgo-generate: $(PGO_OBJ) + $(CXX) $^ $(CXXFLAGS) $(PROF_FLAGS) -o $@ $(LDFLAGS) $(PROF_FLAGS) -pgo-profile: pgo-generate - for i in {1..32}; do \ - dd if=/dev/urandom of=./pgo-test bs=1024 count=1024 \ - ./pgo-generate ./pgo-test +pgo-profile: dirs pgo-generate + for i in {1..$(PGO_ITERATIONS)}; do \ + dd if=/dev/urandom of=./pgo-test bs=1024 count=$(PGO_DATASET_SIZE) >> /dev/null 2>&1; \ + printf "\rIteration $$i / $(PGO_ITERATIONS)"; \ + ./pgo-generate ./pgo-test > ./pgo-output; \ done + @echo "" rm ./pgo-test + rm ./pgo-output + rm pgo-generate + + +pgo-use: PROF_FLAGS = -fprofile-use -lgcov +pgo-use: $(PGO_OBJ) + $(CXX) $^ $(CXXFLAGS) $(PROF_FLAGS) -o $@ $(LDFLAGS) $(PROF_FLAGS) + +$(PROJ)-pgo: dirs pgo-profile pgo-use + mv pgo-use $@ + strip $@ clean: rm -f $(PROJ) + rm -f $(PROJ)-pgo rm -rf obj rm -rf profile - rm -f pgo-generate + rm -f pgo-{test,output,generate}