From 605c2f4b89afbda363856cf7a6982f42f178f12a Mon Sep 17 00:00:00 2001 From: Chen Fu <1316708+chenfucn@users.noreply.github.com> Date: Thu, 30 Mar 2023 16:44:26 -0700 Subject: [PATCH] Remove fp16 support from apple (#15270) ### Description Removing fp16 support from apple build ### Motivation and Context FP16 support on ARM64 only available after armv8.2a, thus the clang compiler needs a compilation flag `-march=armv8.2-a+fp16`. Unfortunately, our current universal build does not support hardware specific compilation flags on cpp source files, as it would cause trouble when compiling against more than one hardware target. Until we figure out how to remove this limitation, had to disable fp16 support for Apple systems. --- cmake/onnxruntime_mlas.cmake | 24 ++++++++++++++---------- onnxruntime/core/mlas/inc/mlas.h | 8 ++++++-- onnxruntime/core/mlas/lib/halfgemm.h | 4 ++-- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/cmake/onnxruntime_mlas.cmake b/cmake/onnxruntime_mlas.cmake index 42f4b8960e..09a97d880c 100644 --- a/cmake/onnxruntime_mlas.cmake +++ b/cmake/onnxruntime_mlas.cmake @@ -89,7 +89,6 @@ function(setup_mlas_source_for_windows) ${MLAS_SRC_DIR}/qgemm_kernel_neon.cpp ${MLAS_SRC_DIR}/qgemm_kernel_udot.cpp ${MLAS_SRC_DIR}/qgemm_kernel_sdot.cpp - ${MLAS_SRC_DIR}/dwconv.cpp ) set(mlas_platform_preprocess_srcs @@ -334,7 +333,6 @@ else() ${MLAS_SRC_DIR}/aarch64/DepthwiseQConvSymS8KernelNeon.S ${MLAS_SRC_DIR}/aarch64/DepthwiseQConvSymU8KernelNeon.S ${MLAS_SRC_DIR}/aarch64/DepthwiseQConvKernelSize9Neon.S - ${MLAS_SRC_DIR}/aarch64/HalfGemmKernelNeon.S ${MLAS_SRC_DIR}/aarch64/QgemmU8X8KernelNeon.S ${MLAS_SRC_DIR}/aarch64/QgemmS8S8KernelNeon.S ${MLAS_SRC_DIR}/aarch64/QgemmU8X8KernelUdot.S @@ -344,18 +342,24 @@ else() ${MLAS_SRC_DIR}/aarch64/SymQgemmS8KernelNeon.S ${MLAS_SRC_DIR}/aarch64/SymQgemmS8KernelSdot.S ${MLAS_SRC_DIR}/aarch64/SymQgemmS8KernelSdotLd64.S - ${MLAS_SRC_DIR}/activate_fp16.cpp - ${MLAS_SRC_DIR}/dwconv.cpp - ${MLAS_SRC_DIR}/halfgemm_kernel_neon.cpp - ${MLAS_SRC_DIR}/pooling_fp16.cpp ${MLAS_SRC_DIR}/qgemm_kernel_neon.cpp ${MLAS_SRC_DIR}/qgemm_kernel_udot.cpp ${MLAS_SRC_DIR}/qgemm_kernel_sdot.cpp ) - set_source_files_properties(${MLAS_SRC_DIR}/aarch64/HalfGemmKernelNeon.S PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ") - set_source_files_properties(${MLAS_SRC_DIR}/activate_fp16.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ") - set_source_files_properties(${MLAS_SRC_DIR}/dwconv.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ") - set_source_files_properties(${MLAS_SRC_DIR}/pooling_fp16.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ") + if (NOT APPLE) + set(mlas_platform_srcs + ${mlas_platform_srcs} + ${MLAS_SRC_DIR}/aarch64/HalfGemmKernelNeon.S + ${MLAS_SRC_DIR}/activate_fp16.cpp + ${MLAS_SRC_DIR}/dwconv.cpp + ${MLAS_SRC_DIR}/halfgemm_kernel_neon.cpp + ${MLAS_SRC_DIR}/pooling_fp16.cpp + ) + set_source_files_properties(${MLAS_SRC_DIR}/aarch64/HalfGemmKernelNeon.S PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ") + set_source_files_properties(${MLAS_SRC_DIR}/activate_fp16.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ") + set_source_files_properties(${MLAS_SRC_DIR}/dwconv.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ") + set_source_files_properties(${MLAS_SRC_DIR}/pooling_fp16.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ") + endif() if(ONNXRUNTIME_MLAS_MULTI_ARCH) onnxruntime_add_static_library(onnxruntime_mlas_arm64 ${mlas_platform_srcs}) diff --git a/onnxruntime/core/mlas/inc/mlas.h b/onnxruntime/core/mlas/inc/mlas.h index f4cc6b1005..a7cffa384e 100644 --- a/onnxruntime/core/mlas/inc/mlas.h +++ b/onnxruntime/core/mlas/inc/mlas.h @@ -78,12 +78,16 @@ Abstract: #endif #if (!defined(_MSC_VER)) || (_MSC_VER >= 1930) -// Visual Studio older than 2022 does not support fp16 intrinsic - #if defined(MLAS_TARGET_ARM64) || defined(MLAS_TARGET_ARM64EC) +#if !defined(__APPLE__) +// Had to temporary disable fp16 under APPLE ARM64, as compiling +// the source files require a hardware specific compilation flag. +// When building an universial binary for APPLE, this flag would +// cause trouble for x64 target. #define MLAS_F16VEC_INTRINSICS_SUPPORTED +#endif // #endif // ARM64 #endif // Visual Studio 16 or earlier does not support fp16 intrinsic diff --git a/onnxruntime/core/mlas/lib/halfgemm.h b/onnxruntime/core/mlas/lib/halfgemm.h index 9e78120757..61e2fbb0af 100644 --- a/onnxruntime/core/mlas/lib/halfgemm.h +++ b/onnxruntime/core/mlas/lib/halfgemm.h @@ -499,7 +499,7 @@ struct MLAS_HALFGEMM_DISPATCH { extern const MLAS_HALFGEMM_DISPATCH MlasHalfGemmDispatchDefault; -#if defined(MLAS_TARGET_ARM64) +#if defined(MLAS_F16VEC_INTRINSICS_SUPPORTED) && defined(MLAS_TARGET_ARM64) extern const MLAS_HALFGEMM_DISPATCH MlasHalfGemmDispatchNeon; #endif @@ -507,7 +507,7 @@ MLAS_FORCEINLINE const MLAS_HALFGEMM_DISPATCH* MlasHalfGemmGetDispatch() { -#if defined(MLAS_TARGET_ARM64) +#if defined(MLAS_F16VEC_INTRINSICS_SUPPORTED) && defined(MLAS_TARGET_ARM64) return &MlasHalfGemmDispatchNeon; #else return &MlasHalfGemmDispatchDefault;