benchmark/hpmv&hbmv: add benchmark/hpmv.c and benchmark/hbmv.ctags/v0.3.10^2
@@ -73,6 +73,8 @@ goto :: slinpack.goto dlinpack.goto clinpack.goto zlinpack.goto \ | |||||
sasum.goto dasum.goto casum.goto zasum.goto \ | sasum.goto dasum.goto casum.goto zasum.goto \ | ||||
ssymv.goto dsymv.goto csymv.goto zsymv.goto \ | ssymv.goto dsymv.goto csymv.goto zsymv.goto \ | ||||
chemv.goto zhemv.goto \ | chemv.goto zhemv.goto \ | ||||
chbmv.goto zhbmv.goto \ | |||||
chpmv.goto zhpmv.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 \ | ||||
@@ -106,6 +108,8 @@ acml :: slinpack.acml dlinpack.acml clinpack.acml zlinpack.acml \ | |||||
sasum.acml dasum.acml casum.acml zasum.acml \ | sasum.acml dasum.acml casum.acml zasum.acml \ | ||||
ssymv.acml dsymv.acml csymv.acml zsymv.acml \ | ssymv.acml dsymv.acml csymv.acml zsymv.acml \ | ||||
chemv.acml zhemv.acml \ | chemv.acml zhemv.acml \ | ||||
chbmv.acml zhbmv.acml \ | |||||
chpmv.acml zhpmv.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 \ | ||||
@@ -139,6 +143,8 @@ atlas :: slinpack.atlas dlinpack.atlas clinpack.atlas zlinpack.atlas \ | |||||
sasum.atlas dasum.atlas casum.atlas zasum.atlas \ | sasum.atlas dasum.atlas casum.atlas zasum.atlas \ | ||||
ssymv.atlas dsymv.atlas csymv.atlas zsymv.atlas \ | ssymv.atlas dsymv.atlas csymv.atlas zsymv.atlas \ | ||||
chemv.atlas zhemv.atlas \ | chemv.atlas zhemv.atlas \ | ||||
chbmv.atlas zhbmv.atlas \ | |||||
chpmv.atlas zhpmv.atlas \ | |||||
chemm.acml zhemm.acml \ | chemm.acml zhemm.acml \ | ||||
chemm.atlas zhemm.atlas \ | chemm.atlas zhemm.atlas \ | ||||
cherk.atlas zherk.atlas \ | cherk.atlas zherk.atlas \ | ||||
@@ -173,6 +179,8 @@ mkl :: slinpack.mkl dlinpack.mkl clinpack.mkl zlinpack.mkl \ | |||||
sasum.mkl dasum.mkl casum.mkl zasum.mkl \ | sasum.mkl dasum.mkl casum.mkl zasum.mkl \ | ||||
ssymv.mkl dsymv.mkl csymv.mkl zsymv.mkl \ | ssymv.mkl dsymv.mkl csymv.mkl zsymv.mkl \ | ||||
chemv.mkl zhemv.mkl \ | chemv.mkl zhemv.mkl \ | ||||
chbmv.mkl zhbmv.mkl \ | |||||
chpmv.mkl zhpmv.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 \ | ||||
@@ -207,6 +215,8 @@ goto :: sgemm.goto dgemm.goto cgemm.goto zgemm.goto \ | |||||
sasum.goto dasum.goto casum.goto zasum.goto \ | sasum.goto dasum.goto casum.goto zasum.goto \ | ||||
ssymv.goto dsymv.goto \ | ssymv.goto dsymv.goto \ | ||||
chemv.goto zhemv.goto \ | chemv.goto zhemv.goto \ | ||||
chbmv.goto zhbmv.goto \ | |||||
chpmv.goto zhpmv.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 \ | ||||
@@ -239,6 +249,8 @@ acml :: slinpack.acml dlinpack.acml clinpack.acml zlinpack.acml \ | |||||
sasum.acml dasum.acml casum.acml zasum.acml \ | sasum.acml dasum.acml casum.acml zasum.acml \ | ||||
ssymv.acml dsymv.acml csymv.acml zsymv.acml \ | ssymv.acml dsymv.acml csymv.acml zsymv.acml \ | ||||
chemv.acml zhemv.acml \ | chemv.acml zhemv.acml \ | ||||
chbmv.acml zhbmv.acml \ | |||||
chpmv.acml zhpmv.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 \ | ||||
@@ -272,6 +284,8 @@ atlas :: slinpack.atlas dlinpack.atlas clinpack.atlas zlinpack.atlas \ | |||||
sasum.atlas dasum.atlas casum.atlas zasum.atlas \ | sasum.atlas dasum.atlas casum.atlas zasum.atlas \ | ||||
ssymv.atlas dsymv.atlas csymv.atlas zsymv.atlas \ | ssymv.atlas dsymv.atlas csymv.atlas zsymv.atlas \ | ||||
chemv.atlas zhemv.atlas \ | chemv.atlas zhemv.atlas \ | ||||
chbmv.atlas zhbmv.atlas \ | |||||
chpmv.atlas zhpmv.atlas \ | |||||
chemm.acml zhemm.acml \ | chemm.acml zhemm.acml \ | ||||
chemm.atlas zhemm.atlas \ | chemm.atlas zhemm.atlas \ | ||||
cherk.atlas zherk.atlas \ | cherk.atlas zherk.atlas \ | ||||
@@ -308,6 +322,8 @@ mkl :: slinpack.mkl dlinpack.mkl clinpack.mkl zlinpack.mkl \ | |||||
sasum.mkl dasum.mkl casum.mkl zasum.mkl \ | sasum.mkl dasum.mkl casum.mkl zasum.mkl \ | ||||
ssymv.mkl dsymv.mkl csymv.mkl zsymv.mkl \ | ssymv.mkl dsymv.mkl csymv.mkl zsymv.mkl \ | ||||
chemv.mkl zhemv.mkl \ | chemv.mkl zhemv.mkl \ | ||||
chbmv.mkl zhbmv.mkl \ | |||||
chpmv.mkl zhpmv.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 \ | ||||
@@ -352,6 +368,8 @@ veclib :: slinpack.veclib dlinpack.veclib clinpack.veclib zlinpack.veclib \ | |||||
sasum.veclib dasum.veclib casum.veclib zasum.veclib \ | sasum.veclib dasum.veclib casum.veclib zasum.veclib \ | ||||
ssymv.veclib dsymv.veclib csymv.veclib zsymv.veclib \ | ssymv.veclib dsymv.veclib csymv.veclib zsymv.veclib \ | ||||
chemv.veclib zhemv.veclib \ | chemv.veclib zhemv.veclib \ | ||||
chbmv.veclib zhbmv.veclib \ | |||||
chpmv.veclib zhpmv.veclib \ | |||||
chemm.veclib zhemm.veclib \ | chemm.veclib zhemm.veclib \ | ||||
cherk.veclib zherk.veclib \ | cherk.veclib zherk.veclib \ | ||||
cher2k.veclib zher2k.veclib \ | cher2k.veclib zher2k.veclib \ | ||||
@@ -1747,7 +1765,70 @@ zhemv.mkl : zhemv.$(SUFFIX) | |||||
zhemv.veclib : zhemv.$(SUFFIX) | zhemv.veclib : zhemv.$(SUFFIX) | ||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBVECLIB) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | -$(CC) $(CFLAGS) -o $(@F) $^ $(LIBVECLIB) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | ||||
##################################### Chbmv #################################################### | |||||
chbmv.goto : chbmv.$(SUFFIX) ../$(LIBNAME) | |||||
$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm | |||||
chbmv.acml : chbmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
chbmv.atlas : chbmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBATLAS) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
chbmv.mkl : chbmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
chbmv.veclib : chbmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBVECLIB) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
##################################### Zhbmv #################################################### | |||||
zhbmv.goto : zhbmv.$(SUFFIX) ../$(LIBNAME) | |||||
$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm | |||||
zhbmv.acml : zhbmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
zhbmv.atlas : zhbmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBATLAS) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
zhbmv.mkl : zhbmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
zhbmv.veclib : zhbmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBVECLIB) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
##################################### Chpmv #################################################### | |||||
chpmv.goto : chpmv.$(SUFFIX) ../$(LIBNAME) | |||||
$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm | |||||
chpmv.acml : chpmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
chpmv.atlas : chpmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBATLAS) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
chpmv.mkl : chpmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
chpmv.veclib : chpmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBVECLIB) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
##################################### Zhpmv #################################################### | |||||
zhpmv.goto : zhpmv.$(SUFFIX) ../$(LIBNAME) | |||||
$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm | |||||
zhpmv.acml : zhpmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBACML) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
zhpmv.atlas : zhpmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBATLAS) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
zhpmv.mkl : zhpmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBMKL) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
zhpmv.veclib : zhpmv.$(SUFFIX) | |||||
-$(CC) $(CFLAGS) -o $(@F) $^ $(LIBVECLIB) $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) | |||||
##################################### Sdot #################################################### | ##################################### Sdot #################################################### | ||||
sdot.goto : sdot.$(SUFFIX) ../$(LIBNAME) | sdot.goto : sdot.$(SUFFIX) ../$(LIBNAME) | ||||
$(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm | $(CC) $(CFLAGS) -o $(@F) $^ $(CEXTRALIB) $(EXTRALIB) $(FEXTRALIB) -lm | ||||
@@ -2597,6 +2678,18 @@ chemv.$(SUFFIX) : hemv.c | |||||
zhemv.$(SUFFIX) : hemv.c | zhemv.$(SUFFIX) : hemv.c | ||||
$(CC) $(CFLAGS) -c -DCOMPLEX -DDOUBLE -o $(@F) $^ | $(CC) $(CFLAGS) -c -DCOMPLEX -DDOUBLE -o $(@F) $^ | ||||
chbmv.$(SUFFIX) : hbmv.c | |||||
$(CC) $(CFLAGS) -c -DCOMPLEX -UDOUBLE -o $(@F) $^ | |||||
zhbmv.$(SUFFIX) : hbmv.c | |||||
$(CC) $(CFLAGS) -c -DCOMPLEX -DDOUBLE -o $(@F) $^ | |||||
chpmv.$(SUFFIX) : hpmv.c | |||||
$(CC) $(CFLAGS) -c -DCOMPLEX -UDOUBLE -o $(@F) $^ | |||||
zhpmv.$(SUFFIX) : hpmv.c | |||||
$(CC) $(CFLAGS) -c -DCOMPLEX -DDOUBLE -o $(@F) $^ | |||||
sdot.$(SUFFIX) : dot.c | sdot.$(SUFFIX) : dot.c | ||||
$(CC) $(CFLAGS) -c -UCOMPLEX -UDOUBLE -o $(@F) $^ | $(CC) $(CFLAGS) -c -UCOMPLEX -UDOUBLE -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 HBMV | |||||
#ifdef DOUBLE | |||||
#define HBMV BLASFUNC(zhbmv) | |||||
#else | |||||
#define HBMV BLASFUNC(chbmv) | |||||
#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 [] = {0.0, 0.0}; | |||||
blasint k = 1; | |||||
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; | |||||
if ((p = getenv("OPENBLAS_K"))) k = atoi(p); | |||||
fprintf(stderr, "From : %3d To : %3d Step = %3d Uplo = '%c' k = %d Inc_x = %d Inc_y = %d Loops = %d\n", | |||||
from, to, step, uplo, k, 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); | |||||
HBMV (&uplo, &m, &k, 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)(2 * k + 1) * (double)m / timeg * 1.e-6); | |||||
} | |||||
return 0; | |||||
} | |||||
// void main(int argc, char *argv[]) __attribute__((weak, alias("MAIN__"))); |
@@ -0,0 +1,207 @@ | |||||
/*************************************************************************** | |||||
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 HPMV | |||||
#ifdef DOUBLE | |||||
#define HPMV BLASFUNC(zhpmv) | |||||
#else | |||||
#define HPMV BLASFUNC(chpmv) | |||||
#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); | |||||
HPMV (&uplo, &m, alpha, a, 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__"))); |