1 cmake_minimum_required(VERSION 2.8)
3 set(KCF_LIB_SRC kcf.cpp kcf.h fft.cpp threadctx.hpp pragmas.h dynmem.hpp debug.cpp)
5 find_package(PkgConfig)
7 SET(FFT "OpenCV" CACHE STRING "Select FFT implementation")
8 SET_PROPERTY(CACHE FFT PROPERTY STRINGS OpenCV fftw cuFFTW cuFFT)
9 MESSAGE(STATUS "FFT implementation: ${FFT}")
11 option(OPENMP "Use OpenMP to paralelize certain portions of code." OFF)
12 option(ASYNC "Use C++ std::async to paralelize certain portions of code." OFF)
13 option(CUDA_DEBUG "Enables error cheking for cuda and cufft. " OFF)
14 option(BIG_BATCH "Execute all FFT calculation in a single batch. This can improve paralelism and reduce GPU offloading overhead." OFF)
17 add_definitions(-DPROFILING )
18 MESSAGE(STATUS "Profiling mode")
22 add_definitions(-DBIG_BATCH )
23 MESSAGE(STATUS "Big_batch mode")
26 IF (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") AND NOT OPENMP)
27 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas")
32 IF(FFT STREQUAL "OpenCV")
33 list(APPEND KCF_LIB_SRC fft_opencv.cpp complexmat.hpp)
34 ELSEIF(FFT STREQUAL "fftw")
35 list(APPEND KCF_LIB_SRC fft_fftw.cpp complexmat.hpp)
36 add_definitions(-DFFTW)
37 pkg_check_modules(FFTW REQUIRED fftw3f)
38 ELSEIF(FFT STREQUAL "cuFFTW")
39 list(APPEND KCF_LIB_SRC fft_fftw.cpp complexmat.hpp)
40 add_definitions(-DFFTW -DCUFFTW)
42 ELSEIF(FFT STREQUAL "cuFFT")
43 list(APPEND KCF_LIB_SRC fft_cufft.cpp complexmat.cuh cuda_functions.cuh complexmat.cu cuda_functions.cu)
44 add_definitions(-DCUFFT)
47 add_definitions(-DCUDA_DEBUG)
48 MESSAGE(STATUS "CUDA debug mode")
51 MESSAGE(FATAL_ERROR "Invalid FFT implementation selected")
54 IF((FFT STREQUAL "OpenCV") AND BIG_BATCH)
55 message(SEND_ERROR "OpenCV version does not support big batch mode.")
58 IF((FFT STREQUAL "cuFFT") AND (ASYNC))
59 message(SEND_ERROR "cuFFT version does not support ASYNC and OpenMP only if used with big batch mode.")
63 add_definitions(-DASYNC)
64 find_package(Threads REQUIRED)
65 MESSAGE(STATUS "ASYNC")
67 add_definitions(-DOPENMP)
68 FIND_PACKAGE(OpenMP REQUIRED CXX)
71 FIND_PACKAGE( OpenCV REQUIRED )
74 find_package(CUDA REQUIRED)
76 include_directories ( ${CUDA_INCLUDE_DIRS} )
77 set(CUDA_SEPARABLE_COMPILATION ON)
78 set(CUDA_PROPAGATE_HOST_FLAGS OFF)
80 if(NOT COMMAND CUDA_SELECT_NVCC_ARCH_FLAGS)
81 include(${CMAKE_SOURCE_DIR}/cmake/FindCUDA/select_compute_arch.cmake)
84 set(CUDA_ARCH_LIST "Auto" CACHE STRING "CUDA GPU architecture for building the code")
85 CUDA_SELECT_NVCC_ARCH_FLAGS(ARCH_FLAGS ${CUDA_ARCH_LIST})
86 list( APPEND CUDA_NVCC_FLAGS -O3 -std=c++11 ${ARCH_FLAGS} --default-stream per-thread) # --gpu-architecture sm_62 )
87 find_cuda_helper_libs(cufftw)
90 add_subdirectory(piotr_fhog)
93 if(FFT STREQUAL "cuFFT")
94 cuda_add_library(kcf STATIC ${KCF_LIB_SRC})
96 add_library(kcf STATIC ${KCF_LIB_SRC})
99 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
100 target_compile_options(kcf PRIVATE -Wno-gnu-zero-variadic-macro-arguments)
104 target_link_libraries(kcf fhog cndata ${OpenCV_LIBS})
105 set_target_properties(kcf PROPERTIES VERSION 1.0.0 SOVERSION 1)
107 IF(FFT STREQUAL "fftw")
108 target_link_libraries(kcf ${FFTW_LDFLAGS})
110 target_link_libraries(kcf fftw3_omp)
112 target_link_libraries(kcf fftw3_threads)
116 IF(FFT STREQUAL "cuFFTW")
117 target_link_libraries(kcf ${CUDA_cufft_LIBRARY} ${CUDA_cufftw_LIBRARY})
120 IF(FFT STREQUAL "cuFFT")
121 target_link_libraries(kcf ${CUDA_cufft_LIBRARY} ${CUDA_cublas_LIBRARY} ${CUDA_LIBRARIES})
125 target_link_libraries(kcf pfm)
129 target_compile_options(kcf PUBLIC ${OpenMP_CXX_FLAGS})
130 target_link_libraries(kcf ${OpenMP_CXX_LIB_NAMES})
131 target_link_libraries(kcf ${OpenMP_omp_LIBRARY})
132 if (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") AND NOT OpenMP_CXX_LIB_NAMES)
133 # Older cmake does not set OpenMP_CXX_LIB_NAMES so hardcode it here
134 target_link_libraries(kcf gomp)
138 if(THREADS_HAVE_PTHREAD_ARG)
139 target_compile_options(kcf PUBLIC "-pthread")
141 if(CMAKE_THREAD_LIBS_INIT)
142 target_link_libraries(kcf "${CMAKE_THREAD_LIBS_INIT}")