#I have to leave these here for tribits kokkos_include_directories(${CMAKE_CURRENT_BINARY_DIR}) kokkos_include_directories(${CMAKE_CURRENT_SOURCE_DIR}) #----------------------------------------------------------------------------- file(GLOB SIMD_HEADERS *.hpp) file(GLOB SIMD_SOURCES *.cpp) set(SIMD_UNDEF "${CMAKE_CURRENT_BINARY_DIR}/Kokkos_SIMD_undef.hpp") set(SIMD_MAIN "${CMAKE_CURRENT_BINARY_DIR}/Kokkos_SIMD.hpp") get_filename_component(SIMD_MAIN_NAME "${SIMD_MAIN}" NAME) set(SIMD_SOURCE_MAIN "${CMAKE_CURRENT_SOURCE_DIR}/Kokkos_SIMD.hpp") set(SIMD_MACRO_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/impl/Kokkos_SIMD_Impl_Macros.hpp") file(READ "${SIMD_MACRO_HEADER}" contents) string(REPLACE "\n" ";" lines "${contents}") set(UNDEF_LIST "/* Generated by CMake. Do not edit. */\n\n") foreach(line IN LISTS lines) if(line MATCHES "^[ \t]*#[ \t]*define[ \t]+(KOKKOS_SIMD_IMPL_[A-Za-z0-9_]*)") set(macro "${CMAKE_MATCH_1}") if(NOT macro MATCHES "_HPP_?$") string(APPEND UNDEF_LIST "#undef ${macro}\n") endif() endif() endforeach() file(WRITE "${SIMD_UNDEF}" "${UNDEF_LIST}") file(READ "${SIMD_SOURCE_MAIN}" contents) file( WRITE "${SIMD_MAIN}" "${contents} #include \"Kokkos_SIMD_undef.hpp\" " ) list(REMOVE_ITEM SIMD_HEADERS "${SIMD_SOURCE_MAIN}") list(APPEND SIMD_HEADERS "${SIMD_MAIN}" "${SIMD_UNDEF}") install( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/" DESTINATION ${KOKKOS_HEADER_DIR} FILES_MATCHING PATTERN "*.hpp" PATTERN "${SIMD_MAIN_NAME}" EXCLUDE ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Kokkos_SIMD.hpp" "${CMAKE_CURRENT_BINARY_DIR}/Kokkos_SIMD_undef.hpp" DESTINATION ${KOKKOS_HEADER_DIR} ) set(SIMD_MODULES Kokkos_SIMD.cppm Kokkos_SIMD_Impl.cppm) #----------------------------------------------------------------------------- # We have to pass the sources in here for Tribits # These will get ignored for standalone CMake and a true interface library made kokkos_add_library( kokkossimd STATIC # MSVC can't deal with empty shared libraries SOURCES ${SIMD_SOURCES} HEADERS ${SIMD_HEADERS} MODULE_INTERFACE ${SIMD_MODULES} ) if(KOKKOS_CXX_COMPILER_ID STREQUAL IntelLLVM) find_library(INTEL_SVML NAMES svml) if(INTEL_SVML) message(STATUS "Found INTEL_SVML") target_link_libraries(kokkossimd PUBLIC ${INTEL_SVML}) target_compile_definitions(kokkossimd PUBLIC KOKKOS_HAVE_INTEL_SVML) endif() endif() kokkos_lib_include_directories( kokkossimd ${KOKKOS_TOP_BUILD_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ) kokkos_link_internal_library(kokkossimd kokkoscore) # If ARM-SVE, check and warn for available arm_neon_sve_bridge.h if(KOKKOS_ARCH_ARM_SVE) include(CheckIncludeFileCXX) check_include_file_cxx(arm_neon_sve_bridge.h KOKKOS_COMPILER_SUPPORTS_ARM_NEON_SVE_BRIDGE) if(NOT KOKKOS_COMPILER_SUPPORTS_ARM_NEON_SVE_BRIDGE) message( WARNING "You are using a compiler without NEON-SVE bridge header " "(arm_neon_sve_bridge.h). Kokkos will use its own " "implementation of these functions, which could be slower " "than native ones from a more recent SVE compiler. It is " "recommended to upgrade your compiler.\n" "NOTE: It was also observed that, in some LLVM versions " "(14, 15), despite the macro __ARM_NEON_SVE_BRIDGE was " "defined, the header arm_neon_sve_bridge.h is still not " "available (see https://godbolt.org/z/7jqWvzvWY )." ) endif() endif()