Makefiles : checking dependencies beforehand && added help text

This commit is contained in:
saundersp 2024-04-27 20:50:50 +02:00
parent ff8142e678
commit 226df0882c
2 changed files with 160 additions and 55 deletions

View File

@ -1,80 +1,135 @@
CC := nvcc -m64 -std=c++17 -ccbin g++-12 -Xcompiler -m64,-std=c++17 CC := nvcc -m64 -t=0 -std=c++17 -Xcompiler -m64,-std=c++17
OBJ_DIR := bin OBJ_DIR := bin
$(shell mkdir -p $(OBJ_DIR))
MODELS_DIR := models MODELS_DIR := models
OUT_DIR := out OUT_DIR := out
SRC_DIR := . SRC_DIR := .
#CFLAGS := -O0 -Werror=all-warnings -g -G
#CFLAGS := $(CFLAGS) -pg
#CFLAGS := $(CFLAGS) -Xptxas=-w
#CFLAGS := $(CFLAGS) -Xcompiler -Wall,-O0,-g,-Werror,-Werror=implicit-fallthrough=0,-Wextra,-rdynamic
CFLAGS := -O4 -Xcompiler -O4
DATA_PATH := ../data DATA_PATH := ../data
#CFLAGS := -O0 -g -G -Xptxas=-w -Xcompiler -O0,-rdynamic,-g
#CFLAGS := -O0 -g -G -pg -Xptxas=-w -Xcompiler -O0,-rdynamic,-g
CFLAGS := -dlto -O2 -Xcompiler -O2
#CFLAGS := -dlto -O2 -g -Xcompiler -O2,-g,-ggdb
CFLAGS := $(CFLAGS) -MMD -MP -Werror=all-warnings -Xcompiler -Wall,-Werror,-Werror=implicit-fallthrough=0,-Wextra
EXEC := $(OBJ_DIR)/ViolaJones EXEC := $(OBJ_DIR)/ViolaJones
SRC := $(shell find $(SRC_DIR) -name "*.cpp" -o -name "*.cu" )
DATA := $(DATA_PATH)/X_train.bin $(DATA_PATH)/X_test.bin $(DATA_PATH)/y_train.bin $(DATA_PATH)/y_test.bin DATA := $(DATA_PATH)/X_train.bin $(DATA_PATH)/X_test.bin $(DATA_PATH)/y_train.bin $(DATA_PATH)/y_test.bin
SRC := $(shell find $(SRC_DIR) -name '*.cpp' -o -name '*.cu' )
OBJ_EXT := o OBJ_EXT := o
ifeq ($(OS), Windows_NT) ifeq ($(OS), Windows_NT)
EXEC:=$(EXEC).exe EXEC := $(EXEC).exe
OBJ_EXT:=obj OBJ_EXT := obj
endif endif
OBJ := $(SRC:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.$(OBJ_EXT)) OBJ := $(SRC:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.$(OBJ_EXT))
OBJ := $(OBJ:$(SRC_DIR)/%.cu=$(OBJ_DIR)/%.$(OBJ_EXT)) OBJ := $(OBJ:$(SRC_DIR)/%.cu=$(OBJ_DIR)/%.$(OBJ_EXT))
.PHONY: all start reset clean mrproper debug check .PHONY: all
all: $(EXEC)
all: $(EXEC) $(DATA) $(OBJ_DIR):
@mkdir -v $@
# Compiling host code # Compiling host code
$(OBJ_DIR)/%.$(OBJ_EXT): $(SRC_DIR)/%.cpp $(OBJ_DIR)/%.$(OBJ_EXT): $(SRC_DIR)/%.cpp | $(OBJ_DIR) check-nvcc-works
@echo Compiling $< @echo Compiling $<
@$(CC) $(CFLAGS) -c $< -o $@ @$(CC) $(CFLAGS) -c $< -o $@
# Compiling gpu code # Compiling gpu code
$(OBJ_DIR)/%.$(OBJ_EXT): $(SRC_DIR)/%.cu $(OBJ_DIR)/%.$(OBJ_EXT): $(SRC_DIR)/%.cu | $(OBJ_DIR) check-nvcc-works
@echo Compiling $< @echo Compiling $<
@$(CC) $(CFLAGS) -c $< -o $@ @$(CC) $(CFLAGS) -c $< -o $@
$(EXEC): $(OBJ) $(EXEC): $(OBJ) | check-nvcc-works
@echo Linking objects files to $@ @echo Linking objects files to $@
@$(CC) $(CFLAGS) $^ -o $@ @$(CC) $(CFLAGS) $^ -o $@
$(DATA): $(DATA):
@echo 'Missing $(DATA) files, use downloader first' && exit 1 @echo 'Missing $(DATA) files, use downloader first' && exit 1
.PHONY: start
start: $(EXEC) $(DATA) start: $(EXEC) $(DATA)
@./$(EXEC) @./$(EXEC)
profile: start .PHONY: debug
@gprof $(EXEC) gmon.out | gprof2dot | dot -Tpng -o output.png
#@gprof $(EXEC) gmon.out > analysis.txt
debug: $(EXEC) $(DATA) debug: $(EXEC) $(DATA)
#@cuda-gdb -q $(EXEC) #@cuda-gdb -q $(EXEC)
@gdb -q --tui $(EXEC) @gdb -q --tui $(EXEC)
check: $(EXEC) $(DATA) .PHONY: profile
profile: start | check-gprof-works check-gprof2dot-works check-dot-works
@gprof $(EXEC) gmon.out | gprof2dot | dot -T png -o output.png
.PHONY: check
check: $(EXEC) $(DATA) | check-valgrind-works
@valgrind -q -s --leak-check=full --show-leak-kinds=all $(EXEC) @valgrind -q -s --leak-check=full --show-leak-kinds=all $(EXEC)
cudacheck: $(EXEC) $(DATA) .PHONY: cudacheck
@cuda-memcheck --destroy-on-device-error kernel --tool memcheck --leak-check full --report-api-errors all $(EXEC) cudacheck: $(EXEC) $(DATA) | check-computer-sanitizer-works
#@cuda-memcheck --destroy-on-device-error kernel --tool racecheck --racecheck-report all $(EXEC) @compute-sanitizer --destroy-on-device-error kernel --tool memcheck --leak-check full --report-api-errors all --track-stream-ordered-races all --target-processes all $(EXEC)
#@cuda-memcheck --destroy-on-device-error kernel --tool initcheck --track-unused-memory yes $(EXEC) #@compute-sanitizer --destroy-on-device-error kernel --tool racecheck --racecheck-detect-level info --racecheck-report all $(EXEC)
#@cuda-memcheck --destroy-on-device-error kernel --tool synccheck $(EXEC) #@compute-sanitizer --destroy-on-device-error kernel --tool initcheck --track-unused-memory yes $(EXEC)
#@compute-sanitizer --destroy-on-device-error kernel --tool memcheck --leak-check full --report-api-errors all --track-stream-ordered-races all $(EXEC) #@compute-sanitizer --destroy-on-device-error kernel --tool synccheck $(EXEC)
#@compute-sanitizer --destroy-on-device-error kernel --tool racecheck --racecheck-detect-level info --racecheck-report all $(EXEC)
#@compute-sanitizer --destroy-on-device-error kernel --tool initcheck --track-unused-memory yes $(EXEC)
#@compute-sanitizer --destroy-on-device-error kernel --tool synccheck $(EXEC)
r2: $(EXEC) $(DATA) .PHONY: log
@r2 $(EXEC) log: $(DATA) reset
@echo 'Building GPU'
@sed -i 's/GPU_BOOSTED false/GPU_BOOSTED true/' config.hpp
@make -s -j "$(shell nproc)"
@echo 'Logging GPU'
@make -s start > log_gpu
@echo 'Building CPU'
@sed -i 's/GPU_BOOSTED true/GPU_BOOSTED false/' config.hpp
@make -s -j "$(shell nproc)"
@echo 'Logging CPU'
@make -s start > log_cpu
@sed -i 's/GPU_BOOSTED false/GPU_BOOSTED true/' config.hpp
@echo 'Cleaning up'
@make -s reset
.PHONY: reset
reset: reset:
@echo Deleting generated states and models @echo 'Deleting generated states and models'
@rm -rf $(OUT_DIR)/* $(MODELS_DIR)/* | true @rm -frv $(OUT_DIR)/* $(MODELS_DIR)/*
#@ln -sv /mnt/pierre_stuffs/ViolaJones/cpp/models .
#@ln -sv /mnt/pierre_stuffs/ViolaJones/cpp/out .
.PHONY: clean
clean: clean:
@rm $(EXEC) @rm -fv $(EXEC) log_gpu log_cpu
mrproper: .PHONY: mrproper
@rm -r $(OBJ_DIR) mrproper: clean
@rm -rfv $(OBJ_DIR) gmon.out
.PHONY: help
help:
@echo "Available targets:"
@echo "\tall: alias for start, (default target)"
@echo "\tstart: Start the ViolaJones algorithm, require data beforehand downloaded by the downloader."
@echo "\tdebug: Debug the ViolaJones algorithm, require data beforehand downloaded by the downloader."
@echo "\tprofile: Profile the ViolaJones algorithm functions timestamps, require data beforehand downloaded by the downloader."
@echo "\treset: Will delete any saved models and processed data made by ViolaJones."
@echo "\tmrproper: Will remove cpp binary files. Will execute reset target beforehand."
.PHONY: check-nvcc-works
check-nvcc-works:
@nvcc --version >/dev/null 2>&1 || (echo 'Please install NVIDIA Cuda compiler.' && exit 1)
.PHONY: check-gprof-works
check-gprof-works:
@gprof --version >/dev/null 2>&1 || (echo 'Please install GNU gprof.' && exit 1)
.PHONY: check-gprof2dot-works
check-gprof2dot-works:
@gprof2dot --help >/dev/null 2>&1 || (echo 'Please install gprof2dot.' && exit 1)
.PHONY: check-dot-works
check-dot-works:
@dot --version >/dev/null 2>&1 || (echo 'Please install dot from graphviz.' && exit 1)
.PHONY: check-valgrind-works
check-valgrind-works:
@valgrind --version >/dev/null 2>&1 || (echo 'Please install valgrind.' && exit 1)
.PHONY: check-computer-sanitizer-works
check-computer-sanitizer-works:
@computer-sanitizer --version >/dev/null 2>&1 || (echo 'Please install Compute Sanitizer from Cuda toolkit.' && exit 1)
-include $(OBJ:.o=.d)

View File

@ -1,35 +1,85 @@
MODELS_DIR := models
OUT_DIR := out
DATA_PATH := ../data DATA_PATH := ../data
DATA := $(DATA_PATH)/X_train.bin $(DATA_PATH)/X_test.bin $(DATA_PATH)/y_train.bin $(DATA_PATH)/y_test.bin DATA := $(DATA_PATH)/X_train.bin $(DATA_PATH)/X_test.bin $(DATA_PATH)/y_train.bin $(DATA_PATH)/y_test.bin
.PHONY: all start reset .PHONY: all
all: venv
all: ${DATA}
$(DATA): $(DATA):
@echo 'Missing $(DATA) files, use downloader first' && exit 1 @echo 'Missing $(DATA) files, use downloader first' && exit 1
.PHONY: venv
venv: venv:
@bash -c 'source activate.sh' @sh -c '. ./activate.sh'
start: ${DATA} venv .PHONY: start
@bash -c 'source activate.sh && python projet.py' start: $(DATA) | venv check-python-works
@sh -c '. ./activate.sh && python projet.py'
reset: .PHONY: debug
@echo Deleting generated states and models debug: $(DATA) | venv check-python-works check-pudb-works
@rm -rf out/* models/* | true
debug:
@bash -c 'source activate.sh && pudb projet.py' @bash -c 'source activate.sh && pudb projet.py'
profile: .PHONY: profile
@bash -c 'source activate.sh && python -m cProfile -o prof.out projet.py && gprof2dot -f pstats prof.out | dot -Tpng -o output.png' profile: $(DATA) | venv check-python-works check-gprof2dot-works check-dot-works
@bash -c 'source activate.sh && python -m cProfile -o prof.out projet.py && gprof2dot -f pstats prof.out | dot -T png -o output.png'
mrproper: reset .PHONY: log
@rm -r __pycache__ venv log: $(DATA) reset | venv
@sed -i 's/GPU_BOOSTED: Final = False/GPU_BOOSTED: Final = True/;s/COMPILE_WITH_C: Final = False/COMPILE_WITH_C: Final = True/' config.py
@echo 'Logging GPU'
@make -s start > log_gpu
@sed -i 's/GPU_BOOSTED: Final = True/GPU_BOOSTED: Final = False/' config.py
@echo 'Logging CPU'
@make -s start > log_cpu
@sed -i 's/GPU_BOOSTED: Final = False/GPU_BOOSTED: Final = True/;s/COMPILE_WITH_C: Final = True/COMPILE_WITH_C: Final = False/' config.py
@echo 'Logging PGPU'
@make -s start > log_pgpu
@sed -i 's/GPU_BOOSTED: Final = True/GPU_BOOSTED: Final = False/' config.py
@echo 'Logging PY'
@make -s start > log_py
@echo 'Cleaning up'
@make -s reset
test: .PHONY: reset
@bash -c 'source activate.sh && ls out | sed s/.pkl// | xargs -n1 python test_diff.py out' reset:
@bash -c 'source activate.sh && ls models | sed s/.pkl// | xargs -n1 python test_diff.py models' @echo 'Deleting generated states and models'
@rm -frv $(OUT_DIR)/* $(MODELS_DIR)/*
#@ln -sv /mnt/pierre_stuffs/ViolaJones/python/models .
#@ln -sv /mnt/pierre_stuffs/ViolaJones/python/out .
.PHONY: clean
clean:
@rm -fv log_gpu log_cpu log_gpu log_py
.PHONY: mrproper
mrproper: clean
@rm -rfv __pycache__ venv
.PHONY: help
help: help:
@echo "all start reset mrproper help" @echo "Available targets:"
@echo "\tall: alias for start, (default target)"
@echo "\tvenv: Create python virtual environnement."
@echo "\tstart: Start the ViolaJones algorithm, require data beforehand downloaded by the downloader."
@echo "\tdebug: Debug the ViolaJones algorithm, require data beforehand downloaded by the downloader."
@echo "\tprofile: Profile the ViolaJones algorithm functions timestamps, require data beforehand downloaded by the downloader."
@echo "\treset: Will delete any saved models and processed data made by ViolaJones."
@echo "\tmrproper: Will remove cpp binary files. Will execute reset target beforehand."
.PHONY: check-python-works
check-python-works:
@python --version >/dev/null 2>&1 || (echo 'Please install Python.' && exit 1)
.PHONY: check-pudb-works
check-pudb-works:
@pudb --version >/dev/null 2>&1 || (echo 'Please install pudb.' && exit 1)
.PHONY: check-gprof2dot-works
check-gprof2dot-works:
@gprof2dot --help >/dev/null 2>&1 || (echo 'Please install gprof2dot.' && exit 1)
.PHONY: check-dot-works
check-dot-works:
@dot --version >/dev/null 2>&1 || (echo 'Please install dot from graphviz.' && exit 1)