Skip to content

Commit 2ed3ca3

Browse files
committed
wasm: add a 4x4 SIMD128 GEMM microkernel for SGEMM/DGEMM
Switch WASM128_GENERIC to unroll 4 with matching ncopy/tcopy and TRMM 4x4 so packing width stays consistent. Use relaxed SIMD madd in the inner loop when compiled with -mrelaxed-simd. Signed-off-by: Julien Jerphanion <git@jjerphan.xyz>
1 parent 0fb0441 commit 2ed3ca3

6 files changed

Lines changed: 454 additions & 10 deletions

File tree

Changelog.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ x86_64:
158158

159159
wasm:
160160
- added optimized kernels for STRSM and DTRSM
161+
- added a 4x4 WASM SIMD128 GEMM microkernel for SGEMM/DGEMM with matching
162+
4-wide packing and TRMM, using relaxed SIMD madd in the inner loop
163+
- gated leftover WASM TRSM call counters behind OPENBLAS_WASM_TRSM_PROFILE
161164

162165
====================================================================
163166
Version 0.3.32

Makefile.wasm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
CCOMMON_OPT += -msimd128
1+
CCOMMON_OPT += -msimd128 -mrelaxed-simd

kernel/wasm/KERNEL

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,20 @@ DGEMVTKERNEL = ../riscv64/gemv_t.c
9595
CGEMVTKERNEL = ../riscv64/zgemv_t.c
9696
ZGEMVTKERNEL = ../riscv64/zgemv_t.c
9797

98+
# KERNEL.$(TARGET_CORE) is included first; keep its TRMM width if set.
99+
# Unroll-4 GEMM packing uses trmm_*copy_4, which is wrong with a 2x2 kernel.
100+
ifndef STRMMKERNEL
98101
STRMMKERNEL = ../generic/trmmkernel_2x2.c
102+
endif
103+
ifndef DTRMMKERNEL
99104
DTRMMKERNEL = ../generic/trmmkernel_2x2.c
105+
endif
106+
ifndef CTRMMKERNEL
100107
CTRMMKERNEL = ../generic/ztrmmkernel_2x2.c
108+
endif
109+
ifndef ZTRMMKERNEL
101110
ZTRMMKERNEL = ../generic/ztrmmkernel_2x2.c
111+
endif
102112

103113
ifndef SGEMMKERNEL
104114
SGEMMKERNEL = ../generic/gemmkernel_2x2.c

kernel/wasm/KERNEL.WASM128_GENERIC

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,20 +95,20 @@ DGEMVTKERNEL = ../riscv64/gemv_t.c
9595
CGEMVTKERNEL = ../riscv64/zgemv_t.c
9696
ZGEMVTKERNEL = ../riscv64/zgemv_t.c
9797

98-
STRMMKERNEL = ../generic/trmmkernel_2x2.c
99-
DTRMMKERNEL = ../generic/trmmkernel_2x2.c
98+
STRMMKERNEL = ../generic/trmmkernel_4x4.c
99+
DTRMMKERNEL = ../generic/trmmkernel_4x4.c
100100
CTRMMKERNEL = ../generic/ztrmmkernel_2x2.c
101101
ZTRMMKERNEL = ../generic/ztrmmkernel_2x2.c
102102

103-
SGEMMKERNEL = gemmkernel_wasm128.c
104-
SGEMMONCOPY = ../generic/gemm_ncopy_2.c
105-
SGEMMOTCOPY = ../generic/gemm_tcopy_2.c
103+
SGEMMKERNEL = gemmkernel_4x4_wasm128.c
104+
SGEMMONCOPY = ../generic/gemm_ncopy_4.c
105+
SGEMMOTCOPY = ../generic/gemm_tcopy_4.c
106106
SGEMMONCOPYOBJ = sgemm_oncopy$(TSUFFIX).$(SUFFIX)
107107
SGEMMOTCOPYOBJ = sgemm_otcopy$(TSUFFIX).$(SUFFIX)
108108

109-
DGEMMKERNEL = gemmkernel_wasm128.c
110-
DGEMMONCOPY = ../generic/gemm_ncopy_2.c
111-
DGEMMOTCOPY = ../generic/gemm_tcopy_2.c
109+
DGEMMKERNEL = gemmkernel_4x4_wasm128.c
110+
DGEMMONCOPY = ../generic/gemm_ncopy_4.c
111+
DGEMMOTCOPY = ../generic/gemm_tcopy_4.c
112112
DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX)
113113
DGEMMOTCOPYOBJ = dgemm_otcopy$(TSUFFIX).$(SUFFIX)
114114

0 commit comments

Comments
 (0)