CC := nvcc -m64 -t=0 -std=c++17 -Xcompiler -m64,-std=c++17 OBJ_DIR := bin MODELS_DIR := models OUT_DIR := out SRC_DIR := . 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 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 ifeq ($(OS), Windows_NT) EXEC := $(EXEC).exe OBJ_EXT := obj endif OBJ := $(SRC:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.$(OBJ_EXT)) OBJ := $(OBJ:$(SRC_DIR)/%.cu=$(OBJ_DIR)/%.$(OBJ_EXT)) .PHONY: all all: $(EXEC) $(OBJ_DIR): @mkdir -v $@ # Compiling host code $(OBJ_DIR)/%.$(OBJ_EXT): $(SRC_DIR)/%.cpp | $(OBJ_DIR) check-nvcc-works @echo Compiling $< @$(CC) $(CFLAGS) -c $< -o $@ # Compiling gpu code $(OBJ_DIR)/%.$(OBJ_EXT): $(SRC_DIR)/%.cu | $(OBJ_DIR) check-nvcc-works @echo Compiling $< @$(CC) $(CFLAGS) -c $< -o $@ # FIXME When using the docker image, Make check prequisites even when the target already exists #$(EXEC): $(OBJ) | check-nvcc-works $(EXEC): $(OBJ) @echo Linking objects files to $@ @$(CC) $(CFLAGS) $^ -o $@ $(DATA): @echo 'Missing $(DATA) files, use downloader first' && exit 1 .PHONY: start start: $(EXEC) $(DATA) @./$(EXEC) .PHONY: debug debug: $(EXEC) $(DATA) #@cuda-gdb -q $(EXEC) @gdb -q --tui $(EXEC) .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) .PHONY: cudacheck cudacheck: $(EXEC) $(DATA) | check-computer-sanitizer-works @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) #@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) .PHONY: log 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: @echo 'Deleting generated states and models' @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: @rm -fv $(EXEC) log_gpu log_cpu .PHONY: mrproper 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)