From 6ea9939e0610a809f6f47d13ec68df00d1ca0afc Mon Sep 17 00:00:00 2001 From: Joshua Bakita Date: Fri, 16 Oct 2020 16:55:14 -0400 Subject: Move the DIS benchmarks up a directory and update hardcoded paths Note that this repo does not attempt to keep a copy of the original DIS benchmark distributions. UNC real-time has another repo for that. --- dis/Matrix/ver1/DISstressmarkRNG.h | 190 ++++++++++++ dis/Matrix/ver1/matrix.c | 600 +++++++++++++++++++++++++++++++++++++ dis/Matrix/ver2/DISstressmarkRNG.h | 190 ++++++++++++ dis/Matrix/ver2/matrix.c | 594 ++++++++++++++++++++++++++++++++++++ 4 files changed, 1574 insertions(+) create mode 100755 dis/Matrix/ver1/DISstressmarkRNG.h create mode 100755 dis/Matrix/ver1/matrix.c create mode 100755 dis/Matrix/ver2/DISstressmarkRNG.h create mode 100755 dis/Matrix/ver2/matrix.c (limited to 'dis/Matrix') diff --git a/dis/Matrix/ver1/DISstressmarkRNG.h b/dis/Matrix/ver1/DISstressmarkRNG.h new file mode 100755 index 0000000..4aa2620 --- /dev/null +++ b/dis/Matrix/ver1/DISstressmarkRNG.h @@ -0,0 +1,190 @@ +#include + +#define IA 16807 +#define IM 2147483647 +#define AM (1.0/IM) +#define IQ 127773 +#define IR 2836 +#define NTAB 32 +#define NDIV (1+(IM-1)/NTAB) +#define EPS 1.2e-7 +#define RNMX (1.0-EPS) + +static long iy=0; +static long iv[NTAB]; +static long iseed; + +int ABS(int x){ + if (x>= 0) return x; + else + return (-x); +} + +int sign(int x){ + if (x >= 0) return 1; + else + return (-1); +} + +int MAX(int x, int y){ + if (x>= y) return x; + else + return y; +} + +int MIN(int x, int y){ + if (x<= y) return x; + else + return y; +} + +void randInit(long idum) +{ + long j; + long k; + + assert (idum <= 0); + assert (iy == 0); + + iseed = idum; + if (-(iseed)<1){ + iseed = 1; + } + else { + iseed = -(iseed); + } + for (j=NTAB+7; j>=0; j--){ + k = (iseed)/IQ; + iseed = IA*(iseed-k*IQ)-IR*k; + if (iseed < 0){ + iseed += IM; + } + if (j < NTAB){ + iv[j] = iseed; + } + } + iy = iv[0]; +} + +float randNum() +{ + long j; + long k; + float temp; + + assert (iy != 0); + + k = (iseed)/IQ; + iseed = IA*(iseed-k*IQ)-IR*k; + + if (iseed < 0){ + iseed += IM; + } + j = iy/NDIV; + iy = iv[j]; + iv[j] = iseed; + + temp = AM * iy; + + if (temp > RNMX){ + return RNMX; + } + else { + return temp; + } +} + + +float randomFloat(float lowest_float, float highest_float) +{ + float value; + float range; + +assert (lowest_float < highest_float); + +range = highest_float - lowest_float; +value = randNum()*(highest_float - lowest_float) + lowest_float; +assert(value >= lowest_float); +assert(value <= highest_float); + +return value; + +} + +float randomNonZeroFloat(float lowest_float, float highest_float, float epsilon) +{ + + double range; + float value; + + + assert (lowest_float < 0); + assert (highest_float > 0); + assert (epsilon > 0); + assert ((epsilon < -lowest_float) && (epsilon < highest_float)); + + range = highest_float - lowest_float; + value = (randNum() * range)+lowest_float; + + if (ABS(value) < epsilon) + { + if (value > 0) value = value + epsilon; + else if (value < 0) value = value - epsilon; + + } + + assert (value >= lowest_float); + assert (value <= highest_float); + + return value; +} + +unsigned int randomUInt(int lowest_uint, int highest_uint) +{ + float range; + unsigned int value; + float temp; + + range =(float)(highest_uint - lowest_uint + 1); + temp = randNum(); + value =(unsigned int)( floor(temp * range) + lowest_uint); + + assert (value >= lowest_uint); + assert (value <= highest_uint); + + return value; +} + +unsigned int randomNonZeroUInt(int lowest_uint, int highest_uint) +{ + float range; + unsigned int value; + float temp; + + range =(float)(highest_uint - lowest_uint + 1); + value = 0; + while(value == 0){ + temp = randNum(); + + value =(unsigned int)( floor(temp * range) + lowest_uint); + } + + assert (value >= lowest_uint); + assert (value <= highest_uint); + + return value; +} + +int randInt(int lowest_uint, int highest_uint) +{ + float range; + int value; + + range = highest_uint - lowest_uint + 1; + value = (int)(floor(randNum() * range) + lowest_uint); + + assert (value >= lowest_uint); + assert (value <= highest_uint); + + return value; +} diff --git a/dis/Matrix/ver1/matrix.c b/dis/Matrix/ver1/matrix.c new file mode 100755 index 0000000..518a638 --- /dev/null +++ b/dis/Matrix/ver1/matrix.c @@ -0,0 +1,600 @@ +/* + * Sample code for the DIS Matrix Stressmark + * + * This source code is the completely correct source code based on + * the example codes provided by Atlantic Aerospace Division, Titan + * Systems Corporation, 2000. + * + * If you just compile and generate the executables from this source + * code, this code would be enough. However, if you wish to get a complete + * understanding of this stressmark, it is strongly suggested that you + * read the Benchmark Analysis and Specifications Document Version 1.0 + * before going on since the detailed comments are given in this documents. + * the comments are not repeated here. + */ + +/* + * The Sparse Matrix Storage is implemented by Compact Row Storage Scheme + * In the code, the data is first generated by randomNonzeroFloat() + * the data is first stored in a full-space matrix with size of dim*dim + * then the data is transfered to the Compact Row Matrix, + * the data value is kept in *value, + * the columns corresponding to the value are stored in *col_ind, + * the start element of each row is stored in *row_start. + */ + +/* + * Please note: + * the total number of data is numberNonzero +dim + * among which, NumberNonzero because this is symmetric matrix + * dim because the diagonal elements + */ + +#include +#include +#include +#include +#include +#include "DISstressmarkRNG.h" + +#define MIN_SEED -2147483647 +#define MAX_SEED -1 +#define MIN_DIM 1 +#define MAX_DIM 32768 +#define MAX_ITERATIONS 65536 +#define MIN_TOLERANCE 0.000007 +#define MAX_TOLERANCE 0.5 +#define MIN_NUMBER -3.4e10/dim +#define MAX_NUMBER 3.4e10/dim +#define EPSI 1.0e-10 +#define MIN_DIG_NUMBER 1.0e-10 +#define MAX_DIG_NUMBER 3.4e10 + +/* + * External variable, dimension + */ + +static int dim; + +/* + * matrix * vector + */ + +double *matrixMulvector(double *value, + int *col_ind, + int *row_start, + double *vector) +{ + int l, ll; + double *out; + double sum; + int tmp_rs, tmp_re; + + out = (double *)malloc(dim*sizeof(double)); + + for (l=0; l + */ +double *valueMulvector(double value, double *vector){ + + int l; + double *vect; + int lll; + double sum; + + vect = (double *) malloc(dim * sizeof(double )); + + for (l=0; l errorTolerance)){ + + /* + * alpha = (transpose(vectorR) * vectorR) / + * (transpose(vectorP) * (matrixA * vectorP) + */ + temp1 = matrixMulvector(value, col_ind, row_start, vectorP); + temp3 = transpose(vectorR); + temp4 = transpose(vectorP); + temp5 = vectorMul(temp4, temp1); + temp6 = vectorMul(temp3, vectorR); + alpha = temp6/temp5; + + /* + * nextVectorR = vectorR - alpha*(matrixA * vectorP) + */ + + temp7 = valueMulvector(alpha, temp1); + temp8 = vectorSub(vectorR, temp7); + nextVectorR = equalVector(temp8); + + /* + * beta = (transpose(nextVectorR) * nextVectorR) / + * (transpose(vectorR) * vectorR) + */ + temp9 = transpose(nextVectorR); + temp10 = vectorMul(temp9, nextVectorR); + temp11 = transpose(vectorR); + temp12 = vectorMul(temp11, vectorR); + beta = temp10/temp12; + + /* + * vectorX = vectorX + alpha * vectorP + */ + temp13 = valueMulvector(alpha, vectorP); + vectorX = vectorAdd(vectorX,temp13); + + /* + *vectorP = nextVectorR + beta*vectorP + */ + temp14 = valueMulvector(beta, vectorP); + temp17 = vectorAdd(nextVectorR, temp14); + + for (ll=0; ll MIN_SEED) && (seed < MAX_SEED)); + assert((dim > MIN_DIM) && (dim < MAX_DIM)); + assert((numberNonzero > dim) && (numberNonzero < dim*dim)); + assert((maxIterations > 0) && (maxIterations < MAX_ITERATIONS)); + assert((errorTolerance > MIN_TOLERANCE) && (errorTolerance < MAX_TOLERANCE)); + + matrixA = (double *)malloc(dim*dim*sizeof(double )); + vectorB = (double *)malloc(dim*sizeof(double)); + vectorX = (double *)malloc(dim*sizeof(double)); + + value = (double *)malloc((numberNonzero+dim)*sizeof(double)); + col_ind = (int *)malloc((numberNonzero+dim)*sizeof(int)); + row_start = (int *)malloc((dim+1)*sizeof(int)); + + randInit(seed); + + initMatrix(matrixA, dim, numberNonzero); + + create_CRS(matrixA, value, col_ind, row_start, dim, numberNonzero); + + initVector(vectorB, dim); + zeroVector(vectorX, dim); + printf(" after init\n"); + + beginTime = time(NULL); + + actualError = 0; + actualIteration = 0; + + biConjugateGradient(value, col_ind, row_start, vectorB, vectorX, errorTolerance, + maxIterations, + &actualError, &actualIteration, dim); + + + + endTime = time(NULL) - beginTime; + + + + sum = 0; + for (k=1; k + +#define IA 16807 +#define IM 2147483647 +#define AM (1.0/IM) +#define IQ 127773 +#define IR 2836 +#define NTAB 32 +#define NDIV (1+(IM-1)/NTAB) +#define EPS 1.2e-7 +#define RNMX (1.0-EPS) + +static long iy=0; +static long iv[NTAB]; +static long iseed; + +int ABS(int x){ + if (x>= 0) return x; + else + return (-x); +} + +int sign(int x){ + if (x >= 0) return 1; + else + return (-1); +} + +int MAX(int x, int y){ + if (x>= y) return x; + else + return y; +} + +int MIN(int x, int y){ + if (x<= y) return x; + else + return y; +} + +void randInit(long idum) +{ + long j; + long k; + + assert (idum <= 0); + assert (iy == 0); + + iseed = idum; + if (-(iseed)<1){ + iseed = 1; + } + else { + iseed = -(iseed); + } + for (j=NTAB+7; j>=0; j--){ + k = (iseed)/IQ; + iseed = IA*(iseed-k*IQ)-IR*k; + if (iseed < 0){ + iseed += IM; + } + if (j < NTAB){ + iv[j] = iseed; + } + } + iy = iv[0]; +} + +float randNum() +{ + long j; + long k; + float temp; + + assert (iy != 0); + + k = (iseed)/IQ; + iseed = IA*(iseed-k*IQ)-IR*k; + + if (iseed < 0){ + iseed += IM; + } + j = iy/NDIV; + iy = iv[j]; + iv[j] = iseed; + + temp = AM * iy; + + if (temp > RNMX){ + return RNMX; + } + else { + return temp; + } +} + + +float randomFloat(float lowest_float, float highest_float) +{ + float value; + float range; + +assert (lowest_float < highest_float); + +range = highest_float - lowest_float; +value = randNum()*(highest_float - lowest_float) + lowest_float; +assert(value >= lowest_float); +assert(value <= highest_float); + +return value; + +} + +float randomNonZeroFloat(float lowest_float, float highest_float, float epsilon) +{ + + double range; + float value; + + + assert (lowest_float < 0); + assert (highest_float > 0); + assert (epsilon > 0); + assert ((epsilon < -lowest_float) && (epsilon < highest_float)); + + range = highest_float - lowest_float; + value = (randNum() * range)+lowest_float; + + if (ABS(value) < epsilon) + { + if (value > 0) value = value + epsilon; + else if (value < 0) value = value - epsilon; + + } + + assert (value >= lowest_float); + assert (value <= highest_float); + + return value; +} + +unsigned int randomUInt(int lowest_uint, int highest_uint) +{ + float range; + unsigned int value; + float temp; + + range =(float)(highest_uint - lowest_uint + 1); + temp = randNum(); + value =(unsigned int)( floor(temp * range) + lowest_uint); + + assert (value >= lowest_uint); + assert (value <= highest_uint); + + return value; +} + +unsigned int randomNonZeroUInt(int lowest_uint, int highest_uint) +{ + float range; + unsigned int value; + float temp; + + range =(float)(highest_uint - lowest_uint + 1); + value = 0; + while(value == 0){ + temp = randNum(); + + value =(unsigned int)( floor(temp * range) + lowest_uint); + } + + assert (value >= lowest_uint); + assert (value <= highest_uint); + + return value; +} + +int randInt(int lowest_uint, int highest_uint) +{ + float range; + int value; + + range = highest_uint - lowest_uint + 1; + value = (int)(floor(randNum() * range) + lowest_uint); + + assert (value >= lowest_uint); + assert (value <= highest_uint); + + return value; +} diff --git a/dis/Matrix/ver2/matrix.c b/dis/Matrix/ver2/matrix.c new file mode 100755 index 0000000..957d7c5 --- /dev/null +++ b/dis/Matrix/ver2/matrix.c @@ -0,0 +1,594 @@ +/* Please note: + * This code is the optimized version of the first version of Matrix + * Stressmark. It uses less temporary vectors and vsariables, thus reduce + * memory allocation/deallocation overhead. the simulation is faster + */ +/* + * Sample code for the DIS Matrix Stressmark + * + * This source code is the completely correct source code based on + * the example codes provided by Atlantic Aerospace Division, Titan + * Systems Corporation, 2000. + * + * If you just compile and generate the executables from this source + * code, this code would be enough. However, if you wish to get a complete + * understanding of this stressmark, it is strongly suggested that you + * read the Benchmark Analysis and Specifications Document Version 1.0 + * before going on since the detailed comments are given in this documents. + * the comments are not repeated here. + */ + +/* + * The Sparse Matrix Storage is implemented by Compact Row Storage Scheme + * In the code, the data is first generated by randomNonzeroFloat() + * the data is first stored in a full-space matrix with size of dim*dim + * then the data is transfered to the Compact Row Matrix, + * the data value is kept in *value, + * the columns corresponding to the value are stored in *col_ind, + * the start element of each row is stored in *row_start. + */ + +/* + * Please note: + * the total number of data is numberNonzero +dim + * among which, NumberNonzero because this is symmetric matrix + * dim because the diagonal elements + */ + +#include +#include +#include +#include +#include +#include "DISstressmarkRNG.h" +#include "extra.h" + +#define MIN_SEED -2147483647 +#define MAX_SEED -1 +#define MIN_DIM 1 +#define MAX_DIM 32768 +#define MAX_ITERATIONS 65536 +#define MIN_TOLERANCE 0.000007 +#define MAX_TOLERANCE 0.5 +#define MIN_NUMBER -3.4e10/dim +#define MAX_NUMBER 3.4e10/dim +#define EPSI 1.0e-10 +#define MIN_DIG_NUMBER 1.0e-10 +#define MAX_DIG_NUMBER 3.4e10 + +/* + * External variable, dimension + */ + +static int dim; +int argc; +char** argv; + +/* + * matrix * vector + */ + +void matrixMulvector(double *value, + int *col_ind, + int *row_start, + double *vector, + double *out) +{ + int l, ll; + double sum; + int tmp_rs, tmp_re; + + for (l=0; l + */ +void valueMulvector(double value, double *vector, double *vect){ + + int l; + int lll, i; + double tmp; + + for (l=0; l errorTolerance)){ + START_LOOP + + /* + * alpha = (transpose(vectorR) * vectorR) / + * (transpose(vectorP) * (matrixA * vectorP) + */ + + matrixMulvector(value, col_ind, row_start, vectorP, tmpVector1); + transpose(vectorR, tmpVector2); + transpose(vectorP, tmpVector3); + tmpValue1 = vectorMul(tmpVector3, tmpVector1); + tmpValue2 = vectorMul(tmpVector2, vectorR); + alpha = tmpValue2/tmpValue1; + + /* + * nextVectorR = vectorR - alpha*(matrixA * vectorP) + */ + + valueMulvector(alpha, tmpVector1, tmpVector2); + vectorSub(vectorR, tmpVector2, tmpVector1); + equalVector(tmpVector1, nextVectorR); + + /* + * beta = (transpose(nextVectorR) * nextVectorR) / + * (transpose(vectorR) * vectorR) + */ + + transpose(nextVectorR, tmpVector3); + tmpValue1 = vectorMul(tmpVector3, nextVectorR); + transpose(vectorR, tmpVector2); + tmpValue2 = vectorMul(tmpVector2, vectorR); + beta = tmpValue1/tmpValue2; + + /* + * vectorX = vectorX + alpha * vectorP + */ + valueMulvector(alpha, vectorP, tmpVector1); + vectorAdd(vectorX,tmpVector1, vectorX); + + /* + *vectorP = nextVectorR + beta*vectorP + */ + valueMulvector(beta, vectorP, tmpVector1); + vectorAdd(nextVectorR, tmpVector1, tmpVector1); + + for (ll=0; ll MIN_SEED) && (seed < MAX_SEED)); + assert((dim > MIN_DIM) && (dim < MAX_DIM)); + assert((numberNonzero > dim) && (numberNonzero < dim*dim)); + assert((maxIterations > 0) && (maxIterations < MAX_ITERATIONS)); + assert((errorTolerance > MIN_TOLERANCE) && (errorTolerance < MAX_TOLERANCE)); + + matrixA = (double *)malloc(dim*dim*sizeof(double )); + vectorB = (double *)malloc(dim*sizeof(double)); + vectorX = (double *)malloc(dim*sizeof(double)); + + value = (double *)malloc((numberNonzero+dim)*sizeof(double)); + col_ind = (int *)malloc((numberNonzero+dim)*sizeof(int)); + row_start = (int *)malloc((dim+1)*sizeof(int)); + + randInit(seed); + + initMatrix(matrixA, dim, numberNonzero); + + create_CRS(matrixA, value, col_ind, row_start, dim, numberNonzero); + + initVector(vectorB, dim); + zeroVector(vectorX, dim); + printf(" after init\n"); + + beginTime = time(NULL); + + actualError = 0; + actualIteration = 0; + + biConjugateGradient(value, col_ind, row_start, vectorB, vectorX, errorTolerance, + maxIterations, + &actualError, &actualIteration, dim); + + + + endTime = time(NULL) - beginTime; + + + + sum = 0; + for (k=1; k