Skip to content

Commit 605c2f4

Browse files
authored
Remove fp16 support from apple (microsoft#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.
1 parent 4645726 commit 605c2f4

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

cmake/onnxruntime_mlas.cmake

+14-10
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ function(setup_mlas_source_for_windows)
8989
${MLAS_SRC_DIR}/qgemm_kernel_neon.cpp
9090
${MLAS_SRC_DIR}/qgemm_kernel_udot.cpp
9191
${MLAS_SRC_DIR}/qgemm_kernel_sdot.cpp
92-
${MLAS_SRC_DIR}/dwconv.cpp
9392
)
9493

9594
set(mlas_platform_preprocess_srcs
@@ -334,7 +333,6 @@ else()
334333
${MLAS_SRC_DIR}/aarch64/DepthwiseQConvSymS8KernelNeon.S
335334
${MLAS_SRC_DIR}/aarch64/DepthwiseQConvSymU8KernelNeon.S
336335
${MLAS_SRC_DIR}/aarch64/DepthwiseQConvKernelSize9Neon.S
337-
${MLAS_SRC_DIR}/aarch64/HalfGemmKernelNeon.S
338336
${MLAS_SRC_DIR}/aarch64/QgemmU8X8KernelNeon.S
339337
${MLAS_SRC_DIR}/aarch64/QgemmS8S8KernelNeon.S
340338
${MLAS_SRC_DIR}/aarch64/QgemmU8X8KernelUdot.S
@@ -344,18 +342,24 @@ else()
344342
${MLAS_SRC_DIR}/aarch64/SymQgemmS8KernelNeon.S
345343
${MLAS_SRC_DIR}/aarch64/SymQgemmS8KernelSdot.S
346344
${MLAS_SRC_DIR}/aarch64/SymQgemmS8KernelSdotLd64.S
347-
${MLAS_SRC_DIR}/activate_fp16.cpp
348-
${MLAS_SRC_DIR}/dwconv.cpp
349-
${MLAS_SRC_DIR}/halfgemm_kernel_neon.cpp
350-
${MLAS_SRC_DIR}/pooling_fp16.cpp
351345
${MLAS_SRC_DIR}/qgemm_kernel_neon.cpp
352346
${MLAS_SRC_DIR}/qgemm_kernel_udot.cpp
353347
${MLAS_SRC_DIR}/qgemm_kernel_sdot.cpp
354348
)
355-
set_source_files_properties(${MLAS_SRC_DIR}/aarch64/HalfGemmKernelNeon.S PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ")
356-
set_source_files_properties(${MLAS_SRC_DIR}/activate_fp16.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ")
357-
set_source_files_properties(${MLAS_SRC_DIR}/dwconv.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ")
358-
set_source_files_properties(${MLAS_SRC_DIR}/pooling_fp16.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ")
349+
if (NOT APPLE)
350+
set(mlas_platform_srcs
351+
${mlas_platform_srcs}
352+
${MLAS_SRC_DIR}/aarch64/HalfGemmKernelNeon.S
353+
${MLAS_SRC_DIR}/activate_fp16.cpp
354+
${MLAS_SRC_DIR}/dwconv.cpp
355+
${MLAS_SRC_DIR}/halfgemm_kernel_neon.cpp
356+
${MLAS_SRC_DIR}/pooling_fp16.cpp
357+
)
358+
set_source_files_properties(${MLAS_SRC_DIR}/aarch64/HalfGemmKernelNeon.S PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ")
359+
set_source_files_properties(${MLAS_SRC_DIR}/activate_fp16.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ")
360+
set_source_files_properties(${MLAS_SRC_DIR}/dwconv.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ")
361+
set_source_files_properties(${MLAS_SRC_DIR}/pooling_fp16.cpp PROPERTIES COMPILE_FLAGS " -march=armv8.2-a+fp16 ")
362+
endif()
359363

360364
if(ONNXRUNTIME_MLAS_MULTI_ARCH)
361365
onnxruntime_add_static_library(onnxruntime_mlas_arm64 ${mlas_platform_srcs})

onnxruntime/core/mlas/inc/mlas.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,16 @@ Module Name:
7878
#endif
7979

8080
#if (!defined(_MSC_VER)) || (_MSC_VER >= 1930)
81-
// Visual Studio older than 2022 does not support fp16 intrinsic
82-
8381
#if defined(MLAS_TARGET_ARM64) || defined(MLAS_TARGET_ARM64EC)
82+
#if !defined(__APPLE__)
83+
// Had to temporary disable fp16 under APPLE ARM64, as compiling
84+
// the source files require a hardware specific compilation flag.
85+
// When building an universial binary for APPLE, this flag would
86+
// cause trouble for x64 target.
8487

8588
#define MLAS_F16VEC_INTRINSICS_SUPPORTED
8689

90+
#endif //
8791
#endif // ARM64
8892
#endif // Visual Studio 16 or earlier does not support fp16 intrinsic
8993

onnxruntime/core/mlas/lib/halfgemm.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -499,15 +499,15 @@ struct MLAS_HALFGEMM_DISPATCH {
499499

500500
extern const MLAS_HALFGEMM_DISPATCH MlasHalfGemmDispatchDefault;
501501

502-
#if defined(MLAS_TARGET_ARM64)
502+
#if defined(MLAS_F16VEC_INTRINSICS_SUPPORTED) && defined(MLAS_TARGET_ARM64)
503503
extern const MLAS_HALFGEMM_DISPATCH MlasHalfGemmDispatchNeon;
504504
#endif
505505

506506
MLAS_FORCEINLINE
507507
const MLAS_HALFGEMM_DISPATCH*
508508
MlasHalfGemmGetDispatch()
509509
{
510-
#if defined(MLAS_TARGET_ARM64)
510+
#if defined(MLAS_F16VEC_INTRINSICS_SUPPORTED) && defined(MLAS_TARGET_ARM64)
511511
return &MlasHalfGemmDispatchNeon;
512512
#else
513513
return &MlasHalfGemmDispatchDefault;

0 commit comments

Comments
 (0)