Add benchmark file rotm.c and modify benchmark/Makefile to test s/drotm
authorshengyang <shengyang1@huawei.com>
Thu, 5 Mar 2020 01:55:16 +0000 (09:55 +0800)
committershengyang <shengyang1@huawei.com>
Thu, 5 Mar 2020 02:05:59 +0000 (10:05 +0800)
modified:   benchmark/Makefile
new file:   benchmark/rotm.c

benchmark/Makefile
benchmark/rotm.c [new file with mode: 0644]

index c037dd6..699670e 100644 (file)
@@ -62,6 +62,7 @@ goto :: slinpack.goto dlinpack.goto clinpack.goto zlinpack.goto \
        sger.goto dger.goto cger.goto zger.goto \
        sdot.goto ddot.goto \
        srot.goto drot.goto \
+       srotm.goto drotm.goto \
        saxpy.goto daxpy.goto caxpy.goto zaxpy.goto \
        scopy.goto dcopy.goto ccopy.goto zcopy.goto \
        sswap.goto dswap.goto cswap.goto zswap.goto \
@@ -90,6 +91,7 @@ acml :: slinpack.acml dlinpack.acml clinpack.acml zlinpack.acml \
        ssyr2k.acml dsyr2k.acml csyr2k.acml zsyr2k.acml \
        sger.acml dger.acml cger.acml zger.acml \
        sdot.acml ddot.acml \
+       srotm.acml drotm.acml \
        saxpy.acml daxpy.acml caxpy.acml zaxpy.acml \
        scopy.acml dcopy.acml ccopy.acml zcopy.acml \
        sswap.acml dswap.acml cswap.acml zswap.acml \
@@ -118,6 +120,7 @@ atlas :: slinpack.atlas dlinpack.atlas clinpack.atlas zlinpack.atlas \
        ssyr2k.atlas dsyr2k.atlas csyr2k.atlas zsyr2k.atlas \
        sger.atlas dger.atlas cger.atlas zger.atlas\
        sdot.atlas ddot.atlas \
+       srotm.atlas drotm.atlas \
        saxpy.atlas daxpy.atlas caxpy.atlas zaxpy.atlas \
        scopy.atlas dcopy.atlas ccopy.atlas zcopy.atlas \
        sswap.atlas dswap.atlas cswap.atlas zswap.atlas \
@@ -147,6 +150,7 @@ mkl :: slinpack.mkl dlinpack.mkl clinpack.mkl zlinpack.mkl \
        ssyr2k.mkl dsyr2k.mkl csyr2k.mkl zsyr2k.mkl \
        sger.mkl dger.mkl cger.mkl zger.mkl \
        sdot.mkl ddot.mkl \
+       srotm.mkl drotm.mkl \
        saxpy.mkl daxpy.mkl caxpy.mkl zaxpy.mkl \
        scopy.mkl dcopy.mkl ccopy.mkl zcopy.mkl \
        sswap.mkl dswap.mkl cswap.mkl zswap.mkl \
@@ -176,6 +180,7 @@ goto :: sgemm.goto dgemm.goto cgemm.goto zgemm.goto \
        sger.goto dger.goto cger.goto zger.goto \
        sdot.goto ddot.goto cdot.goto zdot.goto \
        srot.goto drot.goto \
+       srotm.goto drotm.goto \
        saxpy.goto daxpy.goto caxpy.goto zaxpy.goto \
        scopy.goto dcopy.goto ccopy.goto zcopy.goto \
        sswap.goto dswap.goto cswap.goto zswap.goto \
@@ -203,6 +208,7 @@ acml :: slinpack.acml dlinpack.acml clinpack.acml zlinpack.acml \
        ssyr2k.acml dsyr2k.acml csyr2k.acml zsyr2k.acml \
        sger.acml dger.acml cger.acml zger.acml \
        sdot.acml ddot.acml \
+       srotm.acml drotm.acml \
        saxpy.acml daxpy.acml caxpy.acml zaxpy.acml \
        scopy.acml dcopy.acml ccopy.acml zcopy.acml \
        sswap.acml dswap.acml cswap.acml zswap.acml \
@@ -231,6 +237,7 @@ atlas :: slinpack.atlas dlinpack.atlas clinpack.atlas zlinpack.atlas \
        ssyr2k.atlas dsyr2k.atlas csyr2k.atlas zsyr2k.atlas \
        sger.atlas dger.atlas cger.atlas zger.atlas\
        sdot.atlas ddot.atlas \
+       srotm.atlas drotm.atlas \
        saxpy.atlas daxpy.atlas caxpy.atlas zaxpy.atlas \
        scopy.atlas dcopy.atlas ccopy.atlas zcopy.atlas \
        sswap.atlas dswap.atlas cswap.atlas zswap.atlas \
@@ -262,6 +269,7 @@ mkl :: slinpack.mkl dlinpack.mkl clinpack.mkl zlinpack.mkl \
        ssyr2k.mkl dsyr2k.mkl csyr2k.mkl zsyr2k.mkl \
        sger.mkl dger.mkl cger.mkl zger.mkl \
        sdot.mkl ddot.mkl cdot.mkl zdot.mkl \
+       srotm.atlas drotm.atlas \
        saxpy.mkl daxpy.mkl caxpy.mkl zaxpy.mkl \
        scopy.mkl dcopy.mkl ccopy.mkl zcopy.mkl \
        sswap.mkl dswap.mkl cswap.mkl zswap.mkl \
@@ -301,6 +309,7 @@ veclib :: slinpack.veclib dlinpack.veclib clinpack.veclib zlinpack.veclib \
        ssyr2k.veclib dsyr2k.veclib csyr2k.veclib zsyr2k.veclib \
        sger.veclib dger.veclib cger.veclib zger.veclib \
        sdot.veclib ddot.veclib cdot.veclib zdot.veclib \
+       srotm.veclib drotm.veclib \
        saxpy.veclib daxpy.veclib caxpy.veclib zaxpy.veclib \
        scopy.veclib dcopy.veclib ccopy.veclib zcopy.veclib \
        sswap.veclib dswap.veclib cswap.veclib zswap.veclib \
@@ -1639,6 +1648,37 @@ drot.mkl : drot.$(SUFFIX)
 drot.veclib : drot.$(SUFFIX)
        $(CC) $(CFLAGS) -o $(@F) $^ $(LIBVECLIB) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 
+##################################### srotm ####################################################
+srotm.goto : srotm.$(SUFFIX) ../$(LIBNAME)
+       $(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm
+
+srotm.acml : srotm.$(SUFFIX)
+       $(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
+
+srotm.atlas : srotm.$(SUFFIX)
+       $(CC) $(CFLAGS) -o $(@F) $^ $(LIBATLAS) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
+
+srotm.mkl : srotm.$(SUFFIX)
+       $(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
+
+srotm.veclib : srotm.$(SUFFIX)
+       $(CC) $(CFLAGS) -o $(@F) $^ $(LIBVECLIB) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
+
+##################################### drotm ####################################################
+drotm.goto : drotm.$(SUFFIX) ../$(LIBNAME)
+       $(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm
+
+drotm.acml : drotm.$(SUFFIX)
+       $(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
+
+drotm.atlas : drotm.$(SUFFIX)
+       $(CC) $(CFLAGS) -o $(@F) $^ $(LIBATLAS) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
+
+drotm.mkl : drotm.$(SUFFIX)
+       $(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
+
+drotm.veclib : drotm.$(SUFFIX)
+       $(CC) $(CFLAGS) -o $(@F) $^ $(LIBVECLIB) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB)
 
 ##################################### Saxpy ####################################################
 saxpy.goto : saxpy.$(SUFFIX) ../$(LIBNAME)
@@ -2432,7 +2472,11 @@ srot.$(SUFFIX) : rot.c
 drot.$(SUFFIX) : rot.c
        $(CC) $(CFLAGS) -c -UCOMPLEX -DDOUBLE -o $(@F) $^
 
+srotm.$(SUFFIX) : rotm.c
+       $(CC) $(CFLAGS) -c -UCOMPLEX -UDOUBLE -o $(@F) $^
 
+drotm.$(SUFFIX) : rotm.c
+       $(CC) $(CFLAGS) -c -UCOMPLEX -DDOUBLE -o $(@F) $^
 
 
 
diff --git a/benchmark/rotm.c b/benchmark/rotm.c
new file mode 100644 (file)
index 0000000..8dea2d0
--- /dev/null
@@ -0,0 +1,210 @@
+/***************************************************************************\r
+Copyright (c) 2014, The OpenBLAS Project\r
+All rights reserved.\r
+Redistribution and use in source and binary forms, with or without\r
+modification, are permitted provided that the following conditions are\r
+met:\r
+1. Redistributions of source code must retain the above copyright\r
+notice, this list of conditions and the following disclaimer.\r
+2. Redistributions in binary form must reproduce the above copyright\r
+notice, this list of conditions and the following disclaimer in\r
+the documentation and/or other materials provided with the\r
+distribution.\r
+3. Neither the name of the OpenBLAS project nor the names of\r
+its contributors may be used to endorse or promote products\r
+derived from this software without specific prior written permission.\r
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE\r
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\r
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\r
+THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+*****************************************************************************/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#ifdef __CYGWIN32__\r
+#include <sys/time.h>\r
+#endif\r
+#include "common.h"\r
+\r
+#undef ROTM\r
+\r
+#ifdef DOUBLE\r
+#define ROTM BLASFUNC(drotm)\r
+#else\r
+#define ROTM BLASFUNC(srotm)\r
+#endif\r
+\r
+#if defined(__WIN32__) || defined(__WIN64__)\r
+\r
+#ifndef DELTA_EPOCH_IN_MICROSECS\r
+#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL\r
+#endif\r
+\r
+int gettimeofday(struct timeval *tv, void *tz)\r
+{\r
+\r
+    FILETIME ft;\r
+    unsigned __int64 tmpres = 0;\r
+    static int tzflag;\r
+\r
+    if (NULL != tv) {\r
+        GetSystemTimeAsFileTime(&ft);\r
+\r
+        tmpres |= ft.dwHighDateTime;\r
+        tmpres <<= 32;\r
+        tmpres |= ft.dwLowDateTime;\r
+\r
+        /*converting file time to unix epoch*/\r
+        tmpres /= 10; /*convert into microseconds*/\r
+        tmpres -= DELTA_EPOCH_IN_MICROSECS;\r
+        tv->tv_sec = (long)(tmpres / 1000000UL);\r
+        tv->tv_usec = (long)(tmpres % 1000000UL);\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+#endif\r
+\r
+#if !defined(__WIN32__) && !defined(__WIN64__) && !defined(__CYGWIN32__) && 0\r
+\r
+static void *huge_malloc(BLASLONG size)\r
+{\r
+    int shmid;\r
+    void *address;\r
+\r
+#ifndef SHM_HUGETLB\r
+#define SHM_HUGETLB 04000\r
+#endif\r
+\r
+    if ((shmid =\r
+             shmget(IPC_PRIVATE, (size + HUGE_PAGESIZE) & ~(HUGE_PAGESIZE - 1),\r
+                    SHM_HUGETLB | IPC_CREAT | 0600)) < 0) {\r
+        printf("Memory allocation failed(shmget).\n");\r
+        exit(1);\r
+    }\r
+\r
+    address = shmat(shmid, NULL, SHM_RND);\r
+\r
+    if ((BLASLONG)address == -1) {\r
+        printf("Memory allocation failed(shmat).\n");\r
+        exit(1);\r
+    }\r
+\r
+    shmctl(shmid, IPC_RMID, 0);\r
+\r
+    return address;\r
+}\r
+\r
+#define malloc huge_malloc\r
+\r
+#endif\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+\r
+    FLOAT *x, *y;\r
+    // FLOAT result;\r
+    blasint m, i;\r
+    blasint inc_x = 1, inc_y = 1;\r
+    FLOAT param[5] = {1, 2.0, 3.0, 4.0, 5.0};\r
+    int loops = 1;\r
+    int l;\r
+    char *p;\r
+\r
+    int from = 1;\r
+    int to = 200;\r
+    int step = 1;\r
+\r
+    struct timeval start, stop;\r
+    double time1, timeg;\r
+\r
+    argc--;\r
+    argv++;\r
+\r
+    if (argc > 0) {\r
+        from = atol(*argv);\r
+        argc--;\r
+        argv++;\r
+    }\r
+    if (argc > 0) {\r
+        to = MAX(atol(*argv), from);\r
+        argc--;\r
+        argv++;\r
+    }\r
+    if (argc > 0) {\r
+        step = atol(*argv);\r
+        argc--;\r
+        argv++;\r
+    }\r
+\r
+    if ((p = getenv("OPENBLAS_LOOPS")))\r
+        loops = atoi(p);\r
+    if ((p = getenv("OPENBLAS_INCX")))\r
+        inc_x = atoi(p);\r
+    if ((p = getenv("OPENBLAS_INCY")))\r
+        inc_y = atoi(p);\r
+\r
+    fprintf(\r
+        stderr,\r
+        "From : %3d  To : %3d Step = %3d Inc_x = %d Inc_y = %d Loops = %d\n",\r
+        from, to, step, inc_x, inc_y, loops);\r
+\r
+    if ((x = (FLOAT *)malloc(sizeof(FLOAT) * to * abs(inc_x) * COMPSIZE)) ==\r
+        NULL) {\r
+        fprintf(stderr, "Out of Memory!!\n");\r
+        exit(1);\r
+    }\r
+\r
+    if ((y = (FLOAT *)malloc(sizeof(FLOAT) * to * abs(inc_y) * COMPSIZE)) ==\r
+        NULL) {\r
+        fprintf(stderr, "Out of Memory!!\n");\r
+        exit(1);\r
+    }\r
+\r
+#ifdef linux\r
+    srandom(getpid());\r
+#endif\r
+\r
+    fprintf(stderr, "   SIZE       Flops\n");\r
+\r
+    for (m = from; m <= to; m += step) {\r
+\r
+        timeg = 0;\r
+\r
+        fprintf(stderr, " %6d : ", (int)m);\r
+        for (i = 0; i < m * COMPSIZE * abs(inc_x); i++) {\r
+            x[i] = ((FLOAT)rand() / (FLOAT)RAND_MAX) - 0.5;\r
+        }\r
+\r
+        for (i = 0; i < m * COMPSIZE * abs(inc_y); i++) {\r
+            y[i] = ((FLOAT)rand() / (FLOAT)RAND_MAX) - 0.5;\r
+        }\r
+\r
+        for (l = 0; l < loops; l++) {\r
+            gettimeofday(&start, (struct timezone *)0);\r
+\r
+            ROTM(&m, x, &inc_x, y, &inc_y, param);\r
+\r
+            gettimeofday(&stop, (struct timezone *)0);\r
+\r
+            time1 = (double)(stop.tv_sec - start.tv_sec) +\r
+                    (double)((stop.tv_usec - start.tv_usec)) * 1.e-6;\r
+\r
+            timeg += time1;\r
+        }\r
+\r
+        timeg /= loops;\r
+\r
+        fprintf(stderr, " %10.2f MFlops %10.6f sec\n",\r
+                COMPSIZE * COMPSIZE * 6. * (double)m / timeg * 1.e-6, timeg);\r
+    }\r
+\r
+    return 0;\r
+}\r