From 99a2a3d3c0d3f9d78ebbfbe6ec0de9f06e9c3f7e Mon Sep 17 00:00:00 2001 From: skykongkong8 Date: Wed, 7 Aug 2024 20:41:39 +0900 Subject: [PATCH] [ hgemm ] Generalize redundant micro hgemm kernel implementation - Previous implementation naively used fixed-sized ukernels for the K-direction accumulation. - Such kernels were excessively long, but had better performance than looping through single K-iteration. - However, recent test results have shown that justing stacking 4 K iters, and looping through such ukernel preserved the performance with better code readability. **Self evaluation:** 1. Build test: [X]Passed [ ]Failed [ ]Skipped 2. Run test: [X]Passed [ ]Failed [ ]Skipped Signed-off-by: skykongkong8 --- .../hgemm/hgemm_kernel/hgemm_kernel_4x8.cpp | 239 +------ .../hgemm/hgemm_kernel/hgemm_kernel_8x16.cpp | 652 +++-------------- .../hgemm_kernel_8x16_experimental.cpp | 660 +++--------------- .../hgemm/hgemm_kernel/hgemm_kernel_8x8.cpp | 365 ++-------- 4 files changed, 266 insertions(+), 1650 deletions(-) diff --git a/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_4x8.cpp b/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_4x8.cpp index d3232094..118e99d9 100644 --- a/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_4x8.cpp +++ b/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_4x8.cpp @@ -25,205 +25,41 @@ v9 = vdupq_n_f16(0.F); \ } while (0) -// 1. Partial sum 256 digits -#define KERNEL_4x8_ACC16() \ - do { \ - dv0 = vld1_f16(a); \ - v24 = vld1q_f16(b); \ - v0 = vfmaq_lane_f16(v0, v24, dv0, 0); \ - v3 = vfmaq_lane_f16(v3, v24, dv0, 1); \ - v6 = vfmaq_lane_f16(v6, v24, dv0, 2); \ - v9 = vfmaq_lane_f16(v9, v24, dv0, 3); \ - dv1 = vld1_f16(a + 4); \ - v25 = vld1q_f16(b + 8); \ - v0 = vfmaq_lane_f16(v0, v25, dv1, 0); \ - v3 = vfmaq_lane_f16(v3, v25, dv1, 1); \ - v6 = vfmaq_lane_f16(v6, v25, dv1, 2); \ - v9 = vfmaq_lane_f16(v9, v25, dv1, 3); \ - dv2 = vld1_f16(a + 4 * 2); \ - v26 = vld1q_f16(b + 8 * 2); \ - v0 = vfmaq_lane_f16(v0, v26, dv2, 0); \ - v3 = vfmaq_lane_f16(v3, v26, dv2, 1); \ - v6 = vfmaq_lane_f16(v6, v26, dv2, 2); \ - v9 = vfmaq_lane_f16(v9, v26, dv2, 3); \ - dv3 = vld1_f16(a + 4 * 3); \ - v27 = vld1q_f16(b + 8 * 3); \ - v0 = vfmaq_lane_f16(v0, v27, dv3, 0); \ - v3 = vfmaq_lane_f16(v3, v27, dv3, 1); \ - v6 = vfmaq_lane_f16(v6, v27, dv3, 2); \ - v9 = vfmaq_lane_f16(v9, v27, dv3, 3); \ - dv4 = vld1_f16(a + 4 * 4); \ - v28 = vld1q_f16(b + 8 * 4); \ - v0 = vfmaq_lane_f16(v0, v28, dv4, 0); \ - v3 = vfmaq_lane_f16(v3, v28, dv4, 1); \ - v6 = vfmaq_lane_f16(v6, v28, dv4, 2); \ - v9 = vfmaq_lane_f16(v9, v28, dv4, 3); \ - dv5 = vld1_f16(a + 4 * 5); \ - v29 = vld1q_f16(b + 8 * 5); \ - v0 = vfmaq_lane_f16(v0, v29, dv5, 0); \ - v3 = vfmaq_lane_f16(v3, v29, dv5, 1); \ - v6 = vfmaq_lane_f16(v6, v29, dv5, 2); \ - v9 = vfmaq_lane_f16(v9, v29, dv5, 3); \ - dv6 = vld1_f16(a + 4 * 6); \ - v30 = vld1q_f16(b + 8 * 6); \ - v0 = vfmaq_lane_f16(v0, v30, dv6, 0); \ - v3 = vfmaq_lane_f16(v3, v30, dv6, 1); \ - v6 = vfmaq_lane_f16(v6, v30, dv6, 2); \ - v9 = vfmaq_lane_f16(v9, v30, dv6, 3); \ - dv7 = vld1_f16(a + 4 * 7); \ - v31 = vld1q_f16(b + 8 * 7); \ - v0 = vfmaq_lane_f16(v0, v31, dv7, 0); \ - v3 = vfmaq_lane_f16(v3, v31, dv7, 1); \ - v6 = vfmaq_lane_f16(v6, v31, dv7, 2); \ - v9 = vfmaq_lane_f16(v9, v31, dv7, 3); \ - dv7 = vld1_f16(a + 4 * 8); \ - v31 = vld1q_f16(b + 8 * 8); \ - v0 = vfmaq_lane_f16(v0, v31, dv7, 0); \ - v3 = vfmaq_lane_f16(v3, v31, dv7, 1); \ - v6 = vfmaq_lane_f16(v6, v31, dv7, 2); \ - v9 = vfmaq_lane_f16(v9, v31, dv7, 3); \ - dv7 = vld1_f16(a + 4 * 9); \ - v31 = vld1q_f16(b + 8 * 9); \ - v0 = vfmaq_lane_f16(v0, v31, dv7, 0); \ - v3 = vfmaq_lane_f16(v3, v31, dv7, 1); \ - v6 = vfmaq_lane_f16(v6, v31, dv7, 2); \ - v9 = vfmaq_lane_f16(v9, v31, dv7, 3); \ - dv7 = vld1_f16(a + 4 * 10); \ - v31 = vld1q_f16(b + 8 * 10); \ - v0 = vfmaq_lane_f16(v0, v31, dv7, 0); \ - v3 = vfmaq_lane_f16(v3, v31, dv7, 1); \ - v6 = vfmaq_lane_f16(v6, v31, dv7, 2); \ - v9 = vfmaq_lane_f16(v9, v31, dv7, 3); \ - dv7 = vld1_f16(a + 4 * 11); \ - v31 = vld1q_f16(b + 8 * 11); \ - v0 = vfmaq_lane_f16(v0, v31, dv7, 0); \ - v3 = vfmaq_lane_f16(v3, v31, dv7, 1); \ - v6 = vfmaq_lane_f16(v6, v31, dv7, 2); \ - v9 = vfmaq_lane_f16(v9, v31, dv7, 3); \ - dv7 = vld1_f16(a + 4 * 12); \ - v31 = vld1q_f16(b + 8 * 12); \ - v0 = vfmaq_lane_f16(v0, v31, dv7, 0); \ - v3 = vfmaq_lane_f16(v3, v31, dv7, 1); \ - v6 = vfmaq_lane_f16(v6, v31, dv7, 2); \ - v9 = vfmaq_lane_f16(v9, v31, dv7, 3); \ - dv7 = vld1_f16(a + 4 * 13); \ - v31 = vld1q_f16(b + 8 * 13); \ - v0 = vfmaq_lane_f16(v0, v31, dv7, 0); \ - v3 = vfmaq_lane_f16(v3, v31, dv7, 1); \ - v6 = vfmaq_lane_f16(v6, v31, dv7, 2); \ - v9 = vfmaq_lane_f16(v9, v31, dv7, 3); \ - dv7 = vld1_f16(a + 4 * 14); \ - v31 = vld1q_f16(b + 8 * 14); \ - v0 = vfmaq_lane_f16(v0, v31, dv7, 0); \ - v3 = vfmaq_lane_f16(v3, v31, dv7, 1); \ - v6 = vfmaq_lane_f16(v6, v31, dv7, 2); \ - v9 = vfmaq_lane_f16(v9, v31, dv7, 3); \ - dv7 = vld1_f16(a + 4 * 15); \ - v31 = vld1q_f16(b + 8 * 15); \ - v0 = vfmaq_lane_f16(v0, v31, dv7, 0); \ - v3 = vfmaq_lane_f16(v3, v31, dv7, 1); \ - v6 = vfmaq_lane_f16(v6, v31, dv7, 2); \ - v9 = vfmaq_lane_f16(v9, v31, dv7, 3); \ - l += 16; \ - __builtin_prefetch(b + 128, 0, 3); \ - __builtin_prefetch(a + 64, 0, 3); \ - b += 8 * 16; \ - a += 4 * 16; \ +#define KERNEL_4x8_ACC_N4(N) \ + do { \ + for (int i = 0; i < N; i += 4) { \ + dv0 = vld1_f16(a + 4 * i); \ + v24 = vld1q_f16(b + 8 * i); \ + v0 = vfmaq_lane_f16(v0, v24, dv0, 0); \ + v3 = vfmaq_lane_f16(v3, v24, dv0, 1); \ + v6 = vfmaq_lane_f16(v6, v24, dv0, 2); \ + v9 = vfmaq_lane_f16(v9, v24, dv0, 3); \ + dv1 = vld1_f16(a + 4 * i + 4); \ + v25 = vld1q_f16(b + 8 * i + 8); \ + v0 = vfmaq_lane_f16(v0, v25, dv1, 0); \ + v3 = vfmaq_lane_f16(v3, v25, dv1, 1); \ + v6 = vfmaq_lane_f16(v6, v25, dv1, 2); \ + v9 = vfmaq_lane_f16(v9, v25, dv1, 3); \ + dv2 = vld1_f16(a + 4 * i + 8); \ + v26 = vld1q_f16(b + 8 * i + 16); \ + v0 = vfmaq_lane_f16(v0, v26, dv2, 0); \ + v3 = vfmaq_lane_f16(v3, v26, dv2, 1); \ + v6 = vfmaq_lane_f16(v6, v26, dv2, 2); \ + v9 = vfmaq_lane_f16(v9, v26, dv2, 3); \ + dv3 = vld1_f16(a + 4 * i + 12); \ + v27 = vld1q_f16(b + 8 * i + 24); \ + v0 = vfmaq_lane_f16(v0, v27, dv3, 0); \ + v3 = vfmaq_lane_f16(v3, v27, dv3, 1); \ + v6 = vfmaq_lane_f16(v6, v27, dv3, 2); \ + v9 = vfmaq_lane_f16(v9, v27, dv3, 3); \ + } \ + l += N; \ + __builtin_prefetch(b + 8 * N, 0, 3); \ + __builtin_prefetch(a + 4 * N, 0, 3); \ + b += 8 * N; \ + a += 4 * N; \ } while (0) -// 1. Partial sum 256 digits -#define KERNEL_4x8_ACC8() \ - do { \ - dv0 = vld1_f16(a); \ - v24 = vld1q_f16(b); \ - v0 = vfmaq_lane_f16(v0, v24, dv0, 0); \ - v3 = vfmaq_lane_f16(v3, v24, dv0, 1); \ - v6 = vfmaq_lane_f16(v6, v24, dv0, 2); \ - v9 = vfmaq_lane_f16(v9, v24, dv0, 3); \ - dv1 = vld1_f16(a + 4); \ - v25 = vld1q_f16(b + 8); \ - v0 = vfmaq_lane_f16(v0, v25, dv1, 0); \ - v3 = vfmaq_lane_f16(v3, v25, dv1, 1); \ - v6 = vfmaq_lane_f16(v6, v25, dv1, 2); \ - v9 = vfmaq_lane_f16(v9, v25, dv1, 3); \ - dv2 = vld1_f16(a + 8); \ - v26 = vld1q_f16(b + 16); \ - v0 = vfmaq_lane_f16(v0, v26, dv2, 0); \ - v3 = vfmaq_lane_f16(v3, v26, dv2, 1); \ - v6 = vfmaq_lane_f16(v6, v26, dv2, 2); \ - v9 = vfmaq_lane_f16(v9, v26, dv2, 3); \ - dv3 = vld1_f16(a + 12); \ - v27 = vld1q_f16(b + 24); \ - v0 = vfmaq_lane_f16(v0, v27, dv3, 0); \ - v3 = vfmaq_lane_f16(v3, v27, dv3, 1); \ - v6 = vfmaq_lane_f16(v6, v27, dv3, 2); \ - v9 = vfmaq_lane_f16(v9, v27, dv3, 3); \ - dv4 = vld1_f16(a + 16); \ - v28 = vld1q_f16(b + 32); \ - v0 = vfmaq_lane_f16(v0, v28, dv4, 0); \ - v3 = vfmaq_lane_f16(v3, v28, dv4, 1); \ - v6 = vfmaq_lane_f16(v6, v28, dv4, 2); \ - v9 = vfmaq_lane_f16(v9, v28, dv4, 3); \ - dv5 = vld1_f16(a + 20); \ - v29 = vld1q_f16(b + 40); \ - v0 = vfmaq_lane_f16(v0, v29, dv5, 0); \ - v3 = vfmaq_lane_f16(v3, v29, dv5, 1); \ - v6 = vfmaq_lane_f16(v6, v29, dv5, 2); \ - v9 = vfmaq_lane_f16(v9, v29, dv5, 3); \ - dv6 = vld1_f16(a + 24); \ - v30 = vld1q_f16(b + 48); \ - v0 = vfmaq_lane_f16(v0, v30, dv6, 0); \ - v3 = vfmaq_lane_f16(v3, v30, dv6, 1); \ - v6 = vfmaq_lane_f16(v6, v30, dv6, 2); \ - v9 = vfmaq_lane_f16(v9, v30, dv6, 3); \ - dv7 = vld1_f16(a + 28); \ - v31 = vld1q_f16(b + 56); \ - v0 = vfmaq_lane_f16(v0, v31, dv7, 0); \ - v3 = vfmaq_lane_f16(v3, v31, dv7, 1); \ - v6 = vfmaq_lane_f16(v6, v31, dv7, 2); \ - v9 = vfmaq_lane_f16(v9, v31, dv7, 3); \ - l += 8; \ - __builtin_prefetch(b + 64, 0, 3); \ - __builtin_prefetch(a + 32, 0, 3); \ - b += 8 * 8; \ - a += 4 * 8; \ - } while (0) - -// 2. Partial sum 128 digits -#define KERNEL_4x8_ACC4() \ - do { \ - dv0 = vld1_f16(a); \ - v24 = vld1q_f16(b); \ - v0 = vfmaq_lane_f16(v0, v24, dv0, 0); \ - v3 = vfmaq_lane_f16(v3, v24, dv0, 1); \ - v6 = vfmaq_lane_f16(v6, v24, dv0, 2); \ - v9 = vfmaq_lane_f16(v9, v24, dv0, 3); \ - dv1 = vld1_f16(a + 4); \ - v25 = vld1q_f16(b + 8); \ - v0 = vfmaq_lane_f16(v0, v25, dv1, 0); \ - v3 = vfmaq_lane_f16(v3, v25, dv1, 1); \ - v6 = vfmaq_lane_f16(v6, v25, dv1, 2); \ - v9 = vfmaq_lane_f16(v9, v25, dv1, 3); \ - dv2 = vld1_f16(a + 8); \ - v26 = vld1q_f16(b + 16); \ - v0 = vfmaq_lane_f16(v0, v26, dv2, 0); \ - v3 = vfmaq_lane_f16(v3, v26, dv2, 1); \ - v6 = vfmaq_lane_f16(v6, v26, dv2, 2); \ - v9 = vfmaq_lane_f16(v9, v26, dv2, 3); \ - dv3 = vld1_f16(a + 12); \ - v27 = vld1q_f16(b + 24); \ - v0 = vfmaq_lane_f16(v0, v27, dv3, 0); \ - v3 = vfmaq_lane_f16(v3, v27, dv3, 1); \ - v6 = vfmaq_lane_f16(v6, v27, dv3, 2); \ - v9 = vfmaq_lane_f16(v9, v27, dv3, 3); \ - l += 4; \ - __builtin_prefetch(b + 32, 0, 3); \ - __builtin_prefetch(a + 16, 0, 3); \ - b += 8 * 4; \ - a += 4 * 4; \ - } while (0) - -// 3. Partial sum 32 digits #define KERNEL_4x8_ACC1() \ do { \ dv0 = vld1_f16(a); \ @@ -277,9 +113,6 @@ void hgemm_kernel_4x8(unsigned int M, unsigned int N, unsigned int K, float16x4_t dv0, dv1, dv2, dv3, dv4, dv5, dv6, dv7; INIT_KERNEL_4X8(); l = 0; - for (; l < K8;) { - KERNEL_4x8_ACC8(); - } for (; l < K;) { KERNEL_4x8_ACC1(); } @@ -319,17 +152,17 @@ void hgemm_kernel_4x8(unsigned int M, unsigned int N, unsigned int K, l = 0; for (; l < K16;) { INIT_KERNEL_4X8(); - KERNEL_4x8_ACC16(); + KERNEL_4x8_ACC_N4(16); SAVE_KERNEL_4X8_F16_F32(); } for (; l < K8;) { INIT_KERNEL_4X8(); - KERNEL_4x8_ACC8(); + KERNEL_4x8_ACC_N4(8); SAVE_KERNEL_4X8_F16_F32(); } for (; l < K4;) { INIT_KERNEL_4X8(); - KERNEL_4x8_ACC4(); + KERNEL_4x8_ACC_N4(4); SAVE_KERNEL_4X8_F16_F32(); } for (; l < K;) { diff --git a/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x16.cpp b/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x16.cpp index 3df47b20..3ec2b030 100644 --- a/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x16.cpp +++ b/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x16.cpp @@ -37,569 +37,93 @@ v120_127 = vdupq_n_f16(0.F); \ } while (0) -// 1. Partial sum 2048 digits -#define KERNEL_8x16_ACC16() \ - do { \ - va0 = vld1q_f16(a + 8 * 0); \ - vb1 = vld1q_f16(b + 8 * 0); \ - vb2 = vld1q_f16(b + 8 * 1); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 1); \ - vb1 = vld1q_f16(b + 8 * 2); \ - vb2 = vld1q_f16(b + 8 * 3); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 2); \ - vb1 = vld1q_f16(b + 8 * 4); \ - vb2 = vld1q_f16(b + 8 * 5); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 3); \ - vb1 = vld1q_f16(b + 8 * 6); \ - vb2 = vld1q_f16(b + 8 * 7); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 4); \ - vb1 = vld1q_f16(b + 8 * 8); \ - vb2 = vld1q_f16(b + 8 * 9); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 5); \ - vb1 = vld1q_f16(b + 8 * 10); \ - vb2 = vld1q_f16(b + 8 * 11); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 6); \ - vb1 = vld1q_f16(b + 8 * 12); \ - vb2 = vld1q_f16(b + 8 * 13); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 7); \ - vb1 = vld1q_f16(b + 8 * 14); \ - vb2 = vld1q_f16(b + 8 * 15); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 8); \ - vb1 = vld1q_f16(b + 8 * 16); \ - vb2 = vld1q_f16(b + 8 * 17); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 9); \ - vb1 = vld1q_f16(b + 8 * 18); \ - vb2 = vld1q_f16(b + 8 * 19); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 10); \ - vb1 = vld1q_f16(b + 8 * 20); \ - vb2 = vld1q_f16(b + 8 * 21); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 11); \ - vb1 = vld1q_f16(b + 8 * 22); \ - vb2 = vld1q_f16(b + 8 * 23); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 12); \ - vb1 = vld1q_f16(b + 8 * 24); \ - vb2 = vld1q_f16(b + 8 * 25); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 13); \ - vb1 = vld1q_f16(b + 8 * 26); \ - vb2 = vld1q_f16(b + 8 * 27); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 14); \ - vb1 = vld1q_f16(b + 8 * 28); \ - vb2 = vld1q_f16(b + 8 * 29); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 15); \ - vb1 = vld1q_f16(b + 8 * 30); \ - vb2 = vld1q_f16(b + 8 * 31); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - __builtin_prefetch(b + 256, 0, 3); \ - __builtin_prefetch(a + 128, 0, 3); \ - l += 16; \ - b += 16 * 16; \ - a += 8 * 16; \ - } while (0) - -// 2. Partial sum 1024 digits -#define KERNEL_8x16_ACC8() \ - do { \ - va0 = vld1q_f16(a); \ - vb1 = vld1q_f16(b); \ - vb2 = vld1q_f16(b + 8); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8); \ - vb1 = vld1q_f16(b + 16); \ - vb2 = vld1q_f16(b + 24); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 16); \ - vb1 = vld1q_f16(b + 32); \ - vb2 = vld1q_f16(b + 40); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 24); \ - vb1 = vld1q_f16(b + 48); \ - vb2 = vld1q_f16(b + 56); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 32); \ - vb1 = vld1q_f16(b + 64); \ - vb2 = vld1q_f16(b + 72); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 40); \ - vb1 = vld1q_f16(b + 80); \ - vb2 = vld1q_f16(b + 88); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 48); \ - vb1 = vld1q_f16(b + 96); \ - vb2 = vld1q_f16(b + 104); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 56); \ - vb1 = vld1q_f16(b + 112); \ - vb2 = vld1q_f16(b + 120); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - l += 8; \ - __builtin_prefetch(b + 128, 0, 3); \ - __builtin_prefetch(a + 64, 0, 3); \ - b += 16 * 8; \ - a += 8 * 8; \ - } while (0) - -// 3. Partial sum 512 digits -#define KERNEL_8x16_ACC4() \ - do { \ - va0 = vld1q_f16(a); \ - vb1 = vld1q_f16(b); \ - vb2 = vld1q_f16(b + 8); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8); \ - vb1 = vld1q_f16(b + 16); \ - vb2 = vld1q_f16(b + 24); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 16); \ - vb1 = vld1q_f16(b + 32); \ - vb2 = vld1q_f16(b + 40); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 24); \ - vb1 = vld1q_f16(b + 48); \ - vb2 = vld1q_f16(b + 56); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - l += 4; \ - __builtin_prefetch(b + 64, 0, 3); \ - __builtin_prefetch(a + 32, 0, 3); \ - b += 16 * 4; \ - a += 8 * 4; \ +#define KERNEL_8x16_ACC_N4(N) \ + do { \ + for (int i = 0; i < N; i += 4) { \ + va0 = vld1q_f16(a + 8 * i); \ + vb1 = vld1q_f16(b + 16 * i); \ + vb2 = vld1q_f16(b + 16 * i + 8 * 1); \ + v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ + v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ + v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ + v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ + v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ + v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ + v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ + v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ + v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ + v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ + v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ + v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ + v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ + v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ + v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ + v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ + va0 = vld1q_f16(a + 8 * i + 8 * 1); \ + vb1 = vld1q_f16(b + 16 * i + 8 * 2); \ + vb2 = vld1q_f16(b + 16 * i + 8 * 3); \ + v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ + v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ + v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ + v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ + v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ + v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ + v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ + v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ + v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ + v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ + v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ + v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ + v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ + v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ + v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ + v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ + va0 = vld1q_f16(a + 8 * i + 8 * 2); \ + vb1 = vld1q_f16(b + 16 * i + 8 * 4); \ + vb2 = vld1q_f16(b + 16 * i + 8 * 5); \ + v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ + v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ + v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ + v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ + v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ + v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ + v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ + v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ + v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ + v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ + v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ + v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ + v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ + v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ + v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ + v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ + va0 = vld1q_f16(a + 8 * i + 8 * 3); \ + vb1 = vld1q_f16(b + 16 * i + 8 * 6); \ + vb2 = vld1q_f16(b + 16 * i + 8 * 7); \ + v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ + v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ + v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ + v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ + v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ + v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ + v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ + v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ + v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ + v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ + v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ + v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ + v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ + v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ + v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ + v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ + } \ + l += N; \ + __builtin_prefetch(b + 16 * N, 0, 3); \ + __builtin_prefetch(a + 8 * N, 0, 3); \ + b += 16 * N; \ + a += 8 * N; \ } while (0) -// 4. Partial sum 128 digits #define KERNEL_8x16_ACC1() \ do { \ va0 = vld1q_f16(a); \ @@ -814,17 +338,17 @@ void hgemm_kernel_8x16(unsigned int M, unsigned int N, unsigned int K, l = 0; for (; l < K16;) { INIT_KERNEL_8X16(); - KERNEL_8x16_ACC16(); + KERNEL_8x16_ACC_N4(16); SAVE_KERNEL_8X16_F16_F32(); } for (; l < K8;) { INIT_KERNEL_8X16(); - KERNEL_8x16_ACC8(); + KERNEL_8x16_ACC_N4(8); SAVE_KERNEL_8X16_F16_F32(); } for (; l < K4;) { INIT_KERNEL_8X16(); - KERNEL_8x16_ACC4(); + KERNEL_8x16_ACC_N4(4); SAVE_KERNEL_8X16_F16_F32(); } for (; l < K;) { diff --git a/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x16_experimental.cpp b/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x16_experimental.cpp index c39d3590..ebd75fec 100644 --- a/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x16_experimental.cpp +++ b/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x16_experimental.cpp @@ -38,569 +38,93 @@ v120_127 = vdupq_n_f16(0.F); \ } while (0) -// 1. Partial sum 2048 digits -#define KERNEL_8x16_ACC16() \ - do { \ - va0 = vld1q_f16(a + 8 * 0); \ - vb1 = vld1q_f16(b + 8 * 0); \ - vb2 = vld1q_f16(b + 8 * 1); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 1); \ - vb1 = vld1q_f16(b + 8 * 2); \ - vb2 = vld1q_f16(b + 8 * 3); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 2); \ - vb1 = vld1q_f16(b + 8 * 4); \ - vb2 = vld1q_f16(b + 8 * 5); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 3); \ - vb1 = vld1q_f16(b + 8 * 6); \ - vb2 = vld1q_f16(b + 8 * 7); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 4); \ - vb1 = vld1q_f16(b + 8 * 8); \ - vb2 = vld1q_f16(b + 8 * 9); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 5); \ - vb1 = vld1q_f16(b + 8 * 10); \ - vb2 = vld1q_f16(b + 8 * 11); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 6); \ - vb1 = vld1q_f16(b + 8 * 12); \ - vb2 = vld1q_f16(b + 8 * 13); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 7); \ - vb1 = vld1q_f16(b + 8 * 14); \ - vb2 = vld1q_f16(b + 8 * 15); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 8); \ - vb1 = vld1q_f16(b + 8 * 16); \ - vb2 = vld1q_f16(b + 8 * 17); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 9); \ - vb1 = vld1q_f16(b + 8 * 18); \ - vb2 = vld1q_f16(b + 8 * 19); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 10); \ - vb1 = vld1q_f16(b + 8 * 20); \ - vb2 = vld1q_f16(b + 8 * 21); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 11); \ - vb1 = vld1q_f16(b + 8 * 22); \ - vb2 = vld1q_f16(b + 8 * 23); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 12); \ - vb1 = vld1q_f16(b + 8 * 24); \ - vb2 = vld1q_f16(b + 8 * 25); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 13); \ - vb1 = vld1q_f16(b + 8 * 26); \ - vb2 = vld1q_f16(b + 8 * 27); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 14); \ - vb1 = vld1q_f16(b + 8 * 28); \ - vb2 = vld1q_f16(b + 8 * 29); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8 * 15); \ - vb1 = vld1q_f16(b + 8 * 30); \ - vb2 = vld1q_f16(b + 8 * 31); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - __builtin_prefetch(b + 256, 0, 3); \ - __builtin_prefetch(a + 128, 0, 3); \ - l += 16; \ - b += 16 * 16; \ - a += 8 * 16; \ - } while (0) - -// 2. Partial sum 1024 digits -#define KERNEL_8x16_ACC8() \ - do { \ - va0 = vld1q_f16(a); \ - vb1 = vld1q_f16(b); \ - vb2 = vld1q_f16(b + 8); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8); \ - vb1 = vld1q_f16(b + 16); \ - vb2 = vld1q_f16(b + 24); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 16); \ - vb1 = vld1q_f16(b + 32); \ - vb2 = vld1q_f16(b + 40); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 24); \ - vb1 = vld1q_f16(b + 48); \ - vb2 = vld1q_f16(b + 56); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 32); \ - vb1 = vld1q_f16(b + 64); \ - vb2 = vld1q_f16(b + 72); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 40); \ - vb1 = vld1q_f16(b + 80); \ - vb2 = vld1q_f16(b + 88); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 48); \ - vb1 = vld1q_f16(b + 96); \ - vb2 = vld1q_f16(b + 104); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 56); \ - vb1 = vld1q_f16(b + 112); \ - vb2 = vld1q_f16(b + 120); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - l += 8; \ - __builtin_prefetch(b + 128, 0, 3); \ - __builtin_prefetch(a + 64, 0, 3); \ - b += 16 * 8; \ - a += 8 * 8; \ - } while (0) - -// 3. Partial sum 512 digits -#define KERNEL_8x16_ACC4() \ - do { \ - va0 = vld1q_f16(a); \ - vb1 = vld1q_f16(b); \ - vb2 = vld1q_f16(b + 8); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 8); \ - vb1 = vld1q_f16(b + 16); \ - vb2 = vld1q_f16(b + 24); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 16); \ - vb1 = vld1q_f16(b + 32); \ - vb2 = vld1q_f16(b + 40); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - va0 = vld1q_f16(a + 24); \ - vb1 = vld1q_f16(b + 48); \ - vb2 = vld1q_f16(b + 56); \ - v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ - v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ - v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ - v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ - v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ - v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ - v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ - v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ - v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ - v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ - v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ - v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ - v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ - v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ - v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ - v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ - l += 4; \ - __builtin_prefetch(b + 64, 0, 3); \ - __builtin_prefetch(a + 32, 0, 3); \ - b += 16 * 4; \ - a += 8 * 4; \ +#define KERNEL_8x16_ACC_N4(N) \ + do { \ + for (int i = 0; i < N; i += 4) { \ + va0 = vld1q_f16(a + 8 * i); \ + vb1 = vld1q_f16(b + 16 * i); \ + vb2 = vld1q_f16(b + 16 * i + 8 * 1); \ + v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ + v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ + v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ + v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ + v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ + v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ + v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ + v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ + v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ + v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ + v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ + v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ + v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ + v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ + v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ + v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ + va0 = vld1q_f16(a + 8 * i + 8 * 1); \ + vb1 = vld1q_f16(b + 16 * i + 8 * 2); \ + vb2 = vld1q_f16(b + 16 * i + 8 * 3); \ + v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ + v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ + v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ + v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ + v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ + v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ + v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ + v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ + v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ + v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ + v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ + v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ + v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ + v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ + v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ + v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ + va0 = vld1q_f16(a + 8 * i + 8 * 2); \ + vb1 = vld1q_f16(b + 16 * i + 8 * 4); \ + vb2 = vld1q_f16(b + 16 * i + 8 * 5); \ + v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ + v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ + v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ + v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ + v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ + v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ + v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ + v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ + v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ + v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ + v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ + v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ + v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ + v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ + v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ + v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ + va0 = vld1q_f16(a + 8 * i + 8 * 3); \ + vb1 = vld1q_f16(b + 16 * i + 8 * 6); \ + vb2 = vld1q_f16(b + 16 * i + 8 * 7); \ + v0_7 = vfmaq_laneq_f16(v0_7, vb1, va0, 0); \ + v8_15 = vfmaq_laneq_f16(v8_15, vb1, va0, 1); \ + v16_23 = vfmaq_laneq_f16(v16_23, vb1, va0, 2); \ + v24_31 = vfmaq_laneq_f16(v24_31, vb1, va0, 3); \ + v32_39 = vfmaq_laneq_f16(v32_39, vb1, va0, 4); \ + v40_47 = vfmaq_laneq_f16(v40_47, vb1, va0, 5); \ + v48_55 = vfmaq_laneq_f16(v48_55, vb1, va0, 6); \ + v56_63 = vfmaq_laneq_f16(v56_63, vb1, va0, 7); \ + v64_71 = vfmaq_laneq_f16(v64_71, vb2, va0, 0); \ + v72_79 = vfmaq_laneq_f16(v72_79, vb2, va0, 1); \ + v80_87 = vfmaq_laneq_f16(v80_87, vb2, va0, 2); \ + v88_95 = vfmaq_laneq_f16(v88_95, vb2, va0, 3); \ + v96_103 = vfmaq_laneq_f16(v96_103, vb2, va0, 4); \ + v104_111 = vfmaq_laneq_f16(v104_111, vb2, va0, 5); \ + v112_119 = vfmaq_laneq_f16(v112_119, vb2, va0, 6); \ + v120_127 = vfmaq_laneq_f16(v120_127, vb2, va0, 7); \ + } \ + l += N; \ + __builtin_prefetch(b + 16 * N, 0, 3); \ + __builtin_prefetch(a + 8 * N, 0, 3); \ + b += 16 * N; \ + a += 8 * N; \ } while (0) -// 4. Partial sum 128 digits #define KERNEL_8x16_ACC1() \ do { \ va0 = vld1q_f16(a); \ @@ -766,31 +290,27 @@ void hgemm_kernel_8x16(unsigned int M, unsigned int N, unsigned int K, l = 0; for (; l < K64;) { INIT_KERNEL_8X16(); - KERNEL_8x16_ACC16(); - KERNEL_8x16_ACC16(); - KERNEL_8x16_ACC16(); - KERNEL_8x16_ACC16(); + KERNEL_8x16_ACC_N4(64); SAVE_KERNEL_8X16_F16_F32(); } for (; l < K32;) { INIT_KERNEL_8X16(); - KERNEL_8x16_ACC16(); - KERNEL_8x16_ACC16(); + KERNEL_8x16_ACC_N4(32); SAVE_KERNEL_8X16_F16_F32(); } for (; l < K16;) { INIT_KERNEL_8X16(); - KERNEL_8x16_ACC16(); + KERNEL_8x16_ACC_N4(16); SAVE_KERNEL_8X16_F16_F32(); } for (; l < K8;) { INIT_KERNEL_8X16(); - KERNEL_8x16_ACC8(); + KERNEL_8x16_ACC_N4(8); SAVE_KERNEL_8X16_F16_F32(); } for (; l < K4;) { INIT_KERNEL_8X16(); - KERNEL_8x16_ACC4(); + KERNEL_8x16_ACC_N4(4); SAVE_KERNEL_8X16_F16_F32(); } for (; l < K;) { diff --git a/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x8.cpp b/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x8.cpp index 241edcc6..b072c325 100644 --- a/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x8.cpp +++ b/nntrainer/tensor/hgemm/hgemm_kernel/hgemm_kernel_8x8.cpp @@ -29,317 +29,57 @@ v31 = vdupq_n_f16(0.F); \ } while (0) -// 1. Partial sum 1024 digits -#define KERNEL_8x8_ACC16() \ - do { \ - va0 = vld1q_f16(a); \ - v16 = vld1q_f16(b); \ - v24 = vfmaq_laneq_f16(v24, v16, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v16, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v16, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v16, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v16, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v16, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v16, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v16, va0, 7); \ - va0 = vld1q_f16(a + 8); \ - v17 = vld1q_f16(b + 8); \ - v24 = vfmaq_laneq_f16(v24, v17, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v17, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v17, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v17, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v17, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v17, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v17, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v17, va0, 7); \ - va0 = vld1q_f16(a + 8 * 2); \ - v18 = vld1q_f16(b + 8 * 2); \ - v24 = vfmaq_laneq_f16(v24, v18, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v18, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v18, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v18, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v18, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v18, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v18, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v18, va0, 7); \ - va0 = vld1q_f16(a + 8 * 3); \ - v19 = vld1q_f16(b + 8 * 3); \ - v24 = vfmaq_laneq_f16(v24, v19, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v19, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v19, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v19, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v19, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v19, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v19, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v19, va0, 7); \ - va0 = vld1q_f16(a + 8 * 4); \ - v20 = vld1q_f16(b + 8 * 4); \ - v24 = vfmaq_laneq_f16(v24, v20, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v20, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v20, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v20, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v20, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v20, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v20, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v20, va0, 7); \ - va0 = vld1q_f16(a + 8 * 5); \ - v21 = vld1q_f16(b + 8 * 5); \ - v24 = vfmaq_laneq_f16(v24, v21, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v21, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v21, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v21, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v21, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v21, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v21, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v21, va0, 7); \ - va0 = vld1q_f16(a + 8 * 6); \ - v22 = vld1q_f16(b + 8 * 6); \ - v24 = vfmaq_laneq_f16(v24, v22, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v22, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v22, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v22, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v22, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v22, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v22, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v22, va0, 7); \ - va0 = vld1q_f16(a + 8 * 7); \ - v23 = vld1q_f16(b + 8 * 7); \ - v24 = vfmaq_laneq_f16(v24, v23, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v23, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v23, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v23, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v23, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v23, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v23, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v23, va0, 7); \ - va0 = vld1q_f16(a + 8 * 8); \ - v23 = vld1q_f16(b + 8 * 8); \ - v24 = vfmaq_laneq_f16(v24, v23, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v23, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v23, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v23, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v23, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v23, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v23, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v23, va0, 7); \ - va0 = vld1q_f16(a + 8 * 9); \ - v23 = vld1q_f16(b + 8 * 9); \ - v24 = vfmaq_laneq_f16(v24, v23, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v23, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v23, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v23, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v23, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v23, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v23, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v23, va0, 7); \ - va0 = vld1q_f16(a + 8 * 10); \ - v23 = vld1q_f16(b + 8 * 10); \ - v24 = vfmaq_laneq_f16(v24, v23, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v23, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v23, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v23, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v23, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v23, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v23, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v23, va0, 7); \ - va0 = vld1q_f16(a + 8 * 11); \ - v23 = vld1q_f16(b + 8 * 11); \ - v24 = vfmaq_laneq_f16(v24, v23, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v23, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v23, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v23, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v23, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v23, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v23, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v23, va0, 7); \ - va0 = vld1q_f16(a + 8 * 12); \ - v23 = vld1q_f16(b + 8 * 12); \ - v24 = vfmaq_laneq_f16(v24, v23, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v23, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v23, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v23, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v23, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v23, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v23, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v23, va0, 7); \ - va0 = vld1q_f16(a + 8 * 13); \ - v23 = vld1q_f16(b + 8 * 13); \ - v24 = vfmaq_laneq_f16(v24, v23, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v23, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v23, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v23, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v23, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v23, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v23, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v23, va0, 7); \ - va0 = vld1q_f16(a + 8 * 14); \ - v23 = vld1q_f16(b + 8 * 14); \ - v24 = vfmaq_laneq_f16(v24, v23, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v23, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v23, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v23, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v23, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v23, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v23, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v23, va0, 7); \ - va0 = vld1q_f16(a + 8 * 15); \ - v23 = vld1q_f16(b + 8 * 15); \ - v24 = vfmaq_laneq_f16(v24, v23, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v23, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v23, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v23, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v23, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v23, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v23, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v23, va0, 7); \ - __builtin_prefetch(b + 128, 0, 3); \ - __builtin_prefetch(a + 128, 0, 3); \ - l += 16; \ - b += 8 * 16; \ - a += 8 * 16; \ - } while (0) - -// 2. Partial sum 512 digits -#define KERNEL_8x8_ACC8() \ - do { \ - va0 = vld1q_f16(a); \ - v16 = vld1q_f16(b); \ - v24 = vfmaq_laneq_f16(v24, v16, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v16, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v16, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v16, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v16, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v16, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v16, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v16, va0, 7); \ - va1 = vld1q_f16(a + 8); \ - v17 = vld1q_f16(b + 8); \ - v24 = vfmaq_laneq_f16(v24, v17, va1, 0); \ - v25 = vfmaq_laneq_f16(v25, v17, va1, 1); \ - v26 = vfmaq_laneq_f16(v26, v17, va1, 2); \ - v27 = vfmaq_laneq_f16(v27, v17, va1, 3); \ - v28 = vfmaq_laneq_f16(v28, v17, va1, 4); \ - v29 = vfmaq_laneq_f16(v29, v17, va1, 5); \ - v30 = vfmaq_laneq_f16(v30, v17, va1, 6); \ - v31 = vfmaq_laneq_f16(v31, v17, va1, 7); \ - va2 = vld1q_f16(a + 16); \ - v18 = vld1q_f16(b + 16); \ - v24 = vfmaq_laneq_f16(v24, v18, va2, 0); \ - v25 = vfmaq_laneq_f16(v25, v18, va2, 1); \ - v26 = vfmaq_laneq_f16(v26, v18, va2, 2); \ - v27 = vfmaq_laneq_f16(v27, v18, va2, 3); \ - v28 = vfmaq_laneq_f16(v28, v18, va2, 4); \ - v29 = vfmaq_laneq_f16(v29, v18, va2, 5); \ - v30 = vfmaq_laneq_f16(v30, v18, va2, 6); \ - v31 = vfmaq_laneq_f16(v31, v18, va2, 7); \ - va3 = vld1q_f16(a + 24); \ - v19 = vld1q_f16(b + 24); \ - v24 = vfmaq_laneq_f16(v24, v19, va3, 0); \ - v25 = vfmaq_laneq_f16(v25, v19, va3, 1); \ - v26 = vfmaq_laneq_f16(v26, v19, va3, 2); \ - v27 = vfmaq_laneq_f16(v27, v19, va3, 3); \ - v28 = vfmaq_laneq_f16(v28, v19, va3, 4); \ - v29 = vfmaq_laneq_f16(v29, v19, va3, 5); \ - v30 = vfmaq_laneq_f16(v30, v19, va3, 6); \ - v31 = vfmaq_laneq_f16(v31, v19, va3, 7); \ - va4 = vld1q_f16(a + 32); \ - v20 = vld1q_f16(b + 32); \ - v24 = vfmaq_laneq_f16(v24, v20, va4, 0); \ - v25 = vfmaq_laneq_f16(v25, v20, va4, 1); \ - v26 = vfmaq_laneq_f16(v26, v20, va4, 2); \ - v27 = vfmaq_laneq_f16(v27, v20, va4, 3); \ - v28 = vfmaq_laneq_f16(v28, v20, va4, 4); \ - v29 = vfmaq_laneq_f16(v29, v20, va4, 5); \ - v30 = vfmaq_laneq_f16(v30, v20, va4, 6); \ - v31 = vfmaq_laneq_f16(v31, v20, va4, 7); \ - va5 = vld1q_f16(a + 40); \ - v21 = vld1q_f16(b + 40); \ - v24 = vfmaq_laneq_f16(v24, v21, va5, 0); \ - v25 = vfmaq_laneq_f16(v25, v21, va5, 1); \ - v26 = vfmaq_laneq_f16(v26, v21, va5, 2); \ - v27 = vfmaq_laneq_f16(v27, v21, va5, 3); \ - v28 = vfmaq_laneq_f16(v28, v21, va5, 4); \ - v29 = vfmaq_laneq_f16(v29, v21, va5, 5); \ - v30 = vfmaq_laneq_f16(v30, v21, va5, 6); \ - v31 = vfmaq_laneq_f16(v31, v21, va5, 7); \ - va6 = vld1q_f16(a + 48); \ - v22 = vld1q_f16(b + 48); \ - v24 = vfmaq_laneq_f16(v24, v22, va6, 0); \ - v25 = vfmaq_laneq_f16(v25, v22, va6, 1); \ - v26 = vfmaq_laneq_f16(v26, v22, va6, 2); \ - v27 = vfmaq_laneq_f16(v27, v22, va6, 3); \ - v28 = vfmaq_laneq_f16(v28, v22, va6, 4); \ - v29 = vfmaq_laneq_f16(v29, v22, va6, 5); \ - v30 = vfmaq_laneq_f16(v30, v22, va6, 6); \ - v31 = vfmaq_laneq_f16(v31, v22, va6, 7); \ - va7 = vld1q_f16(a + 56); \ - v23 = vld1q_f16(b + 56); \ - v24 = vfmaq_laneq_f16(v24, v23, va7, 0); \ - v25 = vfmaq_laneq_f16(v25, v23, va7, 1); \ - v26 = vfmaq_laneq_f16(v26, v23, va7, 2); \ - v27 = vfmaq_laneq_f16(v27, v23, va7, 3); \ - v28 = vfmaq_laneq_f16(v28, v23, va7, 4); \ - v29 = vfmaq_laneq_f16(v29, v23, va7, 5); \ - v30 = vfmaq_laneq_f16(v30, v23, va7, 6); \ - v31 = vfmaq_laneq_f16(v31, v23, va7, 7); \ - __builtin_prefetch(b + 64, 0, 3); \ - __builtin_prefetch(a + 64, 0, 3); \ - l += 8; \ - b += 8 * 8; \ - a += 8 * 8; \ +#define KERNEL_8x8_ACC_N4(N) \ + do { \ + for (int i = 0; i < N; i += 4) { \ + va0 = vld1q_f16(a + 8 * i); \ + v16 = vld1q_f16(b + 8 * i); \ + v24 = vfmaq_laneq_f16(v24, v16, va0, 0); \ + v25 = vfmaq_laneq_f16(v25, v16, va0, 1); \ + v26 = vfmaq_laneq_f16(v26, v16, va0, 2); \ + v27 = vfmaq_laneq_f16(v27, v16, va0, 3); \ + v28 = vfmaq_laneq_f16(v28, v16, va0, 4); \ + v29 = vfmaq_laneq_f16(v29, v16, va0, 5); \ + v30 = vfmaq_laneq_f16(v30, v16, va0, 6); \ + v31 = vfmaq_laneq_f16(v31, v16, va0, 7); \ + va1 = vld1q_f16(a + 8 * i + 8); \ + v17 = vld1q_f16(b + 8 * i + 8); \ + v24 = vfmaq_laneq_f16(v24, v17, va1, 0); \ + v25 = vfmaq_laneq_f16(v25, v17, va1, 1); \ + v26 = vfmaq_laneq_f16(v26, v17, va1, 2); \ + v27 = vfmaq_laneq_f16(v27, v17, va1, 3); \ + v28 = vfmaq_laneq_f16(v28, v17, va1, 4); \ + v29 = vfmaq_laneq_f16(v29, v17, va1, 5); \ + v30 = vfmaq_laneq_f16(v30, v17, va1, 6); \ + v31 = vfmaq_laneq_f16(v31, v17, va1, 7); \ + va2 = vld1q_f16(a + 8 * i + 16); \ + v18 = vld1q_f16(b + 8 * i + 16); \ + v24 = vfmaq_laneq_f16(v24, v18, va2, 0); \ + v25 = vfmaq_laneq_f16(v25, v18, va2, 1); \ + v26 = vfmaq_laneq_f16(v26, v18, va2, 2); \ + v27 = vfmaq_laneq_f16(v27, v18, va2, 3); \ + v28 = vfmaq_laneq_f16(v28, v18, va2, 4); \ + v29 = vfmaq_laneq_f16(v29, v18, va2, 5); \ + v30 = vfmaq_laneq_f16(v30, v18, va2, 6); \ + v31 = vfmaq_laneq_f16(v31, v18, va2, 7); \ + va3 = vld1q_f16(a + 8 * i + 24); \ + v19 = vld1q_f16(b + 8 * i + 24); \ + v24 = vfmaq_laneq_f16(v24, v19, va3, 0); \ + v25 = vfmaq_laneq_f16(v25, v19, va3, 1); \ + v26 = vfmaq_laneq_f16(v26, v19, va3, 2); \ + v27 = vfmaq_laneq_f16(v27, v19, va3, 3); \ + v28 = vfmaq_laneq_f16(v28, v19, va3, 4); \ + v29 = vfmaq_laneq_f16(v29, v19, va3, 5); \ + v30 = vfmaq_laneq_f16(v30, v19, va3, 6); \ + v31 = vfmaq_laneq_f16(v31, v19, va3, 7); \ + } \ + __builtin_prefetch(b + 8 * N, 0, 3); \ + __builtin_prefetch(a + 8 * N, 0, 3); \ + l += N; \ + b += 8 * N; \ + a += 8 * N; \ } while (0) -// 3. Partial sum 256 digits -#define KERNEL_8x8_ACC4() \ - do { \ - va0 = vld1q_f16(a); \ - v16 = vld1q_f16(b); \ - v24 = vfmaq_laneq_f16(v24, v16, va0, 0); \ - v25 = vfmaq_laneq_f16(v25, v16, va0, 1); \ - v26 = vfmaq_laneq_f16(v26, v16, va0, 2); \ - v27 = vfmaq_laneq_f16(v27, v16, va0, 3); \ - v28 = vfmaq_laneq_f16(v28, v16, va0, 4); \ - v29 = vfmaq_laneq_f16(v29, v16, va0, 5); \ - v30 = vfmaq_laneq_f16(v30, v16, va0, 6); \ - v31 = vfmaq_laneq_f16(v31, v16, va0, 7); \ - va1 = vld1q_f16(a + 8); \ - v17 = vld1q_f16(b + 8); \ - v24 = vfmaq_laneq_f16(v24, v17, va1, 0); \ - v25 = vfmaq_laneq_f16(v25, v17, va1, 1); \ - v26 = vfmaq_laneq_f16(v26, v17, va1, 2); \ - v27 = vfmaq_laneq_f16(v27, v17, va1, 3); \ - v28 = vfmaq_laneq_f16(v28, v17, va1, 4); \ - v29 = vfmaq_laneq_f16(v29, v17, va1, 5); \ - v30 = vfmaq_laneq_f16(v30, v17, va1, 6); \ - v31 = vfmaq_laneq_f16(v31, v17, va1, 7); \ - va2 = vld1q_f16(a + 16); \ - v18 = vld1q_f16(b + 16); \ - v24 = vfmaq_laneq_f16(v24, v18, va2, 0); \ - v25 = vfmaq_laneq_f16(v25, v18, va2, 1); \ - v26 = vfmaq_laneq_f16(v26, v18, va2, 2); \ - v27 = vfmaq_laneq_f16(v27, v18, va2, 3); \ - v28 = vfmaq_laneq_f16(v28, v18, va2, 4); \ - v29 = vfmaq_laneq_f16(v29, v18, va2, 5); \ - v30 = vfmaq_laneq_f16(v30, v18, va2, 6); \ - v31 = vfmaq_laneq_f16(v31, v18, va2, 7); \ - va3 = vld1q_f16(a + 24); \ - v19 = vld1q_f16(b + 24); \ - v24 = vfmaq_laneq_f16(v24, v19, va3, 0); \ - v25 = vfmaq_laneq_f16(v25, v19, va3, 1); \ - v26 = vfmaq_laneq_f16(v26, v19, va3, 2); \ - v27 = vfmaq_laneq_f16(v27, v19, va3, 3); \ - v28 = vfmaq_laneq_f16(v28, v19, va3, 4); \ - v29 = vfmaq_laneq_f16(v29, v19, va3, 5); \ - v30 = vfmaq_laneq_f16(v30, v19, va3, 6); \ - v31 = vfmaq_laneq_f16(v31, v19, va3, 7); \ - __builtin_prefetch(b + 32, 0, 3); \ - __builtin_prefetch(a + 32, 0, 3); \ - l += 4; \ - b += 8 * 4; \ - a += 8 * 4; \ - } while (0) - -// 4. Partial sum 64 digits #define KERNEL_8x8_ACC1() \ do { \ va0 = vld1q_f16(a); \ @@ -463,17 +203,17 @@ void hgemm_kernel_8x8(unsigned int M, unsigned int N, unsigned int K, l = 0; for (; l < K16;) { INIT_KERNEL_8x8(); - KERNEL_8x8_ACC16(); + KERNEL_8x8_ACC_N4(16); SAVE_KERNEL_8X8_F16_f32(); } for (; l < K8;) { INIT_KERNEL_8x8(); - KERNEL_8x8_ACC8(); + KERNEL_8x8_ACC_N4(8); SAVE_KERNEL_8X8_F16_f32(); } for (; l < K4;) { INIT_KERNEL_8x8(); - KERNEL_8x8_ACC4(); + KERNEL_8x8_ACC_N4(4); SAVE_KERNEL_8X8_F16_f32(); } for (; l < K;) { @@ -481,7 +221,6 @@ void hgemm_kernel_8x8(unsigned int M, unsigned int N, unsigned int K, KERNEL_8x8_ACC1(); SAVE_KERNEL_8X8_F16_f32(); } - c += 8; a -= 8 * K; } -- 2.34.1