diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cf9cea82c645f5c98956923b1798ec80854448b..11e1923c98bb66a44526597ab40c845a4e9a2cd0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ set(CMAKE_CXX_EXTENSIONS OFF) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") include(FetchGTest) -option(KLEIDIAI_BUILD_TESTS "Build unit tests." ON) +option(KLEIDIAI_BUILD_TESTS "Build unit tests." OFF) option(KLEIDIAI_ENABLE_CLANG_TIDY "Build with Clang-Tidy checks." OFF) if(KLEIDIAI_ENABLE_CLANG_TIDY) @@ -29,34 +29,55 @@ if(KLEIDIAI_ENABLE_CLANG_TIDY) set(CMAKE_CXX_CLANG_TIDY "clang-tidy") endif() -set(KLEIDIAI_WARNING_FLAGS_C - "-Wall" - "-Wdisabled-optimization" - "-Werror" - "-Wextra" - "-Wformat-security" - "-Wformat=2" - "-Winit-self" - "-Wno-ignored-attributes" - "-Wno-misleading-indentation" - "-Wno-overlength-strings" - "-Wstrict-overflow=2" - "-Wswitch-default" -) +if(MSVC) + set(KLEIDIAI_WARNING_FLAGS_C + "/Wall" + ) +else() + set(KLEIDIAI_WARNING_FLAGS_C + "-Wall" + "-Wdisabled-optimization" + "-Werror" + "-Wextra" + "-Wformat-security" + "-Wformat=2" + "-Winit-self" + "-Wno-ignored-attributes" + "-Wno-misleading-indentation" + "-Wno-overlength-strings" + "-Wstrict-overflow=2" + "-Wswitch-default" + ) -set(KLEIDIAI_WARNING_FLAGS_CXX - "-Wctor-dtor-privacy" - "-Weffc++" - "-Woverloaded-virtual" - "-Wsign-promo" -) + set(KLEIDIAI_WARNING_FLAGS_CXX + "-Wctor-dtor-privacy" + "-Weffc++" + "-Woverloaded-virtual" + "-Wsign-promo" + ) +endif() set(KLEIDIAI_WARNING_FLAGS ${KLEIDIAI_WARNING_FLAGS_C} $<$:${KLEIDIAI_WARNING_FLAGS_CXX}> ) -set(KLEIDIAI_FILES_NEON +set(KLEIDIAI_MIN_CLANG_VERSION 11) +set(KLEIDIAI_MIN_GNU_VERSION 11) + +if(CMAKE_C_COMPILER_ID STREQUAL "Clang") + if(CMAKE_C_COMPILER_VERSION VERSION_LESS ${KLEIDIAI_MIN_CLANG_VERSION}) + message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KLEIDIAI_MIN_CLANG_VERSION} or newer, received ${CMAKE_C_COMPILER_VERSION} ") + endif() +endif() + +if(CMAKE_C_COMPILER_ID STREQUAL "GNU") + if(CMAKE_C_COMPILER_VERSION VERSION_LESS ${KLEIDIAI_MIN_GNU_VERSION}) + message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KLEIDIAI_MIN_GNU_VERSION} or newer, received ${CMAKE_C_COMPILER_VERSION} ") + endif() +endif() + +set(KLEIDIAI_FILES_SCALAR kai/ukernels/matmul/pack/kai_lhs_quant_pack_qai8dxp_f32.c kai/ukernels/matmul/pack/kai_rhs_pack_nxk_qsi4cxp_qsu4cxs1s0.c ) @@ -78,12 +99,22 @@ set(KLEIDIAI_FILES_NEON_I8MM kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp8x8_8x8x32_neon_i8mm.c ) -add_library(kleidiai - ${KLEIDIAI_FILES_NEON} - ${KLEIDIAI_FILES_NEON_FP16} - ${KLEIDIAI_FILES_NEON_DOTPROD} - ${KLEIDIAI_FILES_NEON_I8MM} -) +add_library(kleidiai) +target_sources(kleidiai PRIVATE ${KLEIDIAI_FILES_SCALAR}) + +# MSVC compiler does not support inline assembly for ArmĀ® processors hence it cannot be used to compile the optimized +# KleidiAI micro-kernels. It can however still be used to compile scalar routines. +# https://learn.microsoft.com/en-us/cpp/assembler/inline/inline-assembler?view=msvc-170 +if((CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") AND NOT MSVC) + target_sources(kleidiai PRIVATE ${KLEIDIAI_FILES_NEON_FP16}) + target_sources(kleidiai PRIVATE ${KLEIDIAI_FILES_NEON_I8MM}) + target_sources(kleidiai PRIVATE ${KLEIDIAI_FILES_NEON_DOTPROD}) + + set_source_files_properties(${KLEIDIAI_FILES_SCALAR} PROPERTIES COMPILE_OPTIONS -march=armv8-a) + set_source_files_properties(${KLEIDIAI_FILES_NEON_FP16} PROPERTIES COMPILE_OPTIONS -march=armv8.2-a+fp16) + set_source_files_properties(${KLEIDIAI_FILES_NEON_DOTPROD} PROPERTIES COMPILE_OPTIONS -march=armv8.2-a+dotprod) + set_source_files_properties(${KLEIDIAI_FILES_NEON_I8MM} PROPERTIES COMPILE_OPTIONS -march=armv8.2-a+i8mm) +endif() target_include_directories(kleidiai PUBLIC . @@ -93,22 +124,6 @@ target_compile_options(kleidiai PRIVATE ${KLEIDIAI_WARNING_FLAGS} ) -foreach(KLEIDIAI_SOURCE_FILE IN LISTS KLEIDIAI_FILES_NEON) - set_property(SOURCE ${KLEIDIAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8-a) -endforeach() - -foreach(KLEIDIAI_SOURCE_FILE IN LISTS KLEIDIAI_FILES_NEON_FP16) - set_property(SOURCE ${KLEIDIAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8.2-a+fp16) -endforeach() - -foreach(KLEIDIAI_SOURCE_FILE IN LISTS KLEIDIAI_FILES_NEON_DOTPROD) - set_property(SOURCE ${KLEIDIAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8.2-a+dotprod) -endforeach() - -foreach(KLEIDIAI_SOURCE_FILE IN LISTS KLEIDIAI_FILES_NEON_I8MM) - set_property(SOURCE ${KLEIDIAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8.2-a+i8mm) -endforeach() - if(KLEIDIAI_BUILD_TESTS) enable_testing() include(GoogleTest)