From 4f9f0f26c05b8b88efd3e8804dd8e47f0894929b Mon Sep 17 00:00:00 2001 From: christopher Date: Tue, 20 Feb 2018 13:48:18 +0100 Subject: [PATCH 1/4] simd detection script --- cmake/CheckSimd.cmake | 81 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 cmake/CheckSimd.cmake diff --git a/cmake/CheckSimd.cmake b/cmake/CheckSimd.cmake new file mode 100644 index 0000000..f1ac159 --- /dev/null +++ b/cmake/CheckSimd.cmake @@ -0,0 +1,81 @@ + +include(CheckCXXSourceRuns) + + +# set flags +set(AVX_FLAGS) +set(AVX2_FLAGS) +set(AVX512_FLAGS) +if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC") + set(AVX_FLAGS "/arch:AVX") + set(AVX2_FLAGS "/arch:AVX2") + # set(AVX512_FLAGS "/arch:AVX512") found no option for msvc +endif() +if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + set(AVX_FLAGS "-mavx") + set(AVX2_FLAGS "-mavx2") + set(AVX512_FLAGS "-mavx512f" "-mavx512cd") # xeon processors have more flags +endif() + + +# check for AVX +set(CMAKE_REQUIRED_FLAGS ${AVX_FLAGS}) +CHECK_CXX_SOURCE_RUNS(" + #include + int main(){ + const float src[8] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f }; + float dst[8]; + __m256 a = _mm256_loadu_ps( src ); + __m256 b = _mm256_add_ps( a, a ); + _mm256_storeu_ps( dst, b ); + for( int i = 0; i < 8; i++ ) + if( ( src[i] + src[i] ) != dst[i] ) return -1; + return 0; + }" + AVX_ENABLED) +# remove flags if cpu does not support AVX +if(NOT AVX_ENABLED) + set(AVX_FLAGS "") +endif() + + +# check for AVX2 +set(CMAKE_REQUIRED_FLAGS ${AVX2_FLAGS}) +CHECK_CXX_SOURCE_RUNS(" + #include + int main(){ + const int src[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int dst[8]; + __m256i a = _mm256_loadu_si256( (__m256i*)src ); + __m256i b = _mm256_add_epi32( a, a ); + _mm256_storeu_si256( (__m256i*)dst, b ); + for( int i = 0; i < 8; i++ ) + if( ( src[i] + src[i] ) != dst[i] ) return -1; + return 0; + }" + AVX2_ENABLED) +# remove flags if cpu does not support AVX +if(NOT AVX2_ENABLED) + set(AVX2_FLAGS "") +endif() + + +# check for AVX512 +set(CMAKE_REQUIRED_FLAGS ${AVX512_FLAGS}) +CHECK_CXX_SOURCE_RUNS(" + #include + int main(){ + const int src[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8 }; + int dst[16]; + __m512i a = _mm512_loadu_si512( (__m512i*)src ); + __m512i b = _mm512_add_epi32( a, a ); + _mm512_storeu_si512( (__m512i*)dst, b ); + for( int i = 0; i < 16; i++ ) + if( ( src[i] + src[i] ) != dst[i] ) return -1; + return 0; + }" + AVX512_ENABLED) +# remove flags if cpu does not support AVX +if(NOT AVX512_ENABLED) + set(AVX512_FLAGS "") +endif() From 25fc466dd9a74c18500f9648059275af33cb7206 Mon Sep 17 00:00:00 2001 From: christopher Date: Tue, 20 Feb 2018 14:23:33 +0100 Subject: [PATCH 2/4] empty CMAKE_REQUIRED_FLAGS --- cmake/CheckSimd.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/CheckSimd.cmake b/cmake/CheckSimd.cmake index f1ac159..4bb1826 100644 --- a/cmake/CheckSimd.cmake +++ b/cmake/CheckSimd.cmake @@ -79,3 +79,7 @@ CHECK_CXX_SOURCE_RUNS(" if(NOT AVX512_ENABLED) set(AVX512_FLAGS "") endif() + + +# cleanup cmake var +set(CMAKE_REQUIRED_FLAGS "") From d84338ba296e0d2653c9fbee60478bd579710ba7 Mon Sep 17 00:00:00 2001 From: christopher Date: Tue, 20 Feb 2018 14:30:36 +0100 Subject: [PATCH 3/4] consider previous cmake state --- cmake/CheckSimd.cmake | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cmake/CheckSimd.cmake b/cmake/CheckSimd.cmake index 4bb1826..8e16024 100644 --- a/cmake/CheckSimd.cmake +++ b/cmake/CheckSimd.cmake @@ -1,6 +1,8 @@ include(CheckCXXSourceRuns) +# save old configuration +set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) # set flags set(AVX_FLAGS) @@ -19,7 +21,7 @@ endif() # check for AVX -set(CMAKE_REQUIRED_FLAGS ${AVX_FLAGS}) +set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS} ${AVX_FLAGS}) CHECK_CXX_SOURCE_RUNS(" #include int main(){ @@ -40,7 +42,7 @@ endif() # check for AVX2 -set(CMAKE_REQUIRED_FLAGS ${AVX2_FLAGS}) +set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS} ${AVX2_FLAGS}) CHECK_CXX_SOURCE_RUNS(" #include int main(){ @@ -61,7 +63,7 @@ endif() # check for AVX512 -set(CMAKE_REQUIRED_FLAGS ${AVX512_FLAGS}) +set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS} ${AVX512_FLAGS}) CHECK_CXX_SOURCE_RUNS(" #include int main(){ @@ -81,5 +83,5 @@ if(NOT AVX512_ENABLED) endif() -# cleanup cmake var -set(CMAKE_REQUIRED_FLAGS "") +# restore previous state of cmake variable +set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) From a9ce225769b05bb9ffd0282a8163899666a0a10a Mon Sep 17 00:00:00 2001 From: christopher Date: Tue, 20 Feb 2018 14:32:16 +0100 Subject: [PATCH 4/4] remove space and tab at line end --- CMakeLists.txt | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2d0df8..5e14b99 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ -# +# # CMake options -# +# # CMake version cmake_minimum_required(VERSION 3.0 FATAL_ERROR) @@ -37,9 +37,9 @@ include(cmake/HealthCheck.cmake) include(cmake/GenerateTemplateExportHeader.cmake) -# +# # Project description and (meta) information -# +# # Get git revision get_git_head_revision(GIT_REFSPEC GIT_SHA1) @@ -66,9 +66,9 @@ string(MAKE_C_IDENTIFIER ${META_PROJECT_NAME} META_PROJECT_ID) string(TOUPPER ${META_PROJECT_ID} META_PROJECT_ID) -# +# # Project configuration options -# +# # Project options option(BUILD_SHARED_LIBS "Build shared instead of static libraries." ON) @@ -78,9 +78,9 @@ option(OPTION_BUILD_DOCS "Build documentation." option(OPTION_BUILD_EXAMPLES "Build examples." OFF) -# +# # Declare project -# +# # Generate folders for IDE targets (e.g., VisualStudio solutions) set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -98,9 +98,9 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) file(WRITE "${PROJECT_BINARY_DIR}/VERSION" "${META_NAME_VERSION}") -# +# # Compiler settings and options -# +# include(cmake/CompileOptions.cmake) @@ -117,9 +117,9 @@ enable_cppcheck(On) enable_clang_tidy(On) -# +# # Deployment/installation setup -# +# # Get project name set(project ${META_PROJECT_NAME}) @@ -171,23 +171,23 @@ if(NOT SYSTEM_DIR_INSTALL) if(APPLE) set(CMAKE_INSTALL_RPATH "@loader_path/../../../${INSTALL_LIB}") else() - set(CMAKE_INSTALL_RPATH "$ORIGIN/${INSTALL_LIB}") + set(CMAKE_INSTALL_RPATH "$ORIGIN/${INSTALL_LIB}") endif() endif() -# +# # Project modules -# +# add_subdirectory(source) add_subdirectory(docs) add_subdirectory(deploy) -# +# # Deployment (global project files) -# +# # Install version file install(FILES "${PROJECT_BINARY_DIR}/VERSION" DESTINATION ${INSTALL_ROOT} COMPONENT runtime)