Small Matrix: add GEMM_SMALL_MATRIX_PERMIT to tune small matrics case
authorWangyang Guo <wangyang.guo@intel.com>
Thu, 27 May 2021 11:03:56 +0000 (11:03 +0000)
committerWangyang Guo <wangyang.guo@intel.com>
Mon, 2 Aug 2021 07:06:54 +0000 (07:06 +0000)
common_c.h
common_d.h
common_level3.h
common_macro.h
common_s.h
common_z.h
interface/gemm.c
kernel/Makefile.L3
kernel/generic/gemm_small_matrix_permit.c [new file with mode: 0644]
kernel/generic/zgemm_small_matrix_permit.c [new file with mode: 0644]

index 9388ece..dc273ee 100644 (file)
 
 #define CGEADD_K                cgeadd_k 
 
+#define CGEMM_SMALL_MATRIX_PERMIT      cgemm_small_matrix_permit
+
 #define CGEMM_SMALL_KERNEL_NN   cgemm_small_kernel_nn
 #define CGEMM_SMALL_KERNEL_NT   cgemm_small_kernel_nt
 #define CGEMM_SMALL_KERNEL_NR   cgemm_small_kernel_nr
index 42c14e8..bb85f12 100644 (file)
 #define DIMATCOPY_K_RT      dimatcopy_k_rt
 #define DGEADD_K                dgeadd_k 
 
+#define DGEMM_SMALL_MATRIX_PERMIT      dgemm_small_matrix_permit
 
 #define DGEMM_SMALL_KERNEL_NN   dgemm_small_kernel_nn
 #define DGEMM_SMALL_KERNEL_NT   dgemm_small_kernel_nt
index a3a487d..187402a 100644 (file)
@@ -516,11 +516,15 @@ int qgemm_kernel(BLASLONG, BLASLONG, BLASLONG, xdouble, xdouble *, xdouble *, xd
 #endif
 
 #ifdef SMALL_MATRIX_OPT
+int sgemm_small_matrix_permit(int transa, int transb, BLASLONG m, BLASLONG n, BLASLONG k, float alpha, float beta);
+
 int sgemm_small_kernel_nn(BLASLONG m, BLASLONG n, BLASLONG k, float * A, BLASLONG lda, float alpha, float * B, BLASLONG ldb, float beta, float * C, BLASLONG ldc);
 int sgemm_small_kernel_nt(BLASLONG m, BLASLONG n, BLASLONG k, float * A, BLASLONG lda, float alpha, float * B, BLASLONG ldb, float beta, float * C, BLASLONG ldc);
 int sgemm_small_kernel_tn(BLASLONG m, BLASLONG n, BLASLONG k, float * A, BLASLONG lda, float alpha, float * B, BLASLONG ldb, float beta, float * C, BLASLONG ldc);
 int sgemm_small_kernel_tt(BLASLONG m, BLASLONG n, BLASLONG k, float * A, BLASLONG lda, float alpha, float * B, BLASLONG ldb, float beta, float * C, BLASLONG ldc);
 
+int dgemm_small_matrix_permit(int transa, int transb, BLASLONG m, BLASLONG n, BLASLONG k, double alpha, double beta);
+
 int dgemm_small_kernel_nn(BLASLONG m, BLASLONG n, BLASLONG k, double * A, BLASLONG lda, double alpha, double * B, BLASLONG ldb, double beta, double * C, BLASLONG ldc);
 int dgemm_small_kernel_nt(BLASLONG m, BLASLONG n, BLASLONG k, double * A, BLASLONG lda, double alpha, double * B, BLASLONG ldb, double beta, double * C, BLASLONG ldc);
 int dgemm_small_kernel_tn(BLASLONG m, BLASLONG n, BLASLONG k, double * A, BLASLONG lda, double alpha, double * B, BLASLONG ldb, double beta, double * C, BLASLONG ldc);
@@ -536,6 +540,8 @@ int dgemm_small_kernel_b0_nt(BLASLONG m, BLASLONG n, BLASLONG k, double * A, BLA
 int dgemm_small_kernel_b0_tn(BLASLONG m, BLASLONG n, BLASLONG k, double * A, BLASLONG lda, double alpha, double * B, BLASLONG ldb, double * C, BLASLONG ldc);
 int dgemm_small_kernel_b0_tt(BLASLONG m, BLASLONG n, BLASLONG k, double * A, BLASLONG lda, double alpha, double * B, BLASLONG ldb, double * C, BLASLONG ldc);
 
+int cgemm_small_matrix_permit(int transa, int transb, BLASLONG m, BLASLONG n, BLASLONG k, float alpha0, float alpha1, float beta0, float beta1);
+
 int cgemm_small_kernel_nn(BLASLONG m, BLASLONG n, BLASLONG k, float * A, BLASLONG lda, float alpha0, float alpha1, float * B, BLASLONG ldb, float beta0, float beta1, float * C, BLASLONG ldc);
 int cgemm_small_kernel_nt(BLASLONG m, BLASLONG n, BLASLONG k, float * A, BLASLONG lda, float alpha0, float alpha1, float * B, BLASLONG ldb, float beta0, float beta1, float * C, BLASLONG ldc);
 int cgemm_small_kernel_nr(BLASLONG m, BLASLONG n, BLASLONG k, float * A, BLASLONG lda, float alpha0, float alpha1, float * B, BLASLONG ldb, float beta0, float beta1, float * C, BLASLONG ldc);
@@ -556,6 +562,8 @@ int cgemm_small_kernel_ct(BLASLONG m, BLASLONG n, BLASLONG k, float * A, BLASLON
 int cgemm_small_kernel_cr(BLASLONG m, BLASLONG n, BLASLONG k, float * A, BLASLONG lda, float alpha0, float alpha1, float * B, BLASLONG ldb, float beta0, float beta1, float * C, BLASLONG ldc);
 int cgemm_small_kernel_cc(BLASLONG m, BLASLONG n, BLASLONG k, float * A, BLASLONG lda, float alpha0, float alpha1, float * B, BLASLONG ldb, float beta0, float beta1, float * C, BLASLONG ldc);
 
+int zgemm_small_matrix_permit(int transa, int transb, BLASLONG m, BLASLONG n, BLASLONG k, double alpha0, double alpha1, double beta0, double beta1);
+
 int zgemm_small_kernel_nn(BLASLONG m, BLASLONG n, BLASLONG k, double * A, BLASLONG lda, double alpha0, double alpha1, double * B, BLASLONG ldb, double beta0, double beta1, double * C, BLASLONG ldc);
 int zgemm_small_kernel_nt(BLASLONG m, BLASLONG n, BLASLONG k, double * A, BLASLONG lda, double alpha0, double alpha1, double * B, BLASLONG ldb, double beta0, double beta1, double * C, BLASLONG ldc);
 int zgemm_small_kernel_nr(BLASLONG m, BLASLONG n, BLASLONG k, double * A, BLASLONG lda, double alpha0, double alpha1, double * B, BLASLONG ldb, double beta0, double beta1, double * C, BLASLONG ldc);
index 2cccf9b..aeb9a20 100644 (file)
 
 #define GEADD_K                 DGEADD_K
 
+#define GEMM_SMALL_MATRIX_PERMIT       DGEMM_SMALL_MATRIX_PERMIT
+
 #define GEMM_SMALL_KERNEL_NN    DGEMM_SMALL_KERNEL_NN
 #define GEMM_SMALL_KERNEL_NT    DGEMM_SMALL_KERNEL_NT
 #define GEMM_SMALL_KERNEL_TN    DGEMM_SMALL_KERNEL_TN
 
 #define GEADD_K                SGEADD_K
 
+#define GEMM_SMALL_MATRIX_PERMIT       SGEMM_SMALL_MATRIX_PERMIT
+
 #define GEMM_SMALL_KERNEL_NN    SGEMM_SMALL_KERNEL_NN
 #define GEMM_SMALL_KERNEL_NT    SGEMM_SMALL_KERNEL_NT
 #define GEMM_SMALL_KERNEL_TN    SGEMM_SMALL_KERNEL_TN
 
 #define GEADD_K                SGEADD_K
 
+#define GEMM_SMALL_MATRIX_PERMIT       SGEMM_SMALL_MATRIX_PERMIT
+
 #define GEMM_SMALL_KERNEL_NN    SGEMM_SMALL_KERNEL_NN
 #define GEMM_SMALL_KERNEL_NT    SGEMM_SMALL_KERNEL_NT
 #define GEMM_SMALL_KERNEL_TN    SGEMM_SMALL_KERNEL_TN
 
 #define GEADD_K                 ZGEADD_K
 
+#define GEMM_SMALL_MATRIX_PERMIT       ZGEMM_SMALL_MATRIX_PERMIT
+
 #define GEMM_SMALL_KERNEL_NN    ZGEMM_SMALL_KERNEL_NN
 #define GEMM_SMALL_KERNEL_NT    ZGEMM_SMALL_KERNEL_NT
 #define GEMM_SMALL_KERNEL_NR    ZGEMM_SMALL_KERNEL_NR
 
 #define GEADD_K                 CGEADD_K
 
+#define GEMM_SMALL_MATRIX_PERMIT       CGEMM_SMALL_MATRIX_PERMIT
+
 #define GEMM_SMALL_KERNEL_NN    CGEMM_SMALL_KERNEL_NN
 #define GEMM_SMALL_KERNEL_NT    CGEMM_SMALL_KERNEL_NT
 #define GEMM_SMALL_KERNEL_NR    CGEMM_SMALL_KERNEL_NR
index 685d730..5851014 100644 (file)
 
 #define SGEADD_K                sgeadd_k 
 
+#define SGEMM_SMALL_MATRIX_PERMIT      sgemm_small_matrix_permit
+
 #define SGEMM_SMALL_KERNEL_NN   sgemm_small_kernel_nn
 #define SGEMM_SMALL_KERNEL_NT   sgemm_small_kernel_nt
 #define SGEMM_SMALL_KERNEL_TN   sgemm_small_kernel_tn
index 8594ec7..6088260 100644 (file)
 
 #define ZGEADD_K                zgeadd_k 
 
+#define ZGEMM_SMALL_MATRIX_PERMIT      zgemm_small_matrix_permit
+
 #define ZGEMM_SMALL_KERNEL_NN   zgemm_small_kernel_nn
 #define ZGEMM_SMALL_KERNEL_NT   zgemm_small_kernel_nt
 #define ZGEMM_SMALL_KERNEL_NR   zgemm_small_kernel_nr
index 7251993..ad87806 100644 (file)
@@ -464,25 +464,26 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANS
 #endif
 
 #ifdef SMALL_MATRIX_OPT
-  //need to tune small matrices cases.
-  if(MNK <= 100.0*100.0*100.0){
-         
 #if !defined(COMPLEX)
+  if(GEMM_SMALL_MATRIX_PERMIT(transa, transb, args.m, args.n, args.k, *(FLOAT *)(args.alpha), *(FLOAT *)(args.beta))){
          if(*(FLOAT *)(args.beta) == 0.0){
                  (gemm_small_kernel_b0[(transb << 2) | transa])(args.m, args.n, args.k, args.a, args.lda, *(FLOAT *)(args.alpha), args.b, args.ldb, args.c, args.ldc);
          }else{
                  (gemm_small_kernel[(transb << 2) | transa])(args.m, args.n, args.k, args.a, args.lda, *(FLOAT *)(args.alpha), args.b, args.ldb, *(FLOAT *)(args.beta), args.c, args.ldc);
          }
+         return;
+  }
 #else
+  if(GEMM_SMALL_MATRIX_PERMIT(transa, transb, args.m, args.n, args.k, alpha[0], alpha[1], beta[0], beta[1])){
          if(beta[0] == 0.0 && beta[1] == 0.0){
                  (zgemm_small_kernel_b0[(transb << 2) | transa])(args.m, args.n, args.k, args.a, args.lda, alpha[0], alpha[1], args.b, args.ldb, args.c, args.ldc);
          }else{
                  (zgemm_small_kernel[(transb << 2) | transa])(args.m, args.n, args.k, args.a, args.lda, alpha[0], alpha[1], args.b, args.ldb, beta[0], beta[1], args.c, args.ldc);
          }
-#endif   
          return;
   }
 #endif
+#endif
   
 
   buffer = (XFLOAT *)blas_memory_alloc(0);
index 1c4a001..f977793 100644 (file)
@@ -451,18 +451,21 @@ endif
 ifeq ($(SMALL_MATRIX_OPT), 1)
 
 SBLASOBJS += \
+       sgemm_small_matrix_permit$(TSUFFIX).$(SUFFIX) \
        sgemm_small_kernel_nn$(TSUFFIX).$(SUFFIX) sgemm_small_kernel_nt$(TSUFFIX).$(SUFFIX) \
        sgemm_small_kernel_tn$(TSUFFIX).$(SUFFIX) sgemm_small_kernel_tt$(TSUFFIX).$(SUFFIX) \
        sgemm_small_kernel_b0_nn$(TSUFFIX).$(SUFFIX) sgemm_small_kernel_b0_nt$(TSUFFIX).$(SUFFIX) \
        sgemm_small_kernel_b0_tn$(TSUFFIX).$(SUFFIX) sgemm_small_kernel_b0_tt$(TSUFFIX).$(SUFFIX)
 
 DBLASOBJS += \
+       dgemm_small_matrix_permit$(TSUFFIX).$(SUFFIX) \
        dgemm_small_kernel_nn$(TSUFFIX).$(SUFFIX) dgemm_small_kernel_nt$(TSUFFIX).$(SUFFIX) \
        dgemm_small_kernel_tn$(TSUFFIX).$(SUFFIX) dgemm_small_kernel_tt$(TSUFFIX).$(SUFFIX) \
        dgemm_small_kernel_b0_nn$(TSUFFIX).$(SUFFIX) dgemm_small_kernel_b0_nt$(TSUFFIX).$(SUFFIX) \
        dgemm_small_kernel_b0_tn$(TSUFFIX).$(SUFFIX) dgemm_small_kernel_b0_tt$(TSUFFIX).$(SUFFIX)
 
 CBLASOBJS += \
+       cgemm_small_matrix_permit$(TSUFFIX).$(SUFFIX) \
        cgemm_small_kernel_nn$(TSUFFIX).$(SUFFIX) cgemm_small_kernel_nt$(TSUFFIX).$(SUFFIX) \
        cgemm_small_kernel_nr$(TSUFFIX).$(SUFFIX) cgemm_small_kernel_nc$(TSUFFIX).$(SUFFIX) \
        cgemm_small_kernel_tn$(TSUFFIX).$(SUFFIX) cgemm_small_kernel_tt$(TSUFFIX).$(SUFFIX) \
@@ -481,6 +484,7 @@ CBLASOBJS += \
        cgemm_small_kernel_b0_cr$(TSUFFIX).$(SUFFIX) cgemm_small_kernel_b0_cc$(TSUFFIX).$(SUFFIX)
 
 ZBLASOBJS += \
+       zgemm_small_matrix_permit$(TSUFFIX).$(SUFFIX) \
        zgemm_small_kernel_nn$(TSUFFIX).$(SUFFIX) zgemm_small_kernel_nt$(TSUFFIX).$(SUFFIX) \
        zgemm_small_kernel_nr$(TSUFFIX).$(SUFFIX) zgemm_small_kernel_nc$(TSUFFIX).$(SUFFIX) \
        zgemm_small_kernel_tn$(TSUFFIX).$(SUFFIX) zgemm_small_kernel_tt$(TSUFFIX).$(SUFFIX) \
@@ -4294,6 +4298,10 @@ $(KDIR)zgeadd_k$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZGEADD_K)
 
 ######  BLAS small matrix optimization #####
 
+ifndef DGEMM_SMALL_M_PERMIT
+DGEMM_SMALL_M_PERMIT = ../generic/gemm_small_matrix_permit.c
+endif
+
 ifndef DGEMM_SMALL_K_NN
 DGEMM_SMALL_K_NN = ../generic/gemm_small_matrix_kernel_nn.c
 endif
@@ -4310,6 +4318,9 @@ ifndef DGEMM_SMALL_K_TT
 DGEMM_SMALL_K_TT = ../generic/gemm_small_matrix_kernel_tt.c
 endif
 
+$(KDIR)dgemm_small_matrix_permit$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(DGEMM_SMALL_M_PERMIT)
+       $(CC) $(CFLAGS) -c -DDOUBLE -UCOMPLEX $< -o $@
+
 $(KDIR)dgemm_small_kernel_nn$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(DGEMM_SMALL_K_NN)
        $(CC) $(CFLAGS) -c -DDOUBLE -UCOMPLEX $< -o $@
 
@@ -4350,6 +4361,9 @@ $(KDIR)dgemm_small_kernel_b0_tn$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(DGEMM_SMALL
 $(KDIR)dgemm_small_kernel_b0_tt$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(DGEMM_SMALL_K_B0_TT)
        $(CC) $(CFLAGS) -c -DDOUBLE -UCOMPLEX $< -o $@
 
+ifndef SGEMM_SMALL_M_PERMIT
+SGEMM_SMALL_M_PERMIT = ../generic/gemm_small_matrix_permit.c
+endif
 
 ifndef SGEMM_SMALL_K_NN
 SGEMM_SMALL_K_NN = ../generic/gemm_small_matrix_kernel_nn.c
@@ -4367,6 +4381,9 @@ ifndef SGEMM_SMALL_K_TT
 SGEMM_SMALL_K_TT = ../generic/gemm_small_matrix_kernel_tt.c
 endif
 
+$(KDIR)sgemm_small_matrix_permit$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(SGEMM_SMALL_M_PERMIT)
+       $(CC) $(CFLAGS) -c -UDOUBLE -UCOMPLEX $< -o $@
+
 $(KDIR)sgemm_small_kernel_nn$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(SGEMM_SMALL_K_NN)
        $(CC) $(CFLAGS) -c -UDOUBLE -UCOMPLEX $< -o $@
 
@@ -4407,6 +4424,9 @@ $(KDIR)sgemm_small_kernel_b0_tn$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(SGEMM_SMALL
 $(KDIR)sgemm_small_kernel_b0_tt$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(SGEMM_SMALL_K_B0_TT)
        $(CC) $(CFLAGS) -c -UDOUBLE -UCOMPLEX $< -o $@
 
+ifndef CGEMM_SMALL_M_PERMIT
+CGEMM_SMALL_M_PERMIT = ../generic/zgemm_small_matrix_permit.c
+endif
 
 ifndef CGEMM_SMALL_K_NN
 CGEMM_SMALL_K_NN = ../generic/zgemm_small_matrix_kernel_nn.c
@@ -4424,6 +4444,9 @@ ifndef CGEMM_SMALL_K_TT
 CGEMM_SMALL_K_TT = ../generic/zgemm_small_matrix_kernel_tt.c
 endif
 
+$(KDIR)cgemm_small_matrix_permit$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CGEMM_SMALL_M_PERMIT)
+       $(CC) $(CFLAGS) -c -UDOUBLE -DCOMPLEX $< -o $@
+
 $(KDIR)cgemm_small_kernel_nn$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CGEMM_SMALL_K_NN)
        $(CC) $(CFLAGS) -c -UDOUBLE -DCOMPLEX -DNN $< -o $@
        
@@ -4536,6 +4559,10 @@ $(KDIR)cgemm_small_kernel_b0_ct$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CGEMM_SMALL
 $(KDIR)cgemm_small_kernel_b0_cc$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CGEMM_SMALL_K_B0_TT)
        $(CC) $(CFLAGS) -c -UDOUBLE -DCOMPLEX -DCC $< -o $@
 
+ifndef ZGEMM_SMALL_M_PERMIT
+ZGEMM_SMALL_M_PERMIT = ../generic/zgemm_small_matrix_permit.c
+endif
+
 ifndef ZGEMM_SMALL_K_NN
 ZGEMM_SMALL_K_NN = ../generic/zgemm_small_matrix_kernel_nn.c
 endif
@@ -4552,6 +4579,10 @@ ifndef ZGEMM_SMALL_K_TT
 ZGEMM_SMALL_K_TT = ../generic/zgemm_small_matrix_kernel_tt.c
 endif
 
+$(KDIR)zgemm_small_matrix_permit$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZGEMM_SMALL_M_PERMIT)
+       $(CC) $(CFLAGS) -c -DDOUBLE -DCOMPLEX $< -o $@
+
+
 $(KDIR)zgemm_small_kernel_nn$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZGEMM_SMALL_K_NN)
        $(CC) $(CFLAGS) -c -DDOUBLE -DCOMPLEX -DNN $< -o $@
        
diff --git a/kernel/generic/gemm_small_matrix_permit.c b/kernel/generic/gemm_small_matrix_permit.c
new file mode 100644 (file)
index 0000000..6e1ab1f
--- /dev/null
@@ -0,0 +1,37 @@
+/***************************************************************************
+Copyright (c) 2021, The OpenBLAS Project
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the
+distribution.
+3. Neither the name of the OpenBLAS project nor the names of
+its contributors may be used to endorse or promote products
+derived from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "common.h"
+
+int CNAME(int transa, int transb, BLASLONG M, BLASLONG N, BLASLONG K, FLOAT alpha, FLOAT beta)
+{
+       double MNK = (double) M * (double) N * (double) K;
+       if (MNK <= 100.0*100.0*100.0)
+               return 1;
+       else
+               return 0;
+}
diff --git a/kernel/generic/zgemm_small_matrix_permit.c b/kernel/generic/zgemm_small_matrix_permit.c
new file mode 100644 (file)
index 0000000..2889372
--- /dev/null
@@ -0,0 +1,37 @@
+/***************************************************************************
+Copyright (c) 2021, The OpenBLAS Project
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the
+distribution.
+3. Neither the name of the OpenBLAS project nor the names of
+its contributors may be used to endorse or promote products
+derived from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include "common.h"
+
+int CNAME(int transa, int transb, BLASLONG M, BLASLONG N, BLASLONG K, FLOAT alpha0, FLOAT alpha1, FLOAT beta0, FLOAT beta1)
+{
+       double MNK = (double) M * (double) N * (double) K;
+       if (MNK <= 100.0*100.0*100.0)
+               return 1;
+       else
+               return 0;
+}