modified: benchmark/Makefile new file: benchmark/rotm.ctags/v0.3.10^2
@@ -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) $^ | |||
@@ -0,0 +1,210 @@ | |||
/*************************************************************************** | |||
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 ROTM | |||
#ifdef DOUBLE | |||
#define ROTM BLASFUNC(drotm) | |||
#else | |||
#define ROTM BLASFUNC(srotm) | |||
#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 *x, *y; | |||
// FLOAT result; | |||
blasint m, i; | |||
blasint inc_x = 1, inc_y = 1; | |||
FLOAT param[5] = {1, 2.0, 3.0, 4.0, 5.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); | |||
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 ((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, " %6d : ", (int)m); | |||
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; | |||
} | |||
for (l = 0; l < loops; l++) { | |||
gettimeofday(&start, (struct timezone *)0); | |||
ROTM(&m, x, &inc_x, y, &inc_y, param); | |||
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 %10.6f sec\n", | |||
COMPSIZE * COMPSIZE * 6. * (double)m / timeg * 1.e-6, timeg); | |||
} | |||
return 0; | |||
} |