From 2569b009ab0297ad4c5cf7beee37b60f3c379ddf Mon Sep 17 00:00:00 2001 From: Shanigen Date: Tue, 20 Feb 2018 08:47:56 +0100 Subject: [PATCH] Added some basic compability for FFTW with OpenMP. (WIP) --- CMakeLists.txt | 22 ++++++++++++++++------ src/kcf.cpp | 5 ++++- src/kcf.h | 4 ++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b7f91d..374e1f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,11 +5,12 @@ project(kcf_tracker) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -pedantic -O3 -Wno-long-long -fno-omit-frame-pointer") option(OPENCV_CUFFT "If OFF CPU implementation using OpenCV implementation of fft will be used. If ON Nvidia CUFFT implemented in OpenCV will be used. Together with Hostmem from OpenCV." OFF) -option(FFTW "Use FFTW implementation of DFT." OFF) -option(FFTW_PARALLEL "Use FFTW implementation of DFT." OFF) -option(ASYNC "Default setting is on. Works only if OPENCV_CUFFT is not ON. Will enable C++ async directive." OFF) +option(FFTW "Use FFTW implementation of FFT. If selected together with OPENCV_CUFFT then this option will not be used." OFF) +option(FFTW_PARALLEL "Use parrallel implementation of FFTW without OpenMP." OFF) +option(FFTW_OPENMP "Use parrallel implementation of FFTW with OpenMP." OFF) +option(ASYNC "Works only if OPENCV_CUFFT is not ON. Will enable C++ async directive." OFF) option(VISULIZE_RESULT "Check if you want to visulize the result." OFF) -option(DEBUG_MODE "Additional debug output." OFF) +option(DEBUG_MODE "Additional terminal outputs and screens. " OFF) IF(VISULIZE_RESULT) add_definitions(-DVISULIZE_RESULT) @@ -30,7 +31,10 @@ ELSEIF(FFTW) IF(FFTW_PARALLEL) add_definitions(-DFFTW_PARALLEL) MESSAGE(STATUS "FFTW_PARALLEL") - ENDIF() #FFTW_PARALLEL + ELSEIF (FFTW_OPENMP) + add_definitions(-DFFTW_OPENMP) + MESSAGE(STATUS "FFTW_OPENMP") + ENDIF()#FFTW_PARALLEL ENDIF() #OPENCV_CUFFT IF(ASYNC AND NOT OPENCV_CUFFT AND NOT FFTW) @@ -43,7 +47,11 @@ link_directories ( ${OpenCV_LIB_DIR} ) MESSAGE(STATUS "OpenCV_LIB_DIR: ${OpenCV_LIB_DIR} ") IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + IF(NOT FFTW_OPENMP) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") + ELSE() + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") + ENDIF() #FFTW_OPENMP ENDIF () include_directories ( ${OpenCV_INCLUDE_DIRS} ) @@ -78,6 +86,8 @@ target_link_libraries(kcf_vot ${OpenCV_LIBS} kcf) target_link_libraries(kcf_vot fftw3f) IF(FFTW_PARALLEL) target_link_libraries(kcf_vot fftw3_threads) - ENDIF() #ASYNC + ELSEIF(FFTW_OPENMP) + target_link_libraries(kcf_vot fftw3_omp) + ENDIF() #FFTW_PARALLEL ENDIF() #FFTW ENDIF() #OPENCV_CUFFT diff --git a/src/kcf.cpp b/src/kcf.cpp index 824f0c8..c0cb554 100644 --- a/src/kcf.cpp +++ b/src/kcf.cpp @@ -85,7 +85,10 @@ void KCF_Tracker::init(cv::Mat &img, const cv::Rect & bbox) #ifdef FFTW_PARALLEL fftw_init_threads(); fftw_plan_with_nthreads(2); -# endif +# elif FFTW_OPENMP + fftw_init_threads(); + fftw_plan_with_nthreads(omp_get_max_threads()); +#endif //window weights, i.e. labels p_yf = fft2(gaussian_shaped_labels(p_output_sigma, p_windows_size[0]/p_cell_size, p_windows_size[1]/p_cell_size)); diff --git a/src/kcf.h b/src/kcf.h index 35881be..25806d8 100644 --- a/src/kcf.h +++ b/src/kcf.h @@ -16,6 +16,10 @@ #include #endif +#ifdef FFTW_OPENMP +#include +#endif + struct BBox_c { double cx, cy, w, h; -- 2.39.2