Optimizations for HASWELLtags/v0.2.11^2
| @@ -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 | |||||
| LIBMKL = -L$(MKL) -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm | |||||
| # MKL=/opt/intel/mkl/lib/intel64 | |||||
| # LIBMKL = -L$(MKL) -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm | |||||
| # Intel custom | # Intel custom | ||||
| #MKL=/home/saar/intel_mkl | |||||
| #LIBMKL = -L$(MKL) -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm | |||||
| MKL=/home/saar/intel_mkl | |||||
| 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 >= 6*GEMM_UNROLL_N) min_jj = 6*GEMM_UNROLL_N; | |||||
| else | |||||
| 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 >= 3*GEMM_UNROLL_N) min_jj = 3*GEMM_UNROLL_N; | |||||
| else | |||||
| if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N; | |||||
| 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 >= 6*GEMM_UNROLL_N) min_jj = 6*GEMM_UNROLL_N; | |||||
| else | |||||
| 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 >= 3*GEMM_UNROLL_N) min_jj = 3*GEMM_UNROLL_N; | |||||
| else | |||||
| if (min_jj > GEMM_UNROLL_N) min_jj = GEMM_UNROLL_N; | |||||
| 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, | ||||
| @@ -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 | ||||