Merge pull request #420 from wernsaar/develop
Optimizations for HASWELL
This commit is contained in:
		
						commit
						6e223db7fc
					
				| 
						 | 
					@ -18,12 +18,12 @@ ATLAS=/usr/lib64/atlas
 | 
				
			||||||
LIBATLAS = -fopenmp $(ATLAS)/liblapack.a  $(ATLAS)/libptcblas.a  $(ATLAS)/libptf77blas.a  $(ATLAS)/libatlas.a -lgfortran -lm
 | 
					LIBATLAS = -fopenmp $(ATLAS)/liblapack.a  $(ATLAS)/libptcblas.a  $(ATLAS)/libptf77blas.a  $(ATLAS)/libatlas.a -lgfortran -lm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Intel standard
 | 
					# Intel standard
 | 
				
			||||||
MKL=/opt/intel/mkl/lib/intel64
 | 
					# MKL=/opt/intel/mkl/lib/intel64
 | 
				
			||||||
LIBMKL = -L$(MKL) -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm
 | 
					# LIBMKL = -L$(MKL) -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Intel custom
 | 
					# Intel custom
 | 
				
			||||||
#MKL=/home/saar/intel_mkl
 | 
					MKL=/home/saar/intel_mkl
 | 
				
			||||||
#LIBMKL = -L$(MKL) -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm
 | 
					LIBMKL = -L$(MKL) -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,8 @@ goto :: slinpack.goto dlinpack.goto clinpack.goto zlinpack.goto \
 | 
				
			||||||
       strsm.goto dtrsm.goto ctrsm.goto ztrsm.goto \
 | 
					       strsm.goto dtrsm.goto ctrsm.goto ztrsm.goto \
 | 
				
			||||||
       ssyrk.goto dsyrk.goto csyrk.goto zsyrk.goto \
 | 
					       ssyrk.goto dsyrk.goto csyrk.goto zsyrk.goto \
 | 
				
			||||||
       ssyr2k.goto dsyr2k.goto csyr2k.goto zsyr2k.goto \
 | 
					       ssyr2k.goto dsyr2k.goto csyr2k.goto zsyr2k.goto \
 | 
				
			||||||
 | 
					       sger.goto dger.goto \
 | 
				
			||||||
 | 
					       ssymv.goto dsymv.goto \
 | 
				
			||||||
       chemm.goto zhemm.goto \
 | 
					       chemm.goto zhemm.goto \
 | 
				
			||||||
       cherk.goto zherk.goto \
 | 
					       cherk.goto zherk.goto \
 | 
				
			||||||
       cher2k.goto zher2k.goto \
 | 
					       cher2k.goto zher2k.goto \
 | 
				
			||||||
| 
						 | 
					@ -47,6 +49,8 @@ acml :: slinpack.acml dlinpack.acml clinpack.acml zlinpack.acml \
 | 
				
			||||||
       strsm.acml dtrsm.acml ctrsm.acml ztrsm.acml \
 | 
					       strsm.acml dtrsm.acml ctrsm.acml ztrsm.acml \
 | 
				
			||||||
       ssyrk.acml dsyrk.acml csyrk.acml zsyrk.acml \
 | 
					       ssyrk.acml dsyrk.acml csyrk.acml zsyrk.acml \
 | 
				
			||||||
       ssyr2k.acml dsyr2k.acml csyr2k.acml zsyr2k.acml \
 | 
					       ssyr2k.acml dsyr2k.acml csyr2k.acml zsyr2k.acml \
 | 
				
			||||||
 | 
					       sger.acml dger.acml \
 | 
				
			||||||
 | 
					       ssymv.acml dsymv.acml \
 | 
				
			||||||
       chemm.acml zhemm.acml \
 | 
					       chemm.acml zhemm.acml \
 | 
				
			||||||
       cherk.acml zherk.acml \
 | 
					       cherk.acml zherk.acml \
 | 
				
			||||||
       cher2k.acml zher2k.acml \
 | 
					       cher2k.acml zher2k.acml \
 | 
				
			||||||
| 
						 | 
					@ -60,6 +64,9 @@ atlas :: slinpack.atlas dlinpack.atlas clinpack.atlas zlinpack.atlas \
 | 
				
			||||||
       strsm.atlas dtrsm.atlas ctrsm.atlas ztrsm.atlas \
 | 
					       strsm.atlas dtrsm.atlas ctrsm.atlas ztrsm.atlas \
 | 
				
			||||||
       ssyrk.atlas dsyrk.atlas csyrk.atlas zsyrk.atlas \
 | 
					       ssyrk.atlas dsyrk.atlas csyrk.atlas zsyrk.atlas \
 | 
				
			||||||
       ssyr2k.atlas dsyr2k.atlas csyr2k.atlas zsyr2k.atlas \
 | 
					       ssyr2k.atlas dsyr2k.atlas csyr2k.atlas zsyr2k.atlas \
 | 
				
			||||||
 | 
					       sger.atlas dger.atlas \
 | 
				
			||||||
 | 
					       ssymv.atlas dsymv.atlas \
 | 
				
			||||||
 | 
					       chemm.acml zhemm.acml \
 | 
				
			||||||
       chemm.atlas zhemm.atlas \
 | 
					       chemm.atlas zhemm.atlas \
 | 
				
			||||||
       cherk.atlas zherk.atlas \
 | 
					       cherk.atlas zherk.atlas \
 | 
				
			||||||
       cher2k.atlas zher2k.atlas \
 | 
					       cher2k.atlas zher2k.atlas \
 | 
				
			||||||
| 
						 | 
					@ -73,6 +80,8 @@ mkl :: slinpack.mkl dlinpack.mkl clinpack.mkl zlinpack.mkl \
 | 
				
			||||||
       strsm.mkl dtrsm.mkl ctrsm.mkl ztrsm.mkl \
 | 
					       strsm.mkl dtrsm.mkl ctrsm.mkl ztrsm.mkl \
 | 
				
			||||||
       ssyrk.mkl dsyrk.mkl csyrk.mkl zsyrk.mkl \
 | 
					       ssyrk.mkl dsyrk.mkl csyrk.mkl zsyrk.mkl \
 | 
				
			||||||
       ssyr2k.mkl dsyr2k.mkl csyr2k.mkl zsyr2k.mkl \
 | 
					       ssyr2k.mkl dsyr2k.mkl csyr2k.mkl zsyr2k.mkl \
 | 
				
			||||||
 | 
					       sger.mkl dger.mkl \
 | 
				
			||||||
 | 
					       ssymv.mkl dsymv.mkl \
 | 
				
			||||||
       chemm.mkl zhemm.mkl \
 | 
					       chemm.mkl zhemm.mkl \
 | 
				
			||||||
       cherk.mkl zherk.mkl \
 | 
					       cherk.mkl zherk.mkl \
 | 
				
			||||||
       cher2k.mkl zher2k.mkl \
 | 
					       cher2k.mkl zher2k.mkl \
 | 
				
			||||||
| 
						 | 
					@ -659,6 +668,58 @@ zgemv.atlas : zgemv.$(SUFFIX)
 | 
				
			||||||
zgemv.mkl : zgemv.$(SUFFIX)
 | 
					zgemv.mkl : zgemv.$(SUFFIX)
 | 
				
			||||||
	-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##################################### Sger ####################################################
 | 
				
			||||||
 | 
					sger.goto : sger.$(SUFFIX) ../$(LIBNAME)
 | 
				
			||||||
 | 
						$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) -lm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sger.acml : sger.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sger.atlas : sger.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBATLAS) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sger.mkl : sger.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##################################### Dger ####################################################
 | 
				
			||||||
 | 
					dger.goto : dger.$(SUFFIX) ../$(LIBNAME)
 | 
				
			||||||
 | 
						$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) -lm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dger.acml : dger.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dger.atlas : dger.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBATLAS) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dger.mkl : dger.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##################################### Ssymv ####################################################
 | 
				
			||||||
 | 
					ssymv.goto : ssymv.$(SUFFIX) ../$(LIBNAME)
 | 
				
			||||||
 | 
						$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) -lm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ssymv.acml : ssymv.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ssymv.atlas : ssymv.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBATLAS) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ssymv.mkl : ssymv.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##################################### Dsymv ####################################################
 | 
				
			||||||
 | 
					dsymv.goto : dsymv.$(SUFFIX) ../$(LIBNAME)
 | 
				
			||||||
 | 
						$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) -lm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dsymv.acml : dsymv.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dsymv.atlas : dsymv.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBATLAS) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dsymv.mkl : dsymv.$(SUFFIX)
 | 
				
			||||||
 | 
						-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###################################################################################################
 | 
					###################################################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -788,6 +849,18 @@ cgemv.$(SUFFIX) : gemv.c
 | 
				
			||||||
zgemv.$(SUFFIX) : gemv.c
 | 
					zgemv.$(SUFFIX) : gemv.c
 | 
				
			||||||
	$(CC) $(CFLAGS) -c -DCOMPLEX -DDOUBLE -o $(@F) $^
 | 
						$(CC) $(CFLAGS) -c -DCOMPLEX -DDOUBLE -o $(@F) $^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sger.$(SUFFIX) : ger.c
 | 
				
			||||||
 | 
						$(CC) $(CFLAGS) -c -UCOMPLEX -UDOUBLE -o $(@F) $^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dger.$(SUFFIX) : ger.c
 | 
				
			||||||
 | 
						$(CC) $(CFLAGS) -c -UCOMPLEX -DDOUBLE -o $(@F) $^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ssymv.$(SUFFIX) : symv.c
 | 
				
			||||||
 | 
						$(CC) $(CFLAGS) -c -UCOMPLEX -UDOUBLE -o $(@F) $^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dsymv.$(SUFFIX) : symv.c
 | 
				
			||||||
 | 
						$(CC) $(CFLAGS) -c -UCOMPLEX -DDOUBLE -o $(@F) $^
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean ::
 | 
					clean ::
 | 
				
			||||||
	@rm -f *.goto *.mkl *.acml *.atlas
 | 
						@rm -f *.goto *.mkl *.acml *.atlas
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,218 @@
 | 
				
			||||||
 | 
					/***************************************************************************
 | 
				
			||||||
 | 
					Copyright (c) 2014, 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 <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#ifdef __CYGWIN32__
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#include "common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef GER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DOUBLE
 | 
				
			||||||
 | 
					#define GER   BLASFUNC(dger)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define GER   BLASFUNC(sger)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(__WIN32__) || defined(__WIN64__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef DELTA_EPOCH_IN_MICROSECS
 | 
				
			||||||
 | 
					#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int gettimeofday(struct timeval *tv, void *tz){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FILETIME ft;
 | 
				
			||||||
 | 
					  unsigned __int64 tmpres = 0;
 | 
				
			||||||
 | 
					  static int tzflag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (NULL != tv)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      GetSystemTimeAsFileTime(&ft);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      tmpres |= ft.dwHighDateTime;
 | 
				
			||||||
 | 
					      tmpres <<= 32;
 | 
				
			||||||
 | 
					      tmpres |= ft.dwLowDateTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*converting file time to unix epoch*/
 | 
				
			||||||
 | 
					      tmpres /= 10;  /*convert into microseconds*/
 | 
				
			||||||
 | 
					      tmpres -= DELTA_EPOCH_IN_MICROSECS;
 | 
				
			||||||
 | 
					      tv->tv_sec = (long)(tmpres / 1000000UL);
 | 
				
			||||||
 | 
					      tv->tv_usec = (long)(tmpres % 1000000UL);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(__WIN32__) && !defined(__WIN64__) && !defined(__CYGWIN32__) && 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void *huge_malloc(BLASLONG size){
 | 
				
			||||||
 | 
					  int shmid;
 | 
				
			||||||
 | 
					  void *address;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SHM_HUGETLB
 | 
				
			||||||
 | 
					#define SHM_HUGETLB 04000
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((shmid =shmget(IPC_PRIVATE,
 | 
				
			||||||
 | 
							     (size + HUGE_PAGESIZE) & ~(HUGE_PAGESIZE - 1),
 | 
				
			||||||
 | 
							     SHM_HUGETLB | IPC_CREAT |0600)) < 0) {
 | 
				
			||||||
 | 
					    printf( "Memory allocation failed(shmget).\n");
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  address = shmat(shmid, NULL, SHM_RND);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((BLASLONG)address == -1){
 | 
				
			||||||
 | 
					    printf( "Memory allocation failed(shmat).\n");
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  shmctl(shmid, IPC_RMID, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return address;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define malloc huge_malloc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int MAIN__(int argc, char *argv[]){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FLOAT *a, *x, *y;
 | 
				
			||||||
 | 
					  FLOAT alpha[] = {1.0, 1.0};
 | 
				
			||||||
 | 
					  blasint m, i, j;
 | 
				
			||||||
 | 
					  blasint inc_x=1,inc_y=1;
 | 
				
			||||||
 | 
					  blasint n=0;
 | 
				
			||||||
 | 
					  int has_param_n = 0;
 | 
				
			||||||
 | 
					  int loops = 1;
 | 
				
			||||||
 | 
					  int l;
 | 
				
			||||||
 | 
					  char *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int from =   1;
 | 
				
			||||||
 | 
					  int to   = 200;
 | 
				
			||||||
 | 
					  int step =   1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  struct timeval start, stop;
 | 
				
			||||||
 | 
					  double time1,timeg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  argc--;argv++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (argc > 0) { from     = atol(*argv);		argc--; argv++;}
 | 
				
			||||||
 | 
					  if (argc > 0) { to       = MAX(atol(*argv), from);	argc--; argv++;}
 | 
				
			||||||
 | 
					  if (argc > 0) { step     = atol(*argv);		argc--; argv++;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((p = getenv("OPENBLAS_LOOPS")))  loops = atoi(p);
 | 
				
			||||||
 | 
					  if ((p = getenv("OPENBLAS_INCX")))   inc_x = atoi(p);
 | 
				
			||||||
 | 
					  if ((p = getenv("OPENBLAS_INCY")))   inc_y = atoi(p);
 | 
				
			||||||
 | 
					  if ((p = getenv("OPENBLAS_PARAM_N"))) {
 | 
				
			||||||
 | 
						  n = atoi(p);
 | 
				
			||||||
 | 
						  if ((n>0) && (n<=to)) has_param_n = 1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ( has_param_n == 1 )
 | 
				
			||||||
 | 
					    fprintf(stderr, "From : %3d  To : %3d Step = %3d N = %d Inc_x = %d Inc_y = %d Loops = %d\n", from, to, step,n,inc_x,inc_y,loops);
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    fprintf(stderr, "From : %3d  To : %3d Step = %3d Inc_x = %d Inc_y = %d Loops = %d\n", from, to, step,inc_x,inc_y,loops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (( a = (FLOAT *)malloc(sizeof(FLOAT) * to * to * COMPSIZE)) == NULL){
 | 
				
			||||||
 | 
					    fprintf(stderr,"Out of Memory!!\n");exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (( x = (FLOAT *)malloc(sizeof(FLOAT) * to * abs(inc_x) * COMPSIZE)) == NULL){
 | 
				
			||||||
 | 
					    fprintf(stderr,"Out of Memory!!\n");exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (( y = (FLOAT *)malloc(sizeof(FLOAT) * to * abs(inc_y) * COMPSIZE)) == NULL){
 | 
				
			||||||
 | 
					    fprintf(stderr,"Out of Memory!!\n");exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef linux
 | 
				
			||||||
 | 
					  srandom(getpid());
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fprintf(stderr, "   SIZE       Flops\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for(m = from; m <= to; m += step)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   timeg=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if ( has_param_n == 0 ) n = m;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   fprintf(stderr, " %6dx%d : ", (int)m,(int)n);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   for(j = 0; j < m; j++){
 | 
				
			||||||
 | 
					      		for(i = 0; i < n * COMPSIZE; i++){
 | 
				
			||||||
 | 
								a[i + j * m * COMPSIZE] = ((FLOAT) rand() / (FLOAT) RAND_MAX) - 0.5;
 | 
				
			||||||
 | 
					      		}
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   for(i = 0; i < m * COMPSIZE * abs(inc_x); i++){
 | 
				
			||||||
 | 
								x[i] = ((FLOAT) rand() / (FLOAT) RAND_MAX) - 0.5;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   for(i = 0; i < n * COMPSIZE * abs(inc_y); i++){
 | 
				
			||||||
 | 
								y[i] = ((FLOAT) rand() / (FLOAT) RAND_MAX) - 0.5;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (l=0; l<loops; l++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    	gettimeofday( &start, (struct timezone *)0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    	GER (&m, &n, alpha, x, &inc_x, y, &inc_y, a , &m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    	gettimeofday( &stop, (struct timezone *)0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    	time1 = (double)(stop.tv_sec - start.tv_sec) + (double)((stop.tv_usec - start.tv_usec)) * 1.e-6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						timeg += time1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    timeg /= loops;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fprintf(stderr,
 | 
				
			||||||
 | 
						    " %10.2f MFlops\n",
 | 
				
			||||||
 | 
						    COMPSIZE * COMPSIZE * 2. * (double)m * (double)n / timeg * 1.e-6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void main(int argc, char *argv[]) __attribute__((weak, alias("MAIN__")));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					# **********************************************************************************
 | 
				
			||||||
 | 
					# Copyright (c) 2014, 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.
 | 
				
			||||||
 | 
					# **********************************************************************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ************************************************************************
 | 
				
			||||||
 | 
					# sample filter for data output from benchmark programs
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# usage example: 
 | 
				
			||||||
 | 
					#   ./dgemm.goto 2>&1|./plotfilter.sh >OpenBLAS
 | 
				
			||||||
 | 
					# ************************************************************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					awk '/MFlops/ { print $1,int($3) }'|tail --lines=+2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					# **********************************************************************************
 | 
				
			||||||
 | 
					# Copyright (c) 2014, 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.
 | 
				
			||||||
 | 
					# **********************************************************************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set term x11 font sans;
 | 
				
			||||||
 | 
					set ylabel "MFlops";
 | 
				
			||||||
 | 
					set xlabel "Size";
 | 
				
			||||||
 | 
					set grid xtics;
 | 
				
			||||||
 | 
					set grid ytics;
 | 
				
			||||||
 | 
					set key left;
 | 
				
			||||||
 | 
					set timestamp "generated on %Y-%m-%d by `whoami`"
 | 
				
			||||||
 | 
					set title "Dtrsm\nUPLO=U TRANS=N SIDE=L\nBulldozer 1 Thread"
 | 
				
			||||||
 | 
					plot 'OpenBLAS' smooth bezier, 'ACML' smooth bezier, 'MKL' smooth bezier;
 | 
				
			||||||
 | 
					set output "print.png";
 | 
				
			||||||
 | 
					show title;
 | 
				
			||||||
 | 
					show plot;
 | 
				
			||||||
 | 
					show output;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,218 @@
 | 
				
			||||||
 | 
					/***************************************************************************
 | 
				
			||||||
 | 
					Copyright (c) 2014, 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 <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#ifdef __CYGWIN32__
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#include "common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef SYMV
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef COMPLEX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DOUBLE
 | 
				
			||||||
 | 
					#define SYMV   BLASFUNC(dsymv)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define SYMV   BLASFUNC(ssymv)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DOUBLE
 | 
				
			||||||
 | 
					#define SYMV   BLASFUNC(zsymv)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define SYMV   BLASFUNC(csymv)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(__WIN32__) || defined(__WIN64__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef DELTA_EPOCH_IN_MICROSECS
 | 
				
			||||||
 | 
					#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int gettimeofday(struct timeval *tv, void *tz){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FILETIME ft;
 | 
				
			||||||
 | 
					  unsigned __int64 tmpres = 0;
 | 
				
			||||||
 | 
					  static int tzflag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (NULL != tv)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      GetSystemTimeAsFileTime(&ft);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      tmpres |= ft.dwHighDateTime;
 | 
				
			||||||
 | 
					      tmpres <<= 32;
 | 
				
			||||||
 | 
					      tmpres |= ft.dwLowDateTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /*converting file time to unix epoch*/
 | 
				
			||||||
 | 
					      tmpres /= 10;  /*convert into microseconds*/
 | 
				
			||||||
 | 
					      tmpres -= DELTA_EPOCH_IN_MICROSECS;
 | 
				
			||||||
 | 
					      tv->tv_sec = (long)(tmpres / 1000000UL);
 | 
				
			||||||
 | 
					      tv->tv_usec = (long)(tmpres % 1000000UL);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(__WIN32__) && !defined(__WIN64__) && !defined(__CYGWIN32__) && 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void *huge_malloc(BLASLONG size){
 | 
				
			||||||
 | 
					  int shmid;
 | 
				
			||||||
 | 
					  void *address;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SHM_HUGETLB
 | 
				
			||||||
 | 
					#define SHM_HUGETLB 04000
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((shmid =shmget(IPC_PRIVATE,
 | 
				
			||||||
 | 
							     (size + HUGE_PAGESIZE) & ~(HUGE_PAGESIZE - 1),
 | 
				
			||||||
 | 
							     SHM_HUGETLB | IPC_CREAT |0600)) < 0) {
 | 
				
			||||||
 | 
					    printf( "Memory allocation failed(shmget).\n");
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  address = shmat(shmid, NULL, SHM_RND);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((BLASLONG)address == -1){
 | 
				
			||||||
 | 
					    printf( "Memory allocation failed(shmat).\n");
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  shmctl(shmid, IPC_RMID, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return address;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define malloc huge_malloc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int MAIN__(int argc, char *argv[]){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FLOAT *a, *x, *y;
 | 
				
			||||||
 | 
					  FLOAT alpha[] = {1.0, 1.0};
 | 
				
			||||||
 | 
					  FLOAT beta [] = {1.0, 1.0};
 | 
				
			||||||
 | 
					  char uplo='L';
 | 
				
			||||||
 | 
					  blasint m, i, j;
 | 
				
			||||||
 | 
					  blasint inc_x=1,inc_y=1;
 | 
				
			||||||
 | 
					  int loops = 1;
 | 
				
			||||||
 | 
					  int l;
 | 
				
			||||||
 | 
					  char *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int from =   1;
 | 
				
			||||||
 | 
					  int to   = 200;
 | 
				
			||||||
 | 
					  int step =   1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  struct timeval start, stop;
 | 
				
			||||||
 | 
					  double time1,timeg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  argc--;argv++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (argc > 0) { from     = atol(*argv);		argc--; argv++;}
 | 
				
			||||||
 | 
					  if (argc > 0) { to       = MAX(atol(*argv), from);	argc--; argv++;}
 | 
				
			||||||
 | 
					  if (argc > 0) { step     = atol(*argv);		argc--; argv++;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((p = getenv("OPENBLAS_LOOPS")))  loops = atoi(p);
 | 
				
			||||||
 | 
					  if ((p = getenv("OPENBLAS_INCX")))   inc_x = atoi(p);
 | 
				
			||||||
 | 
					  if ((p = getenv("OPENBLAS_INCY")))   inc_y = atoi(p);
 | 
				
			||||||
 | 
					  if ((p = getenv("OPENBLAS_UPLO")))  uplo=*p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fprintf(stderr, "From : %3d  To : %3d Step = %3d Uplo = '%c' Inc_x = %d Inc_y = %d Loops = %d\n", from, to, step,uplo,inc_x,inc_y,loops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (( a = (FLOAT *)malloc(sizeof(FLOAT) * to * to * COMPSIZE)) == NULL){
 | 
				
			||||||
 | 
					    fprintf(stderr,"Out of Memory!!\n");exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (( x = (FLOAT *)malloc(sizeof(FLOAT) * to * abs(inc_x) * COMPSIZE)) == NULL){
 | 
				
			||||||
 | 
					    fprintf(stderr,"Out of Memory!!\n");exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (( y = (FLOAT *)malloc(sizeof(FLOAT) * to * abs(inc_y) * COMPSIZE)) == NULL){
 | 
				
			||||||
 | 
					    fprintf(stderr,"Out of Memory!!\n");exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef linux
 | 
				
			||||||
 | 
					  srandom(getpid());
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fprintf(stderr, "   SIZE       Flops\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for(m = from; m <= to; m += step)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   timeg=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   fprintf(stderr, " %6dx%d : ", (int)m,(int)m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   for(j = 0; j < m; j++){
 | 
				
			||||||
 | 
					      		for(i = 0; i < m * COMPSIZE; i++){
 | 
				
			||||||
 | 
								a[i + j * m * COMPSIZE] = ((FLOAT) rand() / (FLOAT) RAND_MAX) - 0.5;
 | 
				
			||||||
 | 
					      		}
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (l=0; l<loops; l++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   	for(i = 0; i < m * COMPSIZE * abs(inc_x); i++){
 | 
				
			||||||
 | 
								x[i] = ((FLOAT) rand() / (FLOAT) RAND_MAX) - 0.5;
 | 
				
			||||||
 | 
					   	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   	for(i = 0; i < m * COMPSIZE * abs(inc_y); i++){
 | 
				
			||||||
 | 
								y[i] = ((FLOAT) rand() / (FLOAT) RAND_MAX) - 0.5;
 | 
				
			||||||
 | 
					   	}
 | 
				
			||||||
 | 
					    	gettimeofday( &start, (struct timezone *)0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    	SYMV (&uplo, &m, alpha, a, &m, x, &inc_x, beta, y, &inc_y );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    	gettimeofday( &stop, (struct timezone *)0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    	time1 = (double)(stop.tv_sec - start.tv_sec) + (double)((stop.tv_usec - start.tv_usec)) * 1.e-6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						timeg += time1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    timeg /= loops;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fprintf(stderr,
 | 
				
			||||||
 | 
						    " %10.2f MFlops\n",
 | 
				
			||||||
 | 
						    COMPSIZE * COMPSIZE * 2. * (double)m * (double)m / timeg * 1.e-6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void main(int argc, char *argv[]) __attribute__((weak, alias("MAIN__")));
 | 
				
			||||||
| 
						 | 
					@ -919,14 +919,22 @@ extern gotoblas_t *gotoblas;
 | 
				
			||||||
#define	SGEMM_R		SGEMM_DEFAULT_R
 | 
					#define	SGEMM_R		SGEMM_DEFAULT_R
 | 
				
			||||||
#define SGEMM_UNROLL_M	SGEMM_DEFAULT_UNROLL_M
 | 
					#define SGEMM_UNROLL_M	SGEMM_DEFAULT_UNROLL_M
 | 
				
			||||||
#define SGEMM_UNROLL_N	SGEMM_DEFAULT_UNROLL_N
 | 
					#define SGEMM_UNROLL_N	SGEMM_DEFAULT_UNROLL_N
 | 
				
			||||||
 | 
					#ifdef  SGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					#define SGEMM_UNROLL_MN	SGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define SGEMM_UNROLL_MN	MAX((SGEMM_UNROLL_M), (SGEMM_UNROLL_N))
 | 
					#define SGEMM_UNROLL_MN	MAX((SGEMM_UNROLL_M), (SGEMM_UNROLL_N))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	DGEMM_P		DGEMM_DEFAULT_P
 | 
					#define	DGEMM_P		DGEMM_DEFAULT_P
 | 
				
			||||||
#define	DGEMM_Q		DGEMM_DEFAULT_Q
 | 
					#define	DGEMM_Q		DGEMM_DEFAULT_Q
 | 
				
			||||||
#define	DGEMM_R		DGEMM_DEFAULT_R
 | 
					#define	DGEMM_R		DGEMM_DEFAULT_R
 | 
				
			||||||
#define DGEMM_UNROLL_M	DGEMM_DEFAULT_UNROLL_M
 | 
					#define DGEMM_UNROLL_M	DGEMM_DEFAULT_UNROLL_M
 | 
				
			||||||
#define DGEMM_UNROLL_N	DGEMM_DEFAULT_UNROLL_N
 | 
					#define DGEMM_UNROLL_N	DGEMM_DEFAULT_UNROLL_N
 | 
				
			||||||
 | 
					#ifdef  DGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					#define DGEMM_UNROLL_MN	DGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define DGEMM_UNROLL_MN	MAX((DGEMM_UNROLL_M), (DGEMM_UNROLL_N))
 | 
					#define DGEMM_UNROLL_MN	MAX((DGEMM_UNROLL_M), (DGEMM_UNROLL_N))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	QGEMM_P		QGEMM_DEFAULT_P
 | 
					#define	QGEMM_P		QGEMM_DEFAULT_P
 | 
				
			||||||
#define	QGEMM_Q		QGEMM_DEFAULT_Q
 | 
					#define	QGEMM_Q		QGEMM_DEFAULT_Q
 | 
				
			||||||
| 
						 | 
					@ -940,14 +948,22 @@ extern gotoblas_t *gotoblas;
 | 
				
			||||||
#define	CGEMM_R		CGEMM_DEFAULT_R
 | 
					#define	CGEMM_R		CGEMM_DEFAULT_R
 | 
				
			||||||
#define CGEMM_UNROLL_M	CGEMM_DEFAULT_UNROLL_M
 | 
					#define CGEMM_UNROLL_M	CGEMM_DEFAULT_UNROLL_M
 | 
				
			||||||
#define CGEMM_UNROLL_N	CGEMM_DEFAULT_UNROLL_N
 | 
					#define CGEMM_UNROLL_N	CGEMM_DEFAULT_UNROLL_N
 | 
				
			||||||
 | 
					#ifdef  CGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					#define CGEMM_UNROLL_MN	CGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define CGEMM_UNROLL_MN	MAX((CGEMM_UNROLL_M), (CGEMM_UNROLL_N))
 | 
					#define CGEMM_UNROLL_MN	MAX((CGEMM_UNROLL_M), (CGEMM_UNROLL_N))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	ZGEMM_P		ZGEMM_DEFAULT_P
 | 
					#define	ZGEMM_P		ZGEMM_DEFAULT_P
 | 
				
			||||||
#define	ZGEMM_Q		ZGEMM_DEFAULT_Q
 | 
					#define	ZGEMM_Q		ZGEMM_DEFAULT_Q
 | 
				
			||||||
#define	ZGEMM_R		ZGEMM_DEFAULT_R
 | 
					#define	ZGEMM_R		ZGEMM_DEFAULT_R
 | 
				
			||||||
#define ZGEMM_UNROLL_M	ZGEMM_DEFAULT_UNROLL_M
 | 
					#define ZGEMM_UNROLL_M	ZGEMM_DEFAULT_UNROLL_M
 | 
				
			||||||
#define ZGEMM_UNROLL_N	ZGEMM_DEFAULT_UNROLL_N
 | 
					#define ZGEMM_UNROLL_N	ZGEMM_DEFAULT_UNROLL_N
 | 
				
			||||||
 | 
					#ifdef  ZGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					#define ZGEMM_UNROLL_MN	ZGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define ZGEMM_UNROLL_MN	MAX((ZGEMM_UNROLL_M), (ZGEMM_UNROLL_N))
 | 
					#define ZGEMM_UNROLL_MN	MAX((ZGEMM_UNROLL_M), (ZGEMM_UNROLL_N))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	XGEMM_P		XGEMM_DEFAULT_P
 | 
					#define	XGEMM_P		XGEMM_DEFAULT_P
 | 
				
			||||||
#define	XGEMM_Q		XGEMM_DEFAULT_Q
 | 
					#define	XGEMM_Q		XGEMM_DEFAULT_Q
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -333,16 +333,10 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n,
 | 
				
			||||||
      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j + js - jjs;
 | 
						min_jj = min_j + js - jjs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if ( defined(BULLDOZER) || defined(PILEDRIVER) || defined(HASWELL) ) && defined(ARCH_X86_64) && !defined(XDOUBLE) && !defined(COMPLEX)
 | 
					        if (min_jj >= 3*GEMM_UNROLL_N) min_jj = 3*GEMM_UNROLL_N;
 | 
				
			||||||
                if (min_jj >= 6*GEMM_UNROLL_N) min_jj = 6*GEMM_UNROLL_N;
 | 
					        else
 | 
				
			||||||
                else
 | 
					          if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
                        if (min_jj >= 3*GEMM_UNROLL_N) min_jj = 3*GEMM_UNROLL_N;
 | 
					 | 
				
			||||||
                        else
 | 
					 | 
				
			||||||
                                if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	START_RPCC();
 | 
						START_RPCC();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -538,10 +538,10 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
  mask  = MAX(QGEMM_UNROLL_M, QGEMM_UNROLL_N) - 1;
 | 
					  mask  = MAX(QGEMM_UNROLL_M, QGEMM_UNROLL_N) - 1;
 | 
				
			||||||
#elif defined(DOUBLE)
 | 
					#elif defined(DOUBLE)
 | 
				
			||||||
  mode  =  BLAS_DOUBLE  | BLAS_REAL;
 | 
					  mode  =  BLAS_DOUBLE  | BLAS_REAL;
 | 
				
			||||||
  mask  = MAX(DGEMM_UNROLL_M, DGEMM_UNROLL_N) - 1;
 | 
					  mask  = DGEMM_UNROLL_MN - 1;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  mode  =  BLAS_SINGLE  | BLAS_REAL;
 | 
					  mode  =  BLAS_SINGLE  | BLAS_REAL;
 | 
				
			||||||
  mask  = MAX(SGEMM_UNROLL_M, SGEMM_UNROLL_N) - 1;
 | 
					  mask  = SGEMM_UNROLL_MN - 1;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#ifdef XDOUBLE
 | 
					#ifdef XDOUBLE
 | 
				
			||||||
| 
						 | 
					@ -549,10 +549,10 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
  mask  = MAX(XGEMM_UNROLL_M, XGEMM_UNROLL_N) - 1;
 | 
					  mask  = MAX(XGEMM_UNROLL_M, XGEMM_UNROLL_N) - 1;
 | 
				
			||||||
#elif defined(DOUBLE)
 | 
					#elif defined(DOUBLE)
 | 
				
			||||||
  mode  =  BLAS_DOUBLE  | BLAS_COMPLEX;
 | 
					  mode  =  BLAS_DOUBLE  | BLAS_COMPLEX;
 | 
				
			||||||
  mask  = MAX(ZGEMM_UNROLL_M, ZGEMM_UNROLL_N) - 1;
 | 
					  mask  = ZGEMM_UNROLL_MN - 1;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
  mode  =  BLAS_SINGLE  | BLAS_COMPLEX;
 | 
					  mode  =  BLAS_SINGLE  | BLAS_COMPLEX;
 | 
				
			||||||
  mask  = MAX(CGEMM_UNROLL_M, CGEMM_UNROLL_N) - 1;
 | 
					  mask  = CGEMM_UNROLL_MN - 1;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -367,16 +367,10 @@ static int inner_thread(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n,
 | 
				
			||||||
      for(jjs = xxx; jjs < MIN(n_to, xxx + div_n); jjs += min_jj){
 | 
					      for(jjs = xxx; jjs < MIN(n_to, xxx + div_n); jjs += min_jj){
 | 
				
			||||||
	min_jj = MIN(n_to, xxx + div_n) - jjs;
 | 
						min_jj = MIN(n_to, xxx + div_n) - jjs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if ( defined(BULLDOZER) || defined(PILEDRIVER) || defined(HASWELL) ) && defined(ARCH_X86_64) && !defined(XDOUBLE) && !defined(COMPLEX)
 | 
						if (min_jj >= 3*GEMM_UNROLL_N) min_jj = 3*GEMM_UNROLL_N;
 | 
				
			||||||
		if (min_jj >= 6*GEMM_UNROLL_N) min_jj = 6*GEMM_UNROLL_N;
 | 
						else
 | 
				
			||||||
		else
 | 
							if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
			if (min_jj >= 3*GEMM_UNROLL_N) min_jj = 3*GEMM_UNROLL_N;
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	START_RPCC();
 | 
						START_RPCC();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,10 +57,10 @@ int CNAME(int mode, blas_arg_t *arg, BLASLONG *range_m, BLASLONG *range_n, int (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (mode & BLAS_PREC) {
 | 
					    switch (mode & BLAS_PREC) {
 | 
				
			||||||
    case BLAS_SINGLE:
 | 
					    case BLAS_SINGLE:
 | 
				
			||||||
      mask = MAX(SGEMM_UNROLL_M, SGEMM_UNROLL_N) - 1;
 | 
					      mask = SGEMM_UNROLL_MN - 1;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case BLAS_DOUBLE:
 | 
					    case BLAS_DOUBLE:
 | 
				
			||||||
      mask = MAX(DGEMM_UNROLL_M, DGEMM_UNROLL_N) - 1;
 | 
					      mask = DGEMM_UNROLL_MN - 1;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
#ifdef EXPRECISION
 | 
					#ifdef EXPRECISION
 | 
				
			||||||
    case BLAS_XDOUBLE:
 | 
					    case BLAS_XDOUBLE:
 | 
				
			||||||
| 
						 | 
					@ -71,10 +71,10 @@ int CNAME(int mode, blas_arg_t *arg, BLASLONG *range_m, BLASLONG *range_n, int (
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    switch (mode & BLAS_PREC) {
 | 
					    switch (mode & BLAS_PREC) {
 | 
				
			||||||
    case BLAS_SINGLE:
 | 
					    case BLAS_SINGLE:
 | 
				
			||||||
      mask = MAX(CGEMM_UNROLL_M, CGEMM_UNROLL_N) - 1;
 | 
					      mask = CGEMM_UNROLL_MN - 1;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case BLAS_DOUBLE:
 | 
					    case BLAS_DOUBLE:
 | 
				
			||||||
      mask = MAX(ZGEMM_UNROLL_M, ZGEMM_UNROLL_N) - 1;
 | 
					      mask = ZGEMM_UNROLL_MN - 1;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
#ifdef EXPRECISION
 | 
					#ifdef EXPRECISION
 | 
				
			||||||
    case BLAS_XDOUBLE:
 | 
					    case BLAS_XDOUBLE:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -135,7 +135,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					    for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
      min_jj = min_j + js - jjs;
 | 
					      min_jj = min_j + js - jjs;
 | 
				
			||||||
      if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
					      if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      START_RPCC();
 | 
					      START_RPCC();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -199,7 +201,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j + js - jjs;
 | 
						min_jj = min_j + js - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
					        if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	START_RPCC();
 | 
						START_RPCC();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -288,7 +292,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					    for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
      min_jj = min_j + js - jjs;
 | 
					      min_jj = min_j + js - jjs;
 | 
				
			||||||
      if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
					      if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      START_RPCC();
 | 
					      START_RPCC();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -352,7 +358,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j + js - jjs;
 | 
						min_jj = min_j + js - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
					        if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	START_RPCC();
 | 
						START_RPCC();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -119,7 +119,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = 0; jjs < ls - js; jjs += min_jj){
 | 
					      for(jjs = 0; jjs < ls - js; jjs += min_jj){
 | 
				
			||||||
	min_jj = ls - js - jjs;
 | 
						min_jj = ls - js - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TRANSA
 | 
					#ifndef TRANSA
 | 
				
			||||||
	GEMM_ONCOPY(min_l, min_jj, a + (ls + (js + jjs) * lda) * COMPSIZE, lda, sb + min_l * jjs * COMPSIZE);
 | 
						GEMM_ONCOPY(min_l, min_jj, a + (ls + (js + jjs) * lda) * COMPSIZE, lda, sb + min_l * jjs * COMPSIZE);
 | 
				
			||||||
| 
						 | 
					@ -137,7 +139,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = 0; jjs < min_l; jjs += min_jj){
 | 
					      for(jjs = 0; jjs < min_l; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_l - jjs;
 | 
						min_jj = min_l - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TRANSA
 | 
					#ifndef TRANSA
 | 
				
			||||||
	TRMM_OLNCOPY(min_l, min_jj, a, lda, ls, ls + jjs, sb + min_l * (ls - js + jjs) * COMPSIZE);
 | 
						TRMM_OLNCOPY(min_l, min_jj, a, lda, ls, ls + jjs, sb + min_l * (ls - js + jjs) * COMPSIZE);
 | 
				
			||||||
| 
						 | 
					@ -188,7 +192,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j + js - jjs;
 | 
						min_jj = min_j + js - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TRANSA
 | 
					#ifndef TRANSA
 | 
				
			||||||
	GEMM_ONCOPY(min_l, min_jj, a + (ls + jjs * lda) * COMPSIZE, lda, sb + min_l * (jjs - js) * COMPSIZE);
 | 
						GEMM_ONCOPY(min_l, min_jj, a + (ls + jjs * lda) * COMPSIZE, lda, sb + min_l * (jjs - js) * COMPSIZE);
 | 
				
			||||||
| 
						 | 
					@ -239,7 +245,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = 0; jjs < min_l; jjs += min_jj){
 | 
					      for(jjs = 0; jjs < min_l; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_l - jjs;
 | 
						min_jj = min_l - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TRANSA
 | 
					#ifndef TRANSA
 | 
				
			||||||
	TRMM_OUNCOPY(min_l, min_jj, a, lda, ls, ls + jjs, sb + min_l * jjs * COMPSIZE);
 | 
						TRMM_OUNCOPY(min_l, min_jj, a, lda, ls, ls + jjs, sb + min_l * jjs * COMPSIZE);
 | 
				
			||||||
| 
						 | 
					@ -258,7 +266,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = 0; jjs < js - ls - min_l; jjs += min_jj){
 | 
					      for(jjs = 0; jjs < js - ls - min_l; jjs += min_jj){
 | 
				
			||||||
	min_jj = js - ls - min_l - jjs;
 | 
						min_jj = js - ls - min_l - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TRANSA
 | 
					#ifndef TRANSA
 | 
				
			||||||
	GEMM_ONCOPY(min_l, min_jj, a + (ls + (ls + min_l + jjs) * lda) * COMPSIZE, lda,
 | 
						GEMM_ONCOPY(min_l, min_jj, a + (ls + (ls + min_l + jjs) * lda) * COMPSIZE, lda,
 | 
				
			||||||
| 
						 | 
					@ -313,7 +323,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j + js - jjs;
 | 
						min_jj = min_j + js - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TRANSA
 | 
					#ifndef TRANSA
 | 
				
			||||||
	GEMM_ONCOPY(min_l, min_jj, a + (ls + (jjs - min_j) * lda) * COMPSIZE, lda, sb + min_l * (jjs - js) * COMPSIZE);
 | 
						GEMM_ONCOPY(min_l, min_jj, a + (ls + (jjs - min_j) * lda) * COMPSIZE, lda, sb + min_l * (jjs - js) * COMPSIZE);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -128,7 +128,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j + js - jjs;
 | 
						min_jj = min_j + js - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GEMM_ONCOPY(min_l, min_jj, b + (ls + jjs * ldb) * COMPSIZE, ldb, sb + min_l * (jjs - js) * COMPSIZE);
 | 
						GEMM_ONCOPY(min_l, min_jj, b + (ls + jjs * ldb) * COMPSIZE, ldb, sb + min_l * (jjs - js) * COMPSIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -194,7 +196,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j + js - jjs;
 | 
						min_jj = min_j + js - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GEMM_ONCOPY(min_l, min_jj, b + (ls - min_l + jjs * ldb) * COMPSIZE, ldb, sb + min_l * (jjs - js) * COMPSIZE);
 | 
						GEMM_ONCOPY(min_l, min_jj, b + (ls - min_l + jjs * ldb) * COMPSIZE, ldb, sb + min_l * (jjs - js) * COMPSIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -123,7 +123,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j + js - jjs;
 | 
						min_jj = min_j + js - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TRANSA
 | 
					#ifndef TRANSA
 | 
				
			||||||
	GEMM_ONCOPY(min_l, min_jj, a + (ls + jjs * lda) * COMPSIZE, lda, sb + min_l * (jjs - js) * COMPSIZE);
 | 
						GEMM_ONCOPY(min_l, min_jj, a + (ls + jjs * lda) * COMPSIZE, lda, sb + min_l * (jjs - js) * COMPSIZE);
 | 
				
			||||||
| 
						 | 
					@ -177,7 +179,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = 0; jjs < min_j - min_l - ls + js; jjs += min_jj){
 | 
					      for(jjs = 0; jjs < min_j - min_l - ls + js; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j - min_l - ls + js - jjs;
 | 
						min_jj = min_j - min_l - ls + js - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TRANSA
 | 
					#ifndef TRANSA
 | 
				
			||||||
      GEMM_ONCOPY (min_l, min_jj, a + (ls + (ls + min_l + jjs) * lda) * COMPSIZE, lda,
 | 
					      GEMM_ONCOPY (min_l, min_jj, a + (ls + (ls + min_l + jjs) * lda) * COMPSIZE, lda,
 | 
				
			||||||
| 
						 | 
					@ -238,7 +242,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
					      for(jjs = js; jjs < js + min_j; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j + js - jjs;
 | 
						min_jj = min_j + js - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TRANSA
 | 
					#ifndef TRANSA
 | 
				
			||||||
	GEMM_ONCOPY(min_l, min_jj, a + (ls + (jjs - min_j) * lda) * COMPSIZE, lda, sb + min_l * (jjs - js) * COMPSIZE);
 | 
						GEMM_ONCOPY(min_l, min_jj, a + (ls + (jjs - min_j) * lda) * COMPSIZE, lda, sb + min_l * (jjs - js) * COMPSIZE);
 | 
				
			||||||
| 
						 | 
					@ -297,7 +303,9 @@ int CNAME(blas_arg_t *args, BLASLONG *range_m, BLASLONG *range_n, FLOAT *sa, FLO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for(jjs = 0; jjs < min_j - js + ls; jjs += min_jj){
 | 
					      for(jjs = 0; jjs < min_j - js + ls; jjs += min_jj){
 | 
				
			||||||
	min_jj = min_j - js + ls - jjs;
 | 
						min_jj = min_j - js + ls - jjs;
 | 
				
			||||||
	if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
						if (min_jj > GEMM_UNROLL_N*3) min_jj = GEMM_UNROLL_N*3;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef TRANSA
 | 
					#ifndef TRANSA
 | 
				
			||||||
	GEMM_ONCOPY (min_l, min_jj, a + (ls + (js - min_j + jjs) * lda) * COMPSIZE, lda,
 | 
						GEMM_ONCOPY (min_l, min_jj, a + (ls + (js - min_j + jjs) * lda) * COMPSIZE, lda,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,7 +54,14 @@ gotoblas_t TABLE_NAME = {
 | 
				
			||||||
  GEMM_DEFAULT_OFFSET_A, GEMM_DEFAULT_OFFSET_B, GEMM_DEFAULT_ALIGN,
 | 
					  GEMM_DEFAULT_OFFSET_A, GEMM_DEFAULT_OFFSET_B, GEMM_DEFAULT_ALIGN,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  0, 0, 0,
 | 
					  0, 0, 0,
 | 
				
			||||||
  SGEMM_DEFAULT_UNROLL_M, SGEMM_DEFAULT_UNROLL_N, MAX(SGEMM_DEFAULT_UNROLL_M, SGEMM_DEFAULT_UNROLL_N),
 | 
					  SGEMM_DEFAULT_UNROLL_M, SGEMM_DEFAULT_UNROLL_N,
 | 
				
			||||||
 | 
					#ifdef SGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					 SGEMM_DEFAULT_UNROLL_MN,
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					 MAX(SGEMM_DEFAULT_UNROLL_M, SGEMM_DEFAULT_UNROLL_N),
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_EXCLUSIVE_CACHE
 | 
					#ifdef HAVE_EXCLUSIVE_CACHE
 | 
				
			||||||
  1,
 | 
					  1,
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
| 
						 | 
					@ -110,7 +117,12 @@ gotoblas_t TABLE_NAME = {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  0, 0, 0,
 | 
					  0, 0, 0,
 | 
				
			||||||
  DGEMM_DEFAULT_UNROLL_M, DGEMM_DEFAULT_UNROLL_N, MAX(DGEMM_DEFAULT_UNROLL_M, DGEMM_DEFAULT_UNROLL_N),
 | 
					  DGEMM_DEFAULT_UNROLL_M, DGEMM_DEFAULT_UNROLL_N,
 | 
				
			||||||
 | 
					#ifdef DGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					 DGEMM_DEFAULT_UNROLL_MN,
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					 MAX(DGEMM_DEFAULT_UNROLL_M, DGEMM_DEFAULT_UNROLL_N),
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  damax_kTS,  damin_kTS,  dmax_kTS,  dmin_kTS,
 | 
					  damax_kTS,  damin_kTS,  dmax_kTS,  dmin_kTS,
 | 
				
			||||||
  idamax_kTS, idamin_kTS, idmax_kTS, idmin_kTS,
 | 
					  idamax_kTS, idamin_kTS, idmax_kTS, idmin_kTS,
 | 
				
			||||||
| 
						 | 
					@ -214,7 +226,12 @@ gotoblas_t TABLE_NAME = {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  0, 0, 0,
 | 
					  0, 0, 0,
 | 
				
			||||||
  CGEMM_DEFAULT_UNROLL_M, CGEMM_DEFAULT_UNROLL_N, MAX(CGEMM_DEFAULT_UNROLL_M, CGEMM_DEFAULT_UNROLL_N),
 | 
					  CGEMM_DEFAULT_UNROLL_M, CGEMM_DEFAULT_UNROLL_N,
 | 
				
			||||||
 | 
					#ifdef CGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					 CGEMM_DEFAULT_UNROLL_MN,
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					 MAX(CGEMM_DEFAULT_UNROLL_M, CGEMM_DEFAULT_UNROLL_N),
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  camax_kTS, camin_kTS, icamax_kTS, icamin_kTS,
 | 
					  camax_kTS, camin_kTS, icamax_kTS, icamin_kTS,
 | 
				
			||||||
  cnrm2_kTS, casum_kTS, ccopy_kTS,
 | 
					  cnrm2_kTS, casum_kTS, ccopy_kTS,
 | 
				
			||||||
| 
						 | 
					@ -307,7 +324,12 @@ gotoblas_t TABLE_NAME = {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  0, 0, 0,
 | 
					  0, 0, 0,
 | 
				
			||||||
  ZGEMM_DEFAULT_UNROLL_M, ZGEMM_DEFAULT_UNROLL_N, MAX(ZGEMM_DEFAULT_UNROLL_M, ZGEMM_DEFAULT_UNROLL_N),
 | 
					  ZGEMM_DEFAULT_UNROLL_M, ZGEMM_DEFAULT_UNROLL_N,
 | 
				
			||||||
 | 
					#ifdef ZGEMM_DEFAULT_UNROLL_MN
 | 
				
			||||||
 | 
					 ZGEMM_DEFAULT_UNROLL_MN,
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					 MAX(ZGEMM_DEFAULT_UNROLL_M, ZGEMM_DEFAULT_UNROLL_N),
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  zamax_kTS, zamin_kTS, izamax_kTS, izamin_kTS,
 | 
					  zamax_kTS, zamin_kTS, izamax_kTS, izamin_kTS,
 | 
				
			||||||
  znrm2_kTS, zasum_kTS, zcopy_kTS,
 | 
					  znrm2_kTS, zasum_kTS, zcopy_kTS,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								param.h
								
								
								
								
							
							
						
						
									
										1
									
								
								param.h
								
								
								
								
							| 
						 | 
					@ -1206,6 +1206,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
#define ZGEMM_DEFAULT_UNROLL_N 2
 | 
					#define ZGEMM_DEFAULT_UNROLL_N 2
 | 
				
			||||||
#define XGEMM_DEFAULT_UNROLL_N 1
 | 
					#define XGEMM_DEFAULT_UNROLL_N 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DGEMM_DEFAULT_UNROLL_MN 16
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef ARCH_X86
 | 
					#ifdef ARCH_X86
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue