diff --git a/CMakeLists.txt b/CMakeLists.txt index c79602be4c123fe7388a60441abf7a1c4274bb2a..e98a41bf3c0e97e2b2daa9be4edfd14126bccc3d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" insource) if(insource) MESSAGE(FATAL_ERROR "${PROJECT_NAME} requires an out of source build. Goto ./Build and tapes cmake ../") endif(insource) +SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/Modules) # # MPI option has to be set before project, cannot be changed in the cache! @@ -211,17 +212,17 @@ ENDIF() MESSAGE( STATUS "ScalFMM_USE_SSE = ${ScalFMM_USE_SSE}" ) if( ScalFMM_USE_SSE ) - - IF(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - # Set flag for old intel compiler TODO - MESSAGE(STATUS "INTEL COMPILER IS ${INTEL_VERSION} ") - # if( ${INTEL_VERSION} LESS "15.0.0") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__OLD_INTEL_COMPILER") - MESSAGE(STATUS "INTEL COMPILER LOWER 15.0.0") - # ENDIF() - ELSE() - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3 -mfpmath=sse") - ENDIF() + TRY_COMPILE(COMPILE_RESULT_VAR ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_MODULE_PATH}/checkSSEpe.cpp ) + IF( NOT ${COMPILE_RESULT_VAR}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__SSEPE_INTEL_COMPILER") + ENDIF() + IF(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3 -mfpmath=sse") + MESSAGE(WARNING "INTEL CXX_FLAG__SSE ${CMAKE_CXX_FLAGS} ") + ELSE() + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3 -mfpmath=sse") + ENDIF() endif() ################################################################## # Use AVX # @@ -229,11 +230,15 @@ endif() MESSAGE(STATUS "ScalFMM_USE_AVX = ${ScalFMM_USE_AVX}") if(ScalFMM_USE_AVX) - IF(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - if( ${INTEL_VERSION} LESS "15.0.0") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__OLD_INTEL_COMPILER") - MESSAGE(STATUS "INTEL COMPILER LOWER 15.0.0") - ENDIF() + TRY_COMPILE(COMPILE_RESULT_VAR ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_MODULE_PATH}/checkAVXpe.cpp ) + IF( NOT ${COMPILE_RESULT_VAR}) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__AVXPE_INTEL_COMPILER") + ENDIF() + IF(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3 -mfpmath=sse -mavx") + MESSAGE(WARNING "INTEL CXX_FLAG__SSE ${CMAKE_CXX_FLAGS} ") + ELSE() SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2 -msse3 -mfpmath=sse -mavx") ENDIF() diff --git a/Modules/checkAVXpe.cpp b/Modules/checkAVXpe.cpp new file mode 100644 index 0000000000000000000000000000000000000000..74b7c38a64e6c24c8e071d5d569e053906f5a180 --- /dev/null +++ b/Modules/checkAVXpe.cpp @@ -0,0 +1,10 @@ + +#include "../src/Container/instrset.h" + + +int main() { + int iset = instrset_detect(); + bool hasAVX = iset >= 7; + printf("Has AVX? %s (iset = %d)\n", hasAVX ? "Yes!" : "No.", iset); + return iset; +} diff --git a/Modules/checkSSEpe.cpp b/Modules/checkSSEpe.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fe26f30df6d45ce4baa67bf71fdcf89be797a43e --- /dev/null +++ b/Modules/checkSSEpe.cpp @@ -0,0 +1,15 @@ +#include <xmmintrin.h> // SSE +#include <emmintrin.h> //SSE2 +#include <pmmintrin.h> //SSE3 +#ifdef __SSSE3__ +#include <tmmintrin.h> //SSSE3 +#endif +#ifdef __SSSE4_1__ +#include <smmintrin.h> // SSE4 +#endif + +int main() { + __m128d tx, ty ; + tx += ty ; + return 0; +} diff --git a/Src/Utils/FAvx.hpp b/Src/Utils/FAvx.hpp index 7950eef982367eeb1edf7c159341f25cf05d8ca4..a80e358d58f54bf12d126407e7604ee1c3ea7e68 100644 --- a/Src/Utils/FAvx.hpp +++ b/Src/Utils/FAvx.hpp @@ -3,7 +3,7 @@ #include "immintrin.h" -#ifdef __OLD_INTEL_COMPILER +#ifdef __AVXPE_INTEL_COMPILER //Side effect operators DOUBLE inline __m256d& operator+=(__m256d & a, const __m256d & b){ diff --git a/Src/Utils/FSse.hpp b/Src/Utils/FSse.hpp index 50bfd9f870f644d3fdaf4572f1074e9b70416775..ec958d00aea396817015c667d91452a43cf4ff16 100644 --- a/Src/Utils/FSse.hpp +++ b/Src/Utils/FSse.hpp @@ -11,7 +11,7 @@ #include <smmintrin.h> // SSE4 #endif -#ifdef __OLD_INTEL_COMPILER +#ifdef __SSEPE_INTEL_COMPILER inline __m128d& operator+=(__m128d& v1, const __m128d& v2){ return (v1 = _mm_add_pd(v1, v2));