136 lines
4.6 KiB
Makefile
136 lines
4.6 KiB
Makefile
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,-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)
|
|
|
|
.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)
|