diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b44efe..7fc251f 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) diff --git a/cmake/CheckSimd.cmake b/cmake/CheckSimd.cmake new file mode 100644 index 0000000..8e16024 --- /dev/null +++ b/cmake/CheckSimd.cmake @@ -0,0 +1,87 @@ + +include(CheckCXXSourceRuns) + +# save old configuration +set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + +# 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 ${OLD_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 ${OLD_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 ${OLD_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() + + +# restore previous state of cmake variable +set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})