From 534fdeaabbf3052a133e366f17634e5dd8c26498 Mon Sep 17 00:00:00 2001 From: cfRod Date: Thu, 25 Jun 2020 18:12:25 +0100 Subject: [ONCPUML-96] FP16 support for 2D decomposition at high core counts. Added changes to gemm_fp16 to pick gemm interleaved pretransposed 2D for hgemm_24x8 and sgemm_12x8. Also added the change for scheduling hints based on datatype F16. Signed-off-by: cfRod Change-Id: Idd754cf14b47d00a70eab79bbb5ee3ecaf77450f Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/3477 Tested-by: Arm Jenkins Reviewed-by: Gian Marco Iodice Comments-Addressed: Arm Jenkins --- src/core/NEON/kernels/arm_gemm/gemm_fp16.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/core/NEON/kernels/arm_gemm/gemm_fp16.cpp') diff --git a/src/core/NEON/kernels/arm_gemm/gemm_fp16.cpp b/src/core/NEON/kernels/arm_gemm/gemm_fp16.cpp index 5f2840b243..91012218e5 100644 --- a/src/core/NEON/kernels/arm_gemm/gemm_fp16.cpp +++ b/src/core/NEON/kernels/arm_gemm/gemm_fp16.cpp @@ -31,6 +31,7 @@ #include "gemm_hybrid.hpp" #include "gemm_implementation.hpp" #include "gemm_interleaved.hpp" +#include "gemm_interleaved_pretransposed_2d.hpp" #include "kernels/a32_sgemm_8x6.hpp" #include "kernels/a64_hgemm_24x8.hpp" @@ -59,9 +60,20 @@ static const GemmImplementation<__fp16, __fp16> gemm_fp16_methods[] = { #endif #if defined(__aarch64__) && (defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) || defined(FP16_KERNELS)) +{ + GemmMethod::GEMM_INTERLEAVED_2D, + "hgemm_24x8_2d", +#ifndef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC + [](const GemmArgs &args) { return args._ci->has_fp16(); }, +#else + nullptr, +#endif + [](const GemmArgs &args) { return args._maxthreads >= 8; }, + [](const GemmArgs &args) { return new GemmInterleavedPretransposed2d(args); } +}, { GemmMethod::GEMM_INTERLEAVED, - "hgemm_24x8", + "hgemm_24x8_1d", #ifndef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC [](const GemmArgs &args) { return args._ci->has_fp16(); }, #else @@ -70,11 +82,21 @@ static const GemmImplementation<__fp16, __fp16> gemm_fp16_methods[] = { nullptr, [](const GemmArgs &args) { return new GemmInterleaved(args); } }, + #endif // aarch64 && FP16 #ifdef __aarch64__ +//Pretranpose, 2D split +{ + GemmMethod::GEMM_INTERLEAVED_2D, + "sgemm_12x8_2d", + nullptr, + [](const GemmArgs &args) { return args._maxthreads >= 8; }, + [](const GemmArgs &args) { return new GemmInterleavedPretransposed2d(args); } +}, +//Tranpose, 1D split, with blockmanager { GemmMethod::GEMM_INTERLEAVED, - "sgemm_12x8", + "sgemm_12x8_1d", nullptr, nullptr, [](const GemmArgs &args) { return new GemmInterleaved(args); } -- cgit v1.2.1