From 49df44e2b077843e1022cf19dbf056423a3356a8 Mon Sep 17 00:00:00 2001 From: Felix Thomasmathibalan Date: Wed, 12 Jun 2024 10:03:36 +0100 Subject: [PATCH 1/8] Add compiler capability check Add compiler version checks in cmake before adding feature specific(e.g., FEAT_DOTPROD) micro kernels. Signed-off-by: Felix Thomasmathibalan --- CMakeLists.txt | 91 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cf9cea8..3363d129 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,15 +21,15 @@ 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_ENABLE_CLANG_TIDY "Build with Clang-Tidy checks." OFF) +option(KAI_BUILD_TESTS "Build unit tests." ON) +option(KAI_ENABLE_CLANG_TIDY "Build with Clang-Tidy checks." OFF) -if(KLEIDIAI_ENABLE_CLANG_TIDY) +if(KAI_ENABLE_CLANG_TIDY) set(CMAKE_C_CLANG_TIDY "clang-tidy") set(CMAKE_CXX_CLANG_TIDY "clang-tidy") endif() -set(KLEIDIAI_WARNING_FLAGS_C +set(KAI_WARNING_FLAGS_C "-Wall" "-Wdisabled-optimization" "-Werror" @@ -44,45 +44,82 @@ set(KLEIDIAI_WARNING_FLAGS_C "-Wswitch-default" ) -set(KLEIDIAI_WARNING_FLAGS_CXX +set(KAI_WARNING_FLAGS_CXX "-Wctor-dtor-privacy" "-Weffc++" "-Woverloaded-virtual" "-Wsign-promo" ) -set(KLEIDIAI_WARNING_FLAGS - ${KLEIDIAI_WARNING_FLAGS_C} - $<$:${KLEIDIAI_WARNING_FLAGS_CXX}> +set(KAI_WARNING_FLAGS + ${KAI_WARNING_FLAGS_C} + $<$:${KAI_WARNING_FLAGS_CXX}> ) -set(KLEIDIAI_FILES_NEON +SET(KAI_I8MM ON CACHE STRING "I8MM" INTERNAL) +SET(KAI_FP16 ON CACHE STRING "" INTERNAL) +SET(KAI_DOTPROD ON CACHE STRING "" INTERNAL) + +IF(CMAKE_C_COMPILER_ID STREQUAL "Clang") + IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "11") + SET(KAI_I8MM OFF) + ENDIF() + + IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "7") + SET(KAI_FP16 OFF) + SET(KAI_DOTPROD OFF) + ENDIF() +ENDIF() + +IF(CMAKE_C_COMPILER_ID STREQUAL "GNU") + IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "10") + SET(KAI_I8MM OFF) + ENDIF() + + IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "8") + SET(KAI_FP16 OFF) + SET(KAI_DOTPROD OFF) + ENDIF() +ENDIF() + +set(KAI_FILES_NEON kai/ukernels/matmul/pack/kai_lhs_quant_pack_qai8dxp_f32.c kai/ukernels/matmul/pack/kai_rhs_pack_nxk_qsi4cxp_qsu4cxs1s0.c ) -set(KLEIDIAI_FILES_NEON_FP16 +set(KAI_FILES_NEON_FP16 kai/ukernels/matmul/pack/kai_rhs_pack_kxn_f16p16x1biasf16_f16_f16_neon.c kai/ukernels/matmul/matmul_clamp_f16_f16_f16p/kai_matmul_clamp_f16_f16_f16p16x1biasf16_6x16x8_neon_mla.c ) -set(KLEIDIAI_FILES_NEON_DOTPROD +set(KAI_FILES_NEON_DOTPROD kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp1x8_qsi4cxp4x8_1x4x32_neon_dotprod.c kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp1x8_qsi4cxp8x8_1x8x32_neon_dotprod.c ) -set(KLEIDIAI_FILES_NEON_I8MM +set(KAI_FILES_NEON_I8MM kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp4x8_4x4x32_neon_i8mm.c kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp4x8_8x4x32_neon_i8mm.c kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp8x8_4x8x32_neon_i8mm.c kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp8x8_8x8x32_neon_i8mm.c ) +SET(KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON}) + +IF(KAI_I8MM) + LIST(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_I8MM}) +ENDIF() + +IF(KAI_DOTPROD) + LIST(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_DOTPROD}) +ENDIF() + +IF(KAI_FP16) + LIST(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_FP16}) +ENDIF() + add_library(kleidiai - ${KLEIDIAI_FILES_NEON} - ${KLEIDIAI_FILES_NEON_FP16} - ${KLEIDIAI_FILES_NEON_DOTPROD} - ${KLEIDIAI_FILES_NEON_I8MM} + ${KAI_MICROKERNEL_SRCS} ) target_include_directories(kleidiai @@ -90,26 +127,26 @@ target_include_directories(kleidiai ) target_compile_options(kleidiai - PRIVATE ${KLEIDIAI_WARNING_FLAGS} + PRIVATE ${KAI_WARNING_FLAGS} ) -foreach(KLEIDIAI_SOURCE_FILE IN LISTS KLEIDIAI_FILES_NEON) - set_property(SOURCE ${KLEIDIAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8-a) +foreach(KAI_SOURCE_FILE IN LISTS KAI_FILES_NEON) + set_property(SOURCE ${KAI_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) +foreach(KAI_SOURCE_FILE IN LISTS KAI_FILES_NEON_FP16) + set_property(SOURCE ${KAI_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) +foreach(KAI_SOURCE_FILE IN LISTS KAI_FILES_NEON_DOTPROD) + set_property(SOURCE ${KAI_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) +foreach(KAI_SOURCE_FILE IN LISTS KAI_FILES_NEON_I8MM) + set_property(SOURCE ${KAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8.2-a+i8mm) endforeach() -if(KLEIDIAI_BUILD_TESTS) +if(KAI_BUILD_TESTS) enable_testing() include(GoogleTest) @@ -138,7 +175,7 @@ if(KLEIDIAI_BUILD_TESTS) ) target_compile_options(kleidiai_test - PRIVATE ${KLEIDIAI_WARNING_FLAGS} + PRIVATE ${KAI_WARNING_FLAGS} PRIVATE -march=armv8.2-a+fp16+bf16 ) -- GitLab From d6cb90b4b7a9e10c233bd31546d3a9f72d0fbe85 Mon Sep 17 00:00:00 2001 From: Felix Thomasmathibalan Date: Wed, 12 Jun 2024 14:21:40 +0100 Subject: [PATCH 2/8] Fix cmake lint errors Signed-off-by: Felix Thomasmathibalan --- CMakeLists.txt | 70 +++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3363d129..4d47c196 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,31 +56,31 @@ set(KAI_WARNING_FLAGS $<$:${KAI_WARNING_FLAGS_CXX}> ) -SET(KAI_I8MM ON CACHE STRING "I8MM" INTERNAL) -SET(KAI_FP16 ON CACHE STRING "" INTERNAL) -SET(KAI_DOTPROD ON CACHE STRING "" INTERNAL) - -IF(CMAKE_C_COMPILER_ID STREQUAL "Clang") - IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "11") - SET(KAI_I8MM OFF) - ENDIF() - - IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "7") - SET(KAI_FP16 OFF) - SET(KAI_DOTPROD OFF) - ENDIF() -ENDIF() - -IF(CMAKE_C_COMPILER_ID STREQUAL "GNU") - IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "10") - SET(KAI_I8MM OFF) - ENDIF() - - IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "8") - SET(KAI_FP16 OFF) - SET(KAI_DOTPROD OFF) - ENDIF() -ENDIF() +set(KAI_I8MM ON CACHE STRING "" INTERNAL) +set(KAI_FP16 ON CACHE STRING "" INTERNAL) +set(KAI_DOTPROD ON CACHE STRING "" INTERNAL) + +if(CMAKE_C_COMPILER_ID STREQUAL "Clang") + if(CMAKE_C_COMPILER_VERSION VERSION_LESS "11") + set(KAI_I8MM OFF) + endif() + + if(CMAKE_C_COMPILER_VERSION VERSION_LESS "7") + set(KAI_FP16 OFF) + set(KAI_DOTPROD OFF) + endif() +endif() + +if(CMAKE_C_COMPILER_ID STREQUAL "GNU") + if(CMAKE_C_COMPILER_VERSION VERSION_LESS "10") + set(KAI_I8MM OFF) + endif() + + if(CMAKE_C_COMPILER_VERSION VERSION_LESS "8") + set(KAI_FP16 OFF) + set(KAI_DOTPROD OFF) + endif() +endif() set(KAI_FILES_NEON kai/ukernels/matmul/pack/kai_lhs_quant_pack_qai8dxp_f32.c @@ -104,19 +104,19 @@ set(KAI_FILES_NEON_I8MM kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp8x8_8x8x32_neon_i8mm.c ) -SET(KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON}) +set(KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON}) -IF(KAI_I8MM) - LIST(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_I8MM}) -ENDIF() +if(KAI_I8MM) + list(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_I8MM}) +endif() -IF(KAI_DOTPROD) - LIST(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_DOTPROD}) -ENDIF() +if(KAI_DOTPROD) + list(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_DOTPROD}) +endif() -IF(KAI_FP16) - LIST(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_FP16}) -ENDIF() +if(KAI_FP16) + list(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_FP16}) +endif() add_library(kleidiai ${KAI_MICROKERNEL_SRCS} -- GitLab From 5395365077a470cd47913833a44a2929e0054bc8 Mon Sep 17 00:00:00 2001 From: Felix Thomasmathibalan Date: Thu, 13 Jun 2024 10:56:37 +0100 Subject: [PATCH 3/8] Remove arm compiler option from scalar files Signed-off-by: Felix Thomasmathibalan --- CMakeLists.txt | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d47c196..7f97a159 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,33 +56,25 @@ set(KAI_WARNING_FLAGS $<$:${KAI_WARNING_FLAGS_CXX}> ) -set(KAI_I8MM ON CACHE STRING "" INTERNAL) -set(KAI_FP16 ON CACHE STRING "" INTERNAL) -set(KAI_DOTPROD ON CACHE STRING "" INTERNAL) +set(KAI_I8MM_ENABLED ON) +set(KAI_FP16_ENABLED ON) +set(KAI_DOTPROD_ENABLED ON) +set(KAI_MIN_CLANG_VERSION 11) +set(KAI_MIN_GNU_VERSION 11) if(CMAKE_C_COMPILER_ID STREQUAL "Clang") - if(CMAKE_C_COMPILER_VERSION VERSION_LESS "11") - set(KAI_I8MM OFF) - endif() - - if(CMAKE_C_COMPILER_VERSION VERSION_LESS "7") - set(KAI_FP16 OFF) - set(KAI_DOTPROD OFF) + if(CMAKE_C_COMPILER_VERSION VERSION_LESS ${KAI_MIN_CLANG_VERSION}) + message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KAI_MIN_CLANG_VERSION}, Received ${CMAKE_C_COMPILER_VERSION} ") endif() endif() if(CMAKE_C_COMPILER_ID STREQUAL "GNU") - if(CMAKE_C_COMPILER_VERSION VERSION_LESS "10") - set(KAI_I8MM OFF) - endif() - - if(CMAKE_C_COMPILER_VERSION VERSION_LESS "8") - set(KAI_FP16 OFF) - set(KAI_DOTPROD OFF) + if(CMAKE_C_COMPILER_VERSION VERSION_LESS ${KAI_MIN_GNU_VERSION}) + message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KAI_MIN_GNU_VERSION}, Received ${CMAKE_C_COMPILER_VERSION} ") endif() endif() -set(KAI_FILES_NEON +set(KAI_FILES_SCALAR kai/ukernels/matmul/pack/kai_lhs_quant_pack_qai8dxp_f32.c kai/ukernels/matmul/pack/kai_rhs_pack_nxk_qsi4cxp_qsu4cxs1s0.c ) @@ -104,17 +96,17 @@ set(KAI_FILES_NEON_I8MM kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp8x8_8x8x32_neon_i8mm.c ) -set(KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON}) +set(KAI_MICROKERNEL_SRCS ${KAI_FILES_SCALAR}) -if(KAI_I8MM) +if(KAI_I8MM_ENABLED) list(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_I8MM}) endif() -if(KAI_DOTPROD) +if(KAI_DOTPROD_ENABLED) list(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_DOTPROD}) endif() -if(KAI_FP16) +if(KAI_FP16_ENABLED) list(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_FP16}) endif() @@ -130,9 +122,11 @@ target_compile_options(kleidiai PRIVATE ${KAI_WARNING_FLAGS} ) -foreach(KAI_SOURCE_FILE IN LISTS KAI_FILES_NEON) - set_property(SOURCE ${KAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8-a) -endforeach() +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + foreach(KAI_SOURCE_FILE IN LISTS KAI_FILES_SCALAR) + set_property(SOURCE ${KAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8-a) + endforeach() +endif() foreach(KAI_SOURCE_FILE IN LISTS KAI_FILES_NEON_FP16) set_property(SOURCE ${KAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8.2-a+fp16) -- GitLab From 940cfb12f395cd85f488fd688d176c1e9323b047 Mon Sep 17 00:00:00 2001 From: Felix Thomasmathibalan Date: Thu, 13 Jun 2024 14:47:46 +0100 Subject: [PATCH 4/8] Address reivew comment Signed-off-by: Felix Thomasmathibalan --- CMakeLists.txt | 64 +++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f97a159..3c7cefb7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,15 +21,15 @@ set(CMAKE_CXX_EXTENSIONS OFF) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") include(FetchGTest) -option(KAI_BUILD_TESTS "Build unit tests." ON) -option(KAI_ENABLE_CLANG_TIDY "Build with Clang-Tidy checks." OFF) +option(KLEIDIAI_BUILD_TESTS "Build unit tests." ON) +option(KLEIDIAI_ENABLE_CLANG_TIDY "Build with Clang-Tidy checks." OFF) -if(KAI_ENABLE_CLANG_TIDY) +if(KLEIDIAI_ENABLE_CLANG_TIDY) set(CMAKE_C_CLANG_TIDY "clang-tidy") set(CMAKE_CXX_CLANG_TIDY "clang-tidy") endif() -set(KAI_WARNING_FLAGS_C +set(KLEIDIAI_WARNING_FLAGS_C "-Wall" "-Wdisabled-optimization" "-Werror" @@ -44,16 +44,16 @@ set(KAI_WARNING_FLAGS_C "-Wswitch-default" ) -set(KAI_WARNING_FLAGS_CXX +set(KLEIDIAI_WARNING_FLAGS_CXX "-Wctor-dtor-privacy" "-Weffc++" "-Woverloaded-virtual" "-Wsign-promo" ) -set(KAI_WARNING_FLAGS - ${KAI_WARNING_FLAGS_C} - $<$:${KAI_WARNING_FLAGS_CXX}> +set(KLEIDIAI_WARNING_FLAGS + ${KLEIDIAI_WARNING_FLAGS_C} + $<$:${KLEIDIAI_WARNING_FLAGS_CXX}> ) set(KAI_I8MM_ENABLED ON) @@ -74,44 +74,44 @@ if(CMAKE_C_COMPILER_ID STREQUAL "GNU") endif() endif() -set(KAI_FILES_SCALAR +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 ) -set(KAI_FILES_NEON_FP16 +set(KLEIDIAI_FILES_NEON_FP16 kai/ukernels/matmul/pack/kai_rhs_pack_kxn_f16p16x1biasf16_f16_f16_neon.c kai/ukernels/matmul/matmul_clamp_f16_f16_f16p/kai_matmul_clamp_f16_f16_f16p16x1biasf16_6x16x8_neon_mla.c ) -set(KAI_FILES_NEON_DOTPROD +set(KLEIDIAI_FILES_NEON_DOTPROD kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp1x8_qsi4cxp4x8_1x4x32_neon_dotprod.c kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp1x8_qsi4cxp8x8_1x8x32_neon_dotprod.c ) -set(KAI_FILES_NEON_I8MM +set(KLEIDIAI_FILES_NEON_I8MM kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp4x8_4x4x32_neon_i8mm.c kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp4x8_8x4x32_neon_i8mm.c kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp8x8_4x8x32_neon_i8mm.c kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp8x8_8x8x32_neon_i8mm.c ) -set(KAI_MICROKERNEL_SRCS ${KAI_FILES_SCALAR}) +set(KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_SCALAR}) if(KAI_I8MM_ENABLED) - list(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_I8MM}) + list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_I8MM}) endif() if(KAI_DOTPROD_ENABLED) - list(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_DOTPROD}) + list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_DOTPROD}) endif() if(KAI_FP16_ENABLED) - list(APPEND KAI_MICROKERNEL_SRCS ${KAI_FILES_NEON_FP16}) + list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_FP16}) endif() add_library(kleidiai - ${KAI_MICROKERNEL_SRCS} + ${KLEIDIAI_MICROKERNEL_SRCS} ) target_include_directories(kleidiai @@ -119,28 +119,28 @@ target_include_directories(kleidiai ) target_compile_options(kleidiai - PRIVATE ${KAI_WARNING_FLAGS} + PRIVATE ${KLEIDIAI_WARNING_FLAGS} ) if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") - foreach(KAI_SOURCE_FILE IN LISTS KAI_FILES_SCALAR) - set_property(SOURCE ${KAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8-a) + foreach(KLEIDIAI_SOURCE_FILE IN LISTS KLEIDIAI_FILES_SCALAR) + set_property(SOURCE ${KLEIDIAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8-a) endforeach() -endif() -foreach(KAI_SOURCE_FILE IN LISTS KAI_FILES_NEON_FP16) - set_property(SOURCE ${KAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8.2-a+fp16) -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(KAI_SOURCE_FILE IN LISTS KAI_FILES_NEON_DOTPROD) - set_property(SOURCE ${KAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8.2-a+dotprod) -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(KAI_SOURCE_FILE IN LISTS KAI_FILES_NEON_I8MM) - set_property(SOURCE ${KAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8.2-a+i8mm) -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() +endif() -if(KAI_BUILD_TESTS) +if(KLEIDIAI_BUILD_TESTS) enable_testing() include(GoogleTest) @@ -169,7 +169,7 @@ if(KAI_BUILD_TESTS) ) target_compile_options(kleidiai_test - PRIVATE ${KAI_WARNING_FLAGS} + PRIVATE ${KLEIDIAI_WARNING_FLAGS} PRIVATE -march=armv8.2-a+fp16+bf16 ) -- GitLab From 472a7fce63c3d9db6f5b33a783b6182d5f98ce9c Mon Sep 17 00:00:00 2001 From: Felix Thomasmathibalan Date: Thu, 13 Jun 2024 16:07:34 +0100 Subject: [PATCH 5/8] Address review comments Signed-off-by: Felix Thomasmathibalan --- CMakeLists.txt | 41 +++++++++++++++-------------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c7cefb7..89aa043d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,21 +56,18 @@ set(KLEIDIAI_WARNING_FLAGS $<$:${KLEIDIAI_WARNING_FLAGS_CXX}> ) -set(KAI_I8MM_ENABLED ON) -set(KAI_FP16_ENABLED ON) -set(KAI_DOTPROD_ENABLED ON) set(KAI_MIN_CLANG_VERSION 11) set(KAI_MIN_GNU_VERSION 11) if(CMAKE_C_COMPILER_ID STREQUAL "Clang") if(CMAKE_C_COMPILER_VERSION VERSION_LESS ${KAI_MIN_CLANG_VERSION}) - message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KAI_MIN_CLANG_VERSION}, Received ${CMAKE_C_COMPILER_VERSION} ") + message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KAI_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 ${KAI_MIN_GNU_VERSION}) - message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KAI_MIN_GNU_VERSION}, Received ${CMAKE_C_COMPILER_VERSION} ") + message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KAI_MIN_GNU_VERSION} or newer, Received ${CMAKE_C_COMPILER_VERSION} ") endif() endif() @@ -98,31 +95,11 @@ set(KLEIDIAI_FILES_NEON_I8MM set(KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_SCALAR}) -if(KAI_I8MM_ENABLED) +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_I8MM}) -endif() - -if(KAI_DOTPROD_ENABLED) list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_DOTPROD}) -endif() - -if(KAI_FP16_ENABLED) list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_FP16}) -endif() - -add_library(kleidiai - ${KLEIDIAI_MICROKERNEL_SRCS} -) - -target_include_directories(kleidiai - PUBLIC . -) -target_compile_options(kleidiai - PRIVATE ${KLEIDIAI_WARNING_FLAGS} -) - -if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") foreach(KLEIDIAI_SOURCE_FILE IN LISTS KLEIDIAI_FILES_SCALAR) set_property(SOURCE ${KLEIDIAI_SOURCE_FILE} PROPERTY COMPILE_OPTIONS -march=armv8-a) endforeach() @@ -140,6 +117,18 @@ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL endforeach() endif() +add_library(kleidiai + ${KLEIDIAI_MICROKERNEL_SRCS} +) + +target_include_directories(kleidiai + PUBLIC . +) + +target_compile_options(kleidiai + PRIVATE ${KLEIDIAI_WARNING_FLAGS} +) + if(KLEIDIAI_BUILD_TESTS) enable_testing() include(GoogleTest) -- GitLab From e4b27f8144da7eb3ea7654d6228efa59885e69fd Mon Sep 17 00:00:00 2001 From: Jakub Sujak Date: Thu, 13 Jun 2024 17:47:17 +0100 Subject: [PATCH 6/8] Enable MSVC compatibility Signed-off-by: Jakub Sujak --- CMakeLists.txt | 53 +++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 89aa043d..a5975d15 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,27 +29,33 @@ 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} @@ -95,7 +101,10 @@ set(KLEIDIAI_FILES_NEON_I8MM set(KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_SCALAR}) -if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") +# 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) list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_I8MM}) list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_DOTPROD}) list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_FP16}) -- GitLab From cf4f5b73dd541fdc6bde6ee998bac77400990d8d Mon Sep 17 00:00:00 2001 From: Felix Thomasmathibalan Date: Wed, 19 Jun 2024 10:17:33 +0100 Subject: [PATCH 7/8] Review comment: Replace KAI with KLEIDIAI Signed-off-by: Felix Thomasmathibalan --- CMakeLists.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a5975d15..789048e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,18 +62,18 @@ set(KLEIDIAI_WARNING_FLAGS $<$:${KLEIDIAI_WARNING_FLAGS_CXX}> ) -set(KAI_MIN_CLANG_VERSION 11) -set(KAI_MIN_GNU_VERSION 11) +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 ${KAI_MIN_CLANG_VERSION}) - message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KAI_MIN_CLANG_VERSION} or newer, Received ${CMAKE_C_COMPILER_VERSION} ") + 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 ${KAI_MIN_GNU_VERSION}) - message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KAI_MIN_GNU_VERSION} or newer, Received ${CMAKE_C_COMPILER_VERSION} ") + 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() -- GitLab From 26280951147a15582ad87324f0ba6d7238b39e79 Mon Sep 17 00:00:00 2001 From: Jakub Sujak Date: Thu, 27 Jun 2024 11:47:10 +0100 Subject: [PATCH 8/8] Use target_sources() and set_source_files_properties() Signed-off-by: Jakub Sujak --- CMakeLists.txt | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 789048e0..11e1923c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,13 +67,13 @@ 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} ") + 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} ") + message(WARNING "KleidiAI: Using non-supported Clang version. Expected ${KLEIDIAI_MIN_GNU_VERSION} or newer, received ${CMAKE_C_COMPILER_VERSION} ") endif() endif() @@ -99,37 +99,23 @@ set(KLEIDIAI_FILES_NEON_I8MM kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi4cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi4cxp8x8_8x8x32_neon_i8mm.c ) -set(KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_SCALAR}) +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) - list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_I8MM}) - list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_DOTPROD}) - list(APPEND KLEIDIAI_MICROKERNEL_SRCS ${KLEIDIAI_FILES_NEON_FP16}) - - foreach(KLEIDIAI_SOURCE_FILE IN LISTS KLEIDIAI_FILES_SCALAR) - 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() + 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() -add_library(kleidiai - ${KLEIDIAI_MICROKERNEL_SRCS} -) - target_include_directories(kleidiai PUBLIC . ) -- GitLab