diff options
| author | Joshua Bakita <jbakita@cs.unc.edu> | 2020-10-17 14:43:46 -0400 |
|---|---|---|
| committer | Joshua Bakita <jbakita@cs.unc.edu> | 2020-10-17 14:43:46 -0400 |
| commit | a3886552003d031acb9039e920b7c9ddce946ad6 (patch) | |
| tree | c3b6a400a9ba31e744e6218365d63bdfbbc45a83 /dis/Matrix/ver2 | |
| parent | 917499f6257ac51c05e8302af877d56a22f28cb5 (diff) | |
DIS fixes used for (rejected) RTSS'20 submission
- All: Output times to stderr and nothing to stdout
- Field, Update, Pointer: change definition of a job to match other
stressmark execution times more closely
- Matrix: move all allocations into main()
- Update: Use volatile to prevent computations from being optimized out
- Transitive: Use volatile to prevent computations from being optimized out
- Neighborhood: Use working version of drawLineSegment from original DIS
sample code
Diffstat (limited to 'dis/Matrix/ver2')
| -rwxr-xr-x | dis/Matrix/ver2/matrix.c | 79 |
1 files changed, 38 insertions, 41 deletions
diff --git a/dis/Matrix/ver2/matrix.c b/dis/Matrix/ver2/matrix.c index 957d7c5..ffa7cb7 100755 --- a/dis/Matrix/ver2/matrix.c +++ b/dis/Matrix/ver2/matrix.c | |||
| @@ -48,7 +48,7 @@ | |||
| 48 | #define MIN_DIM 1 | 48 | #define MIN_DIM 1 |
| 49 | #define MAX_DIM 32768 | 49 | #define MAX_DIM 32768 |
| 50 | #define MAX_ITERATIONS 65536 | 50 | #define MAX_ITERATIONS 65536 |
| 51 | #define MIN_TOLERANCE 0.000007 | 51 | #define MIN_TOLERANCE 1e-7//0.000007 |
| 52 | #define MAX_TOLERANCE 0.5 | 52 | #define MAX_TOLERANCE 0.5 |
| 53 | #define MIN_NUMBER -3.4e10/dim | 53 | #define MIN_NUMBER -3.4e10/dim |
| 54 | #define MAX_NUMBER 3.4e10/dim | 54 | #define MAX_NUMBER 3.4e10/dim |
| @@ -61,8 +61,6 @@ | |||
| 61 | */ | 61 | */ |
| 62 | 62 | ||
| 63 | static int dim; | 63 | static int dim; |
| 64 | int argc; | ||
| 65 | char** argv; | ||
| 66 | 64 | ||
| 67 | /* | 65 | /* |
| 68 | * matrix * vector | 66 | * matrix * vector |
| @@ -312,7 +310,14 @@ void biConjugateGradient(double *value, | |||
| 312 | int maxIterations, | 310 | int maxIterations, |
| 313 | double *actualError, | 311 | double *actualError, |
| 314 | int *actualIteration, | 312 | int *actualIteration, |
| 315 | int dim) | 313 | int dim, |
| 314 | // Start internal matrixes | ||
| 315 | double *vectorP, | ||
| 316 | double *vectorR, | ||
| 317 | double *nextVectorR, | ||
| 318 | double *tmpVector1, | ||
| 319 | double *tmpVector2, | ||
| 320 | double *tmpVector3) | ||
| 316 | /* | 321 | /* |
| 317 | * in the code, we use a lot of temparary vectors and variables | 322 | * in the code, we use a lot of temparary vectors and variables |
| 318 | * this is just for simple and clear | 323 | * this is just for simple and clear |
| @@ -321,31 +326,18 @@ void biConjugateGradient(double *value, | |||
| 321 | * | 326 | * |
| 322 | */ | 327 | */ |
| 323 | { | 328 | { |
| 324 | double *vectorR; | ||
| 325 | double *vectorP, *matrixAvectorP, *nextVectorR; | ||
| 326 | double error; | 329 | double error; |
| 327 | int iteration; | 330 | int iteration; |
| 328 | double alpha, beta; | 331 | double alpha, beta; |
| 329 | 332 | ||
| 330 | double *tmpVector1, *tmpVector2, *tmpVector3; | ||
| 331 | double tmpValue1, tmpValue2; | 333 | double tmpValue1, tmpValue2; |
| 332 | int i; | 334 | int i; |
| 333 | int l; | 335 | int l; |
| 334 | int ll; | 336 | int ll; |
| 335 | SET_UP | ||
| 336 | 337 | ||
| 337 | alpha = 0; | 338 | alpha = 0; |
| 338 | beta = 0; | 339 | beta = 0; |
| 339 | 340 | ||
| 340 | vectorP = (double *)malloc(dim*sizeof(double)); | ||
| 341 | vectorR = (double *)malloc(dim*sizeof(double)); | ||
| 342 | nextVectorR = (double *)malloc(dim*sizeof(double)); | ||
| 343 | vectorX = (double *)malloc(dim*sizeof(double)); | ||
| 344 | |||
| 345 | tmpVector1 = (double *)malloc(dim*sizeof(double)); | ||
| 346 | tmpVector2 = (double *)malloc(dim*sizeof(double)); | ||
| 347 | tmpVector3 = (double *)malloc(dim*sizeof(double)); | ||
| 348 | |||
| 349 | /* | 341 | /* |
| 350 | * vectorR = vectorB - matrixA*vectorX | 342 | * vectorR = vectorB - matrixA*vectorX |
| 351 | */ | 343 | */ |
| @@ -369,7 +361,6 @@ void biConjugateGradient(double *value, | |||
| 369 | iteration = 0; | 361 | iteration = 0; |
| 370 | 362 | ||
| 371 | while ((iteration < maxIterations) && (error > errorTolerance)){ | 363 | while ((iteration < maxIterations) && (error > errorTolerance)){ |
| 372 | START_LOOP | ||
| 373 | 364 | ||
| 374 | /* | 365 | /* |
| 375 | * alpha = (transpose(vectorR) * vectorR) / | 366 | * alpha = (transpose(vectorR) * vectorR) / |
| @@ -434,7 +425,6 @@ void biConjugateGradient(double *value, | |||
| 434 | error = vectorValue(tmpVector1)/vectorValue(vectorB); | 425 | error = vectorValue(tmpVector1)/vectorValue(vectorB); |
| 435 | 426 | ||
| 436 | iteration++; | 427 | iteration++; |
| 437 | STOP_LOOP | ||
| 438 | } | 428 | } |
| 439 | 429 | ||
| 440 | *actualError = error; | 430 | *actualError = error; |
| @@ -446,7 +436,6 @@ void biConjugateGradient(double *value, | |||
| 446 | 436 | ||
| 447 | free(vectorR); | 437 | free(vectorR); |
| 448 | free(vectorP); | 438 | free(vectorP); |
| 449 | WRITE_TO_FILE | ||
| 450 | 439 | ||
| 451 | return; | 440 | return; |
| 452 | } | 441 | } |
| @@ -515,10 +504,8 @@ void create_CRS(double *matrixA, | |||
| 515 | } | 504 | } |
| 516 | 505 | ||
| 517 | 506 | ||
| 518 | int main(int _argc, char** _argv) | 507 | int main(int argc, char** argv) |
| 519 | { | 508 | { |
| 520 | argc = _argc; | ||
| 521 | argv = _argv; | ||
| 522 | int seed; | 509 | int seed; |
| 523 | int numberNonzero; | 510 | int numberNonzero; |
| 524 | int maxIterations; | 511 | int maxIterations; |
| @@ -536,18 +523,22 @@ int main(int _argc, char** _argv) | |||
| 536 | double *value; | 523 | double *value; |
| 537 | int *col_ind; | 524 | int *col_ind; |
| 538 | int *row_start; | 525 | int *row_start; |
| 539 | int sum; | 526 | double sum; |
| 540 | int k; | 527 | int k; |
| 528 | // Internal vects for biConj | ||
| 529 | double *vectorR, *vectorP, *nextVectorR; | ||
| 530 | double *tmpVector1, *tmpVector2, *tmpVector3; | ||
| 531 | SET_UP | ||
| 541 | 532 | ||
| 542 | fscanf(stdin, "%d %d %d %d %f", | 533 | assert(fscanf(stdin, "%d %d %d %d %f", |
| 543 | &seed, &dim, &numberNonzero,&maxIterations,&errorTolerance); | 534 | &seed, &dim, &numberNonzero,&maxIterations,&errorTolerance) == 5); |
| 544 | assert((seed > MIN_SEED) && (seed < MAX_SEED)); | 535 | assert((seed > MIN_SEED) && (seed < MAX_SEED)); |
| 545 | assert((dim > MIN_DIM) && (dim < MAX_DIM)); | 536 | assert((dim > MIN_DIM) && (dim < MAX_DIM)); |
| 546 | assert((numberNonzero > dim) && (numberNonzero < dim*dim)); | 537 | assert((numberNonzero > dim) && (numberNonzero < dim*dim)); |
| 547 | assert((maxIterations > 0) && (maxIterations < MAX_ITERATIONS)); | 538 | assert((maxIterations > 0) && (maxIterations < MAX_ITERATIONS)); |
| 548 | assert((errorTolerance > MIN_TOLERANCE) && (errorTolerance < MAX_TOLERANCE)); | 539 | assert((errorTolerance > MIN_TOLERANCE) && (errorTolerance < MAX_TOLERANCE)); |
| 549 | 540 | ||
| 550 | matrixA = (double *)malloc(dim*dim*sizeof(double )); | 541 | matrixA = (double *)malloc(dim*dim*sizeof(double)); |
| 551 | vectorB = (double *)malloc(dim*sizeof(double)); | 542 | vectorB = (double *)malloc(dim*sizeof(double)); |
| 552 | vectorX = (double *)malloc(dim*sizeof(double)); | 543 | vectorX = (double *)malloc(dim*sizeof(double)); |
| 553 | 544 | ||
| @@ -555,40 +546,46 @@ int main(int _argc, char** _argv) | |||
| 555 | col_ind = (int *)malloc((numberNonzero+dim)*sizeof(int)); | 546 | col_ind = (int *)malloc((numberNonzero+dim)*sizeof(int)); |
| 556 | row_start = (int *)malloc((dim+1)*sizeof(int)); | 547 | row_start = (int *)malloc((dim+1)*sizeof(int)); |
| 557 | 548 | ||
| 549 | // Internal matricies for biConj | ||
| 550 | vectorP = (double *)malloc(dim*sizeof(double)); | ||
| 551 | vectorR = (double *)malloc(dim*sizeof(double)); | ||
| 552 | nextVectorR = (double *)malloc(dim*sizeof(double)); | ||
| 553 | tmpVector1 = (double *)malloc(dim*sizeof(double)); | ||
| 554 | tmpVector2 = (double *)malloc(dim*sizeof(double)); | ||
| 555 | tmpVector3 = (double *)malloc(dim*sizeof(double)); | ||
| 556 | |||
| 558 | randInit(seed); | 557 | randInit(seed); |
| 559 | 558 | ||
| 559 | START_LOOP | ||
| 560 | initMatrix(matrixA, dim, numberNonzero); | 560 | initMatrix(matrixA, dim, numberNonzero); |
| 561 | 561 | ||
| 562 | create_CRS(matrixA, value, col_ind, row_start, dim, numberNonzero); | 562 | create_CRS(matrixA, value, col_ind, row_start, dim, numberNonzero); |
| 563 | 563 | ||
| 564 | initVector(vectorB, dim); | 564 | initVector(vectorB, dim); |
| 565 | zeroVector(vectorX, dim); | 565 | zeroVector(vectorX, dim); |
| 566 | printf(" after init\n"); | ||
| 567 | 566 | ||
| 568 | beginTime = time(NULL); | 567 | beginTime = time(NULL); |
| 569 | 568 | ||
| 570 | actualError = 0; | 569 | actualError = 0; |
| 571 | actualIteration = 0; | 570 | actualIteration = 0; |
| 572 | 571 | ||
| 573 | biConjugateGradient(value, col_ind, row_start, vectorB, vectorX, errorTolerance, | 572 | biConjugateGradient(value, col_ind, row_start, vectorB, vectorX, errorTolerance, |
| 574 | maxIterations, | 573 | maxIterations, |
| 575 | &actualError, &actualIteration, dim); | ||
