cmake_minimum_required(VERSION 2.8)
-set(KCF_LIB_SRC kcf.cpp kcf.h fft.cpp)
+set(KCF_LIB_SRC kcf.cpp kcf.h fft.cpp threadctx.hpp pragmas.h dynmem.hpp debug.cpp complexmat.hpp)
find_package(PkgConfig)
SET(FFT "OpenCV" CACHE STRING "Select FFT implementation")
-SET_PROPERTY(CACHE FFT PROPERTY STRINGS OpenCV OpenCV_cuFFT fftw cuFFTW cuFFT)
+SET_PROPERTY(CACHE FFT PROPERTY STRINGS OpenCV fftw cuFFTW cuFFT)
MESSAGE(STATUS "FFT implementation: ${FFT}")
-option(OPENMP "Use OpenMP library. Works with FFTW and OpenCV implementation." OFF)
-option(ASYNC "Works only if OPENCV_CUFFT is not ON. Will enable C++ async directive." OFF)
+option(OPENMP "Use OpenMP to paralelize certain portions of code." OFF)
+option(ASYNC "Use C++ std::async to paralelize certain portions of code." OFF)
option(CUDA_DEBUG "Enables error cheking for cuda and cufft. " OFF)
-option(BIG_BATCH "Enable transforming all features from all scales together." OFF)
-option(TEMPLATE_COMPLEXMAT "Use ComplexMat as abstract class." ON)
+option(BIG_BATCH "Execute all FFT calculation in a single batch. This can improve paralelism and reduce GPU offloading overhead." OFF)
IF(PROFILING)
add_definitions(-DPROFILING )
MESSAGE(STATUS "Big_batch mode")
ENDIF()
-IF(TEMPLATE_COMPLEXMAT)
- add_definitions(-DTEMPLATE_COMPLEXMAT )
- MESSAGE(STATUS "ComplexMat abstract class version.")
+IF (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") AND NOT OPENMP)
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas")
ENDIF()
SET(use_cuda OFF)
IF(FFT STREQUAL "OpenCV")
- list(APPEND KCF_LIB_SRC fft_opencv.cpp complexmat.hpp)
-ELSEIF(FFT STREQUAL "OpenCV_cuFFT")
- list(APPEND KCF_LIB_SRC fft_opencv_cuda.cpp complexmat.hpp)
- add_definitions(-DOPENCV_CUFFT)
- set(use_cuda ON)
+ list(APPEND KCF_LIB_SRC fft_opencv.cpp)
ELSEIF(FFT STREQUAL "fftw")
- list(APPEND KCF_LIB_SRC fft_fftw.cpp complexmat.hpp)
+ list(APPEND KCF_LIB_SRC fft_fftw.cpp)
add_definitions(-DFFTW)
pkg_check_modules(FFTW REQUIRED fftw3f)
ELSEIF(FFT STREQUAL "cuFFTW")
- list(APPEND KCF_LIB_SRC fft_fftw.cpp complexmat.hpp)
+ list(APPEND KCF_LIB_SRC fft_fftw.cpp)
add_definitions(-DFFTW -DCUFFTW)
set(use_cuda ON)
ELSEIF(FFT STREQUAL "cuFFT")
- list(APPEND KCF_LIB_SRC fft_cufft.cpp complexmat.cuh cuda_functions.cuh)
+ list(APPEND KCF_LIB_SRC fft_cufft.cpp)
add_definitions(-DCUFFT)
set(use_cuda ON)
iF(CUDA_DEBUG)
MESSAGE(FATAL_ERROR "Invalid FFT implementation selected")
ENDIF()
+IF(FFT STREQUAL "cuFFT")
+ list(APPEND KCF_LIB_SRC complexmat.cu)
+ELSE()
+ list(APPEND KCF_LIB_SRC complexmat.cpp)
+ENDIF()
+
IF((FFT STREQUAL "OpenCV") AND BIG_BATCH)
message(SEND_ERROR "OpenCV version does not support big batch mode.")
ENDIF()
message(SEND_ERROR "cuFFT version does not support ASYNC and OpenMP only if used with big batch mode.")
ENDIF()
-IF(ASYNC AND NOT OPENMP)
+IF(ASYNC)
add_definitions(-DASYNC)
+ find_package(Threads REQUIRED)
MESSAGE(STATUS "ASYNC")
+ELSEIF(OPENMP)
+ add_definitions(-DOPENMP)
+ FIND_PACKAGE(OpenMP REQUIRED CXX)
ENDIF() #ASYNC
FIND_PACKAGE( OpenCV REQUIRED )
IF(use_cuda)
find_package(CUDA REQUIRED)
- if (NOT ${OpenCV_USE_CUFFT})
- message(SEND_ERROR "OpenCV was not built with cuFFT")
- endif()
-
include_directories ( ${CUDA_INCLUDE_DIRS} )
set(CUDA_SEPARABLE_COMPILATION ON)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
- set(CUDA_HOST_COMPILER /usr/bin/g++)
- list( APPEND CUDA_NVCC_FLAGS -O3 --gpu-architecture sm_62 -std=c++11 -default-stream per-thread)
- find_cuda_helper_libs(cufftw)
- IF(FFT STREQUAL "cuFFT")
- add_subdirectory(cuda)
- cuda_add_library(complexmat complexmat.cu)
- cuda_add_library(cuda_func cuda_functions.cu)
- ENDIF()
+ if(NOT COMMAND CUDA_SELECT_NVCC_ARCH_FLAGS)
+ include(${CMAKE_SOURCE_DIR}/cmake/FindCUDA/select_compute_arch.cmake)
+ endif()
+
+ set(CUDA_ARCH_LIST "Auto" CACHE STRING "CUDA GPU architecture for building the code")
+ CUDA_SELECT_NVCC_ARCH_FLAGS(ARCH_FLAGS ${CUDA_ARCH_LIST})
+ list( APPEND CUDA_NVCC_FLAGS -O3 -std=c++11 ${ARCH_FLAGS} --default-stream per-thread) # --gpu-architecture sm_62 )
+ find_cuda_helper_libs(cufftw)
+ find_cuda_helper_libs(nvToolsExt)
ENDIF()
add_subdirectory(piotr_fhog)
add_subdirectory(cn)
-add_library(kcf STATIC ${KCF_LIB_SRC})
-IF(NOT TEMPLATE_COMPLEXMAT)
- add_library(complexmat complexmat.cpp)
- target_link_libraries(kcf fhog cndata complexmat ${OpenCV_LIBS})
-ELSE()
- target_link_libraries(kcf fhog cndata ${OpenCV_LIBS})
-ENDIF()
+if(FFT STREQUAL "cuFFT")
+ cuda_add_library(kcf STATIC ${KCF_LIB_SRC})
+else()
+ add_library(kcf STATIC ${KCF_LIB_SRC})
+endif()
+
+if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ target_compile_options(kcf PRIVATE -Wno-gnu-zero-variadic-macro-arguments)
+endif()
+
+
+target_link_libraries(kcf fhog cndata ${OpenCV_LIBS})
set_target_properties(kcf PROPERTIES VERSION 1.0.0 SOVERSION 1)
IF(FFT STREQUAL "fftw")
target_link_libraries(kcf ${FFTW_LDFLAGS})
IF(OPENMP)
target_link_libraries(kcf fftw3_omp)
- ELSEIF(NOT ASYNC)
+ ELSE()
target_link_libraries(kcf fftw3_threads)
ENDIF()
ENDIF() #FFTW
ENDIF() #cuFFTW
IF(FFT STREQUAL "cuFFT")
- target_link_libraries(kcf ${CUDA_cufft_LIBRARY} ${CUDA_LIBRARIES} complexmat cuda_func)
+ target_link_libraries(kcf ${CUDA_cufft_LIBRARY} ${CUDA_cublas_LIBRARY} ${CUDA_LIBRARIES} ${CUDA_nvToolsExt_LIBRARY})
ENDIF()
IF(PROFILING)
target_link_libraries(kcf pfm)
ENDIF()
+
+IF(OPENMP)
+ target_compile_options(kcf PUBLIC ${OpenMP_CXX_FLAGS})
+ target_link_libraries(kcf ${OpenMP_CXX_LIB_NAMES})
+ target_link_libraries(kcf ${OpenMP_omp_LIBRARY})
+ if (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") AND NOT OpenMP_CXX_LIB_NAMES)
+ # Older cmake does not set OpenMP_CXX_LIB_NAMES so hardcode it here
+ target_link_libraries(kcf gomp)
+ endif()
+ENDIF()
+
+if(THREADS_HAVE_PTHREAD_ARG)
+ target_compile_options(kcf PUBLIC "-pthread")
+endif()
+if(CMAKE_THREAD_LIBS_INIT)
+ target_link_libraries(kcf "${CMAKE_THREAD_LIBS_INIT}")
+endif()