diff --git a/CMake/OTBCheckSSEFeatures.cmake b/CMake/OTBCheckSSEFeatures.cmake new file mode 100644 index 0000000000000000000000000000000000000000..95e9e45726e6553a0468bde767d9684a3a37616e --- /dev/null +++ b/CMake/OTBCheckSSEFeatures.cmake @@ -0,0 +1,82 @@ +function(check_sse_features sse_flags ) + include(CheckIncludeFile) + include(CheckLibraryExists) + include(CheckCXXSourceRuns) + include(CheckCXXCompilerFlag) + + set(has_sse FALSE) + set(${sse_flags} "0" PARENT_SCOPE) + if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX ) + set(CMAKE_REQUIRED_FLAGS "-msse2") + check_cxx_source_runs(" + #include <emmintrin.h> + int main() + { + __m128d a, b; + double vals[2] = {0}; + a = _mm_loadu_pd(vals); + b = _mm_add_pd(a,a); + _mm_storeu_pd(vals,b); + return 0; + }" + has_sse) + + if(has_sse) + message(STATUS "Performing Test CXX_HAS_SSE2 - Success") + set(${sse_flags} "-msse2 -mfpmath=sse" PARENT_SCOPE) + else() + message(STATUS "Performing Test CXX_HAS_SSE2 - Failed") + endif() + + set(CMAKE_REQUIRED_FLAGS "-msse") + check_cxx_source_runs(" + #include <xmmintrin.h> + int main() + { + __m128 a, b; + float vals[4] = {0}; + a = _mm_loadu_ps(vals); + b = a; + b = _mm_add_ps(a,b); + _mm_storeu_ps(vals,b); + return 0; + }" + has_sse) + + if(has_sse) + message(STATUS "Performing Test CXX_HAS_SSE - Success") + set(${sse_flags} "-msse -mfpmath=sse" PARENT_SCOPE) + return() + else() + message(STATUS "Performing Test CXX_HAS_SSE - Failed") + return() + endif() + + elseif(MSVC) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + return() + endif() + check_cxx_source_runs(" + #include <emmintrin.h> + + int main() + { + __m128d a, b; + double vals[2] = {0}; + a = _mm_loadu_pd(vals); + b = _mm_add_pd(a,a); + _mm_storeu_pd(vals,b); + return 0; + }" + has_sse) + + if(has_sse) + message(STATUS "Performing Test CXX_HAS_SSE - Success") + set(${sse_flags} "/arch:SSE2 /fp:fast -D__SSE__ -D__SSE2__" PARENT_SCOPE) + return() + else() + message(STATUS "Performing Test CXX_HAS_SSE - Failed") + return() + endif() +endif() +endfunction() #check_sse_features diff --git a/CMake/OTBSetStandardCompilerFlags.cmake b/CMake/OTBSetStandardCompilerFlags.cmake index 4e2dae3b5860bdda750702cd76d008bd38d6d5fb..49da809ad9701a2227e90a4abca85f46c567642f 100644 --- a/CMake/OTBSetStandardCompilerFlags.cmake +++ b/CMake/OTBSetStandardCompilerFlags.cmake @@ -285,6 +285,19 @@ macro(check_compiler_platform_flags) message(STATUS "Disabling OpenMP support") endif() + set(OTB_SSE_FLAGS) + if(OTB_USE_SSE_FLAGS) + include(OTBCheckSSEFeatures) + check_sse_features(OTB_SSE_FLAGS) + endif() + + if(OTB_SSE_FLAGS) + message(STATUS "Using SSE2 extensions") + set(OTB_REQUIRED_CXX_FLAGS "${OTB_REQUIRED_CXX_FLAGS} ${OTB_SSE_FLAGS}") + else() + message(STATUS "Not using SSE2 extensions") + endif() + #----------------------------------------------------------------------------- # The frename-registers option does not work due to a bug in the gnu compiler. # It must be removed or data errors will be produced and incorrect results diff --git a/CMakeLists.txt b/CMakeLists.txt index aef1cdfa3ac2e30ff9609e9345e54fe62b50b152..b52d9b5f427c6a902a5d251dabd40d586d5287ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -214,7 +214,7 @@ option(OTB_USE_DEPRECATED "Turn on the use and test of deprecated classes" OFF) mark_as_advanced(OTB_USE_DEPRECATED) option(OTB_USE_OPENMP "Add openmp compiler and linker flags" ON) - +option(OTB_USE_SSE_FLAGS "Enable SIMD optimisations (hardware dependant)." OFF) #----------------------------------------------------------------------------- # SHOW_ALL_MSG_DEBUG option option(OTB_SHOW_ALL_MSG_DEBUG "Show all debug messages (very verbose)" OFF) diff --git a/Modules/ThirdParty/SiftFast/src/CMakeLists.txt b/Modules/ThirdParty/SiftFast/src/CMakeLists.txt index 2edd8413f6bea65f6b9e8423a534f0334996040d..dea45e6f65a78f9be36024fa1c6255b671c34328 100644 --- a/Modules/ThirdParty/SiftFast/src/CMakeLists.txt +++ b/Modules/ThirdParty/SiftFast/src/CMakeLists.txt @@ -55,8 +55,6 @@ if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX ) message(STATUS "Try to compile libsiftfast.cpp done.") endif() - set(CMAKE_CXX_FLAGS_RELEASE "-O3 -g") - add_definitions(" -Wall -fPIC ") # check for x86-64 system check_cxx_source_runs(" @@ -72,120 +70,30 @@ if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX ) return 0; }" IS_X86_64) - - if( IS_X86_64 ) - add_definitions("-D__x86_64__") - endif() else() set(IS_X86_64 0) endif() -if(OTB_DISABLE_FAST_FUNCTIONS_VALUE) - add_definitions(-DOTB_DISABLE_FAST_FUNCTIONS) -endif() - - -include(CheckIncludeFile) -include(CheckLibraryExists) -include(CheckCXXSourceRuns) -include(CheckCXXCompilerFlag) - -# if( UNIX OR CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX ) -# set(STDC_LIBRARY stdc++) -# else() -# set(STDC_LIBRARY) -# endif() +#set(CMAKE_CXX_FLAGS_RELEASE "-O3 -g") +#add_xxdefinitions(" -Wall -fPIC ") -# check for SSE extensions +add_library(otbsiftfast libsiftfast.cpp) if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX ) - set(SSE_FLAGS) - - set(CMAKE_REQUIRED_FLAGS "-msse2") - check_cxx_source_runs(" - #include <emmintrin.h> - - int main() - { - __m128d a, b; - double vals[2] = {0}; - a = _mm_loadu_pd(vals); - b = _mm_add_pd(a,a); - _mm_storeu_pd(vals,b); - return 0; - }" - HAS_SSE2_EXTENSIONS) - - set(CMAKE_REQUIRED_FLAGS "-msse") - check_cxx_source_runs(" - #include <xmmintrin.h> - int main() - { - __m128 a, b; - float vals[4] = {0}; - a = _mm_loadu_ps(vals); - b = a; - b = _mm_add_ps(a,b); - _mm_storeu_ps(vals,b); - return 0; - }" - HAS_SSE_EXTENSIONS) - - set(CMAKE_REQUIRED_FLAGS) - - if(HAS_SSE2_EXTENSIONS) - message(STATUS "Using SSE2 extensions") - set(SSE_FLAGS "-msse2 -mfpmath=sse") - elseif(HAS_SSE_EXTENSIONS) - message(STATUS "Using SSE extensions") - set(SSE_FLAGS "-msse -mfpmath=sse") - endif() - - add_definitions(${SSE_FLAGS}) -elseif(MSVC) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - message(STATUS "Not using SSE2 extensions on x64") - else() - check_cxx_source_runs(" - #include <emmintrin.h> - - int main() - { - __m128d a, b; - double vals[2] = {0}; - a = _mm_loadu_pd(vals); - b = _mm_add_pd(a,a); - _mm_storeu_pd(vals,b); - return 0; - }" - HAS_SSE2_EXTENSIONS) - - if( HAS_SSE2_EXTENSIONS ) - message(STATUS "Using SSE2 extensions") - add_definitions( "/arch:SSE2 /fp:fast -D__SSE__ -D__SSE2__" ) - endif() - endif() + # target_link_libraries(otbsiftfast m stdc++) + target_link_libraries(otbsiftfast m) endif() -#set(Boost_ADDITIONAL_VERSIONS "1.40" "1.39" "1.38" "1.37.0" "1.37" "1.35.0" "1.34.1" "1.34.0" "1.34" "1.33.1" "1.33.0" "1.33") -#if( NOT $ENV{BOOST_INCLUDEDIR} STREQUAL "" ) -# set(Boost_INCLUDE_DIR $ENV{BOOST_INCLUDEDIR}) -#endif() -#if( NOT $ENV{BOOST_LIBRARYDIR} STREQUAL "" ) -# set(Boost_LIBRARY_DIRS $ENV{BOOST_LIBRARYDIR}) -#endif() -#find_package(Boost COMPONENTS python) - -#if( Boost_FOUND ) -# message(STATUS "found boost version: ${Boost_VERSION}") -#else() -# message(STATUS "Could not find boost libraries!") -#endif() -add_library(otbsiftfast libsiftfast.cpp) +if(IS_X86_64) + set_target_properties(otbsiftfast + PROPERTIES COMPILE_FLAGS "-D__x86_64__") +endif() -if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX ) -# target_link_libraries(otbsiftfast m stdc++) - target_link_libraries(otbsiftfast m) +#set_source_files_properties(<file> PROPERTIES COMPILE_FLAGS <flags>) + +if(OTB_DISABLE_FAST_FUNCTIONS_VALUE) + set_target_properties(otbsiftfast + PROPERTIES COMPILE_FLAGS "-DOTB_DISABLE_FAST_FUNCTIONS") endif() #set_target_properties(otbsiftfast PROPERTIES OUTPUT_NAME siftfast CLEAN_DIRECT_OUTPUT 1) @@ -197,7 +105,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) #Install TARGET & FILES for otb-lib if(OTB_LIBRARY_PROPERTIES) - set_target_properties(otbsiftfast PROPERTIES ${OTB_LIBRARY_PROPERTIES}) + set_target_properties(otbsiftfast PROPERTIES ${OTB_LIBRARY_PROPERTIES}) endif() install(TARGETS otbsiftfast