| @@ -274,9 +274,18 @@ endif | |||||
| ifeq ($(ARCH), loongarch64) | ifeq ($(ARCH), loongarch64) | ||||
| SMALL_MATRIX_OPT = 1 | SMALL_MATRIX_OPT = 1 | ||||
| endif | endif | ||||
| ifeq ($(ARCH), arm64) | |||||
| GEMM_GEMV_FORWARD = 1 | |||||
| endif | |||||
| ifeq ($(SMALL_MATRIX_OPT), 1) | ifeq ($(SMALL_MATRIX_OPT), 1) | ||||
| CCOMMON_OPT += -DSMALL_MATRIX_OPT | CCOMMON_OPT += -DSMALL_MATRIX_OPT | ||||
| endif | endif | ||||
| ifeq ($(GEMM_GEMV_FORWARD), 1) | |||||
| ifneq ($(ONLY_CBLAS), 1) | |||||
| CCOMMON_OPT += -DGEMM_GEMV_FORWARD | |||||
| endif | |||||
| endif | |||||
| # This operation is expensive, so execution should be once. | # This operation is expensive, so execution should be once. | ||||
| ifndef GOTOBLAS_MAKEFILE | ifndef GOTOBLAS_MAKEFILE | ||||
| @@ -391,6 +391,13 @@ endif () | |||||
| if (X86_64 OR ${CORE} STREQUAL POWER10) | if (X86_64 OR ${CORE} STREQUAL POWER10) | ||||
| set(SMALL_MATRIX_OPT TRUE) | set(SMALL_MATRIX_OPT TRUE) | ||||
| endif () | endif () | ||||
| if (ARM64) | |||||
| set(GEMM_GEMV_FORWARD TRUE) | |||||
| endif () | |||||
| if (GEMM_GEMV_FORWARD AND NOT ONLY_CBLAS) | |||||
| set(CCOMMON_OPT "${CCOMMON_OPT} -DGEMM_GEMV_FORWARD") | |||||
| endif () | |||||
| if (SMALL_MATRIX_OPT) | if (SMALL_MATRIX_OPT) | ||||
| set(CCOMMON_OPT "${CCOMMON_OPT} -DSMALL_MATRIX_OPT") | set(CCOMMON_OPT "${CCOMMON_OPT} -DSMALL_MATRIX_OPT") | ||||
| endif () | endif () | ||||
| @@ -498,7 +498,7 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANS | |||||
| args.m, args.n, args.k, args.lda, args.ldb, args.ldc); | args.m, args.n, args.k, args.lda, args.ldb, args.ldc); | ||||
| #endif | #endif | ||||
| #if !defined(GEMM3M) && !defined(COMPLEX) | |||||
| #if defined(GEMM_GEMV_FORWARD) && !defined(GEMM3M) && !defined(COMPLEX) | |||||
| // Check if we can convert GEMM -> GEMV | // Check if we can convert GEMM -> GEMV | ||||
| if (args.k != 0) { | if (args.k != 0) { | ||||
| if (args.n == 1) { | if (args.n == 1) { | ||||