X-Git-Url: http://rtime.felk.cvut.cz/gitweb/hercules2020/kcf.git/blobdiff_plain/2f9aabee8d26447a983e4fc03e138c22f167ab76..HEAD:/Makefile diff --git a/Makefile b/Makefile index fc930dc..322196b 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,23 @@ # Makefile to build all the available variants BUILDS = opencvfft-st opencvfft-async opencvfft-openmp fftw fftw-async fftw-openmp fftw-big fftw-big-openmp cufftw cufftw-big cufftw-big-openmp cufft cufft-openmp cufft-big cufft-big-openmp -TESTSEQ = bag ball1 car1 -TESTFLAGS = default fit128 +TESTSEQ = bmx ball1 crossing racing book +TESTFLAGS = default fit -all: $(foreach build,$(BUILDS),build-$(build)/kcf_vot) +all: $(BUILDS) -CMAKE_OPTS += -G Ninja +print_%: + @$(foreach v,$($*),echo $(v);) + +ninja: build.ninja + ninja + +$(BUILDS): build.ninja + ninja build-$@/build.ninja + ninja -C $(CURDIR)/build-$@ + +clean: build.ninja + ninja $@ ## Useful setting - uncomment and modify as needed # CMAKE_OPTS += -DOpenCV_DIR=~/opt/opencv-2.4/share/OpenCV @@ -14,6 +25,7 @@ CMAKE_OPTS += -G Ninja # export CC=gcc-5 # export CXX=g++-5 # export CUDA_BIN_PATH=/usr/local/cuda-9.0 +# export CUDA_ARCH_LIST=6.2 CMAKE_OTPS_opencvfft-st = -DFFT=OpenCV CMAKE_OTPS_opencvfft-async = -DFFT=OpenCV -DASYNC=ON @@ -23,57 +35,20 @@ CMAKE_OTPS_fftw-openmp = -DFFT=fftw -DOPENMP=ON CMAKE_OTPS_fftw-async = -DFFT=fftw -DASYNC=ON CMAKE_OTPS_fftw-big = -DFFT=fftw -DBIG_BATCH=ON CMAKE_OTPS_fftw-big-openmp = -DFFT=fftw -DBIG_BATCH=ON -DOPENMP=ON -CMAKE_OTPS_cufftw = -DFFT=cuFFTW -CMAKE_OTPS_cufftw-big = -DFFT=cuFFTW -DBIG_BATCH=ON -CMAKE_OTPS_cufftw-big-openmp = -DFFT=cuFFTW -DBIG_BATCH=ON -DOPENMP=ON -CMAKE_OTPS_cufft = -DFFT=cuFFT -CMAKE_OTPS_cufft-openmp = -DFFT=cuFFT -DOPENMP=ON -CMAKE_OTPS_cufft-big = -DFFT=cuFFT -DBIG_BATCH=ON -CMAKE_OTPS_cufft-big-openmp = -DFFT=cuFFT -DBIG_BATCH=ON -DOPENMP=ON - -.SECONDARY: $(BUILDS:%=build-%/build.ninja) - -build-%/build.ninja: - @echo '############################################################' - mkdir -p $(@D) - cd $(@D) && cmake $(CMAKE_OPTS) $(CMAKE_OTPS_$*) .. - -.PHONY: FORCE -build-%/kcf_vot: build-%/build.ninja $(shell git ls-files) - @echo '############################################################' - cmake --build $(@D) - -$(BUILDS): %: build-%/kcf_vot - -clean: - rm -rf $(BUILDS:%=build-%) +CMAKE_OTPS_cufftw = -DFFT=cuFFTW $(if $(CUDA_ARCH_LIST),-DCUDA_ARCH_LIST='$(CUDA_ARCH_LIST)') +CMAKE_OTPS_cufftw-big = -DFFT=cuFFTW $(if $(CUDA_ARCH_LIST),-DCUDA_ARCH_LIST='$(CUDA_ARCH_LIST)') -DBIG_BATCH=ON +CMAKE_OTPS_cufftw-big-openmp = -DFFT=cuFFTW $(if $(CUDA_ARCH_LIST),-DCUDA_ARCH_LIST='$(CUDA_ARCH_LIST)') -DBIG_BATCH=ON -DOPENMP=ON +CMAKE_OTPS_cufft = -DFFT=cuFFT $(if $(CUDA_ARCH_LIST),-DCUDA_ARCH_LIST='$(CUDA_ARCH_LIST)') +CMAKE_OTPS_cufft-openmp = -DFFT=cuFFT $(if $(CUDA_ARCH_LIST),-DCUDA_ARCH_LIST='$(CUDA_ARCH_LIST)') -DOPENMP=ON +CMAKE_OTPS_cufft-big = -DFFT=cuFFT $(if $(CUDA_ARCH_LIST),-DCUDA_ARCH_LIST='$(CUDA_ARCH_LIST)') -DBIG_BATCH=ON +CMAKE_OTPS_cufft-big-openmp = -DFFT=cuFFT $(if $(CUDA_ARCH_LIST),-DCUDA_ARCH_LIST='$(CUDA_ARCH_LIST)') -DBIG_BATCH=ON -DOPENMP=ON ########################## ### Tests ########################## -print-test-results = grep ^Average $(1)|sed -E -e 's|build-(.*)/kcf_vot-(.*).log:|\2;\1;|'|sort|column -t -s';' - -test: $(BUILDS:%=test-%) - @echo; echo "Summary test results:" - @$(call print-test-results,$(foreach build,$(BUILDS),\ - $(foreach seq,$(TESTSEQ),\ - $(foreach f,$(TESTFLAGS),build-$(build)/kcf_vot-$(seq)-$(f).log)))) - -$(BUILDS:%=test-%): test-%: - @$(call print-test-results,$(foreach seq,$(TESTSEQ),\ - $(foreach f,$(TESTFLAGS),build-$*/kcf_vot-$(seq)-$(f).log))) - -# Usage: testcase -define testcase -test-$(1): test-$(1)-$(2) -test-$(1)-$(2): $(foreach f,$(TESTFLAGS),build-$(1)/kcf_vot-$(2)-$(f).log) -$(foreach f,$(TESTFLAGS),build-$(1)/kcf_vot-$(2)-$(f).log): build-$(1)/kcf_vot $$(filter-out %/output.txt,$$(wildcard vot2016/$(2)/*)) | vot2016/$(2) - $$< $$(if $$(@:%fit128.log=),,--fit=128) vot2016/$(2) > $$@ -# cat $$@ -endef - -$(foreach build,$(BUILDS),$(foreach seq,$(TESTSEQ),$(eval $(call testcase,$(build),$(seq))))) +test $(BUILDS:%=test-%) $(SEQ:%=test-%): build.ninja + ninja $@ vot2016 $(TESTSEQ:%=vot2016/%): vot2016.zip unzip -d vot2016 -q $^ @@ -82,7 +57,7 @@ vot2016 $(TESTSEQ:%=vot2016/%): vot2016.zip .INTERMEDIATE: vot2016.zip .SECONDARY: vot2016.zip vot2016.zip: - wget http://data.votchallenge.net/vot2016/vot2016.zip + wget --progress=dot:giga -O $@ http://data.votchallenge.net/vot2016/vot2016.zip ################### # Ninja generator # @@ -93,27 +68,87 @@ vot2016.zip: # compiles all variants in the same ways as this makefile, but faster. # The down side is that the build needs about 10 GB of memory. -ninja: build.ninja - ninja -# Ninja generator - to have faster parallel builds +# Define echo depending on whether make supports the $(file) function. +$(file >.test.file) +ifneq ($(wildcard .test.file),) + echo = $(file $(1),$(2)) +else + define nl + + + endef + echo = echo $(1) '$(subst $(nl),\n,$(subst \,\\,$(2)))'; +endif + +# Ninja generator - to have faster parallel builds and tests .PHONY: build.ninja -build.ninja: - $(file >$@,$(ninja-rule)) - $(foreach build,$(BUILDS),$(file >>$@,$(call ninja-build,$(build),$(CMAKE_OTPS_$(build))))) + +build.ninja:: $(MAKEFILE_LIST) + @echo "Generating $@" + @$(call echo,>$@,$(ninja-rule)) + @$(foreach build,$(BUILDS),\ + $(call echo,>>$@,$(call ninja-build,$(build),$(CMAKE_OTPS_$(build))))) + @$(foreach build,$(BUILDS),$(foreach seq,$(TESTSEQ),$(foreach f,$(TESTFLAGS),\ + $(call echo,>>$@,$(call ninja-testcase,$(build),$(seq),$(f)))$(nl)))) + @$(call echo,>>$@,build test: PRINT_RESULTS $(foreach build,$(BUILDS),$(foreach seq,$(TESTSEQ),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f))))) | print-test-results) + @$(foreach build,$(BUILDS),$(call echo,>>$@,build test-$(build): PRINT_RESULTS $(foreach seq,$(TESTSEQ),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f)))) | print-test-results)) + @$(foreach seq,$(TESTSEQ),$(call echo,>>$@,build test-$(seq): PRINT_RESULTS $(foreach build,$(BUILDS),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f)))) | print-test-results)) + @$(call echo,>>$@,build plot: PLOT_RESULTS $(foreach build,$(BUILDS),$(foreach seq,$(TESTSEQ),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f))))) | graphGen.sh) + @$(foreach build,$(BUILDS),$(call echo,>>$@,build plot-$(build): PLOT_RESULTS $(foreach seq,$(TESTSEQ),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f)))) | graphGen.sh)) + @$(foreach seq,$(TESTSEQ),$(call echo,>>$@,build plot-$(seq): PLOT_RESULTS $(foreach build,$(BUILDS),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f)))) | graphGen.sh)) + @$(foreach seq,$(TESTSEQ),$(call echo,>>$@,build vot2016/$(seq): MAKE)) + +ninja-test = build-$(1)/kcf_vot-$(2)-$(3).log define ninja-rule -rule cmake - command = cd $$$$(dirname $$out) && cmake $(CMAKE_OPTS) $$opts .. - description = CMake $$out -rule ninja +rule REGENERATE + command = MAKEFLAGS='$(MAKEFLAGS)' $(MAKE) $$out + description = Regenerating $$out + generator = 1 +rule CMAKE + command = cd $$subdir && cmake -G Ninja $(CMAKE_OPTS) $$opts .. +rule NINJA # Absolute path in -C allows Emacs to properly jump to error message locations - command = ninja -C `realpath $$$$(dirname $$out)` - description = Ninja $$out + command = ninja -C $(CURDIR)/$$subdir + restat = 1 +rule TEST_SEQ + # Errors are ignored - they will be reported by PRINT_RESULTS + command = build-$$build/kcf_vot $$flags $$seq $(if $(TRAVIS),2>&1) >$$out $(if $(TRAVIS),| grep -v libdc1394); true +rule PRINT_RESULTS + description = Print results + command = ./wvtool -w120 -v run ./print-test-results $$in +rule PLOT_RESULTS + description = Plot results + command = ./graphGen.sh -f -s $$in +rule MAKE + command = make $$out + pool = make +pool make + depth = 1 +rule CLEAN +# command = /usr/bin/ninja -t clean -r NINJA + description = Cleaning all built files... + command = rm -rf $(BUILDS:%=build-%) +build clean: CLEAN +build build.ninja: REGENERATE $(MAKEFILE_LIST) endef +GIT_LS_FILES := $(shell git ls-files) + define ninja-build -build build-$(1)/build.ninja: cmake +build build-$(1)/build.ninja: CMAKE opts = $(2) -build build-$(1)/kcf_vot: ninja build-$(1)/build.ninja build.ninja + subdir = build-$(1) +build build-$(1)/kcf_vot: NINJA build-$(1)/build.ninja $(GIT_LS_FILES) + subdir = build-$(1) +default build-$(1)/kcf_vot +endef + +# Usage: ninja-testcase +define ninja-testcase +build build-$(1)/kcf_vot-$(2)-$(3).log: TEST_SEQ build-$(1)/kcf_vot $(filter-out %/output.txt,$(wildcard vot2016/$(2)/*)) vot2016/$(2) + build = $(1) + seq = vot2016/$(2) + flags = $(if $(3:fit128=),,--fit=128)$(if $(3:fit=),,--fit) endef