Actual source code: performance.c

petsc-3.13.6 2020-09-29
Report Typos and Errors
  1: static char help[] = "Time vector operations on GPU\n";
  2: /* This program produces the results for Argonne Technical Report ANL-19/41.
  3:    The technical report and resources for generating data can be found in the
  4:    repository:  https://gitlab.com/hannah_mairs/summit-performance */

  6:  #include <petscvec.h>

  8: int main(int argc, char **argv)
  9: {
 11:   Vec            v,w,x;
 12:   PetscInt       n=15;
 13:   PetscScalar    val;
 14:   PetscReal      norm1,norm2;
 15:   PetscRandom    rctx;
 16:   PetscLogStage  stage;

 18:   PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
 19:   PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);
 20:   PetscRandomCreate(PETSC_COMM_WORLD,&rctx);
 21:   PetscRandomSetFromOptions(rctx);
 22:   VecCreate(PETSC_COMM_WORLD,&v);
 23:   VecSetSizes(v,PETSC_DECIDE,n);  
 24:   VecSetFromOptions(v);
 25:   VecDuplicate(v,&w);
 26:   VecSetRandom(v,rctx);
 27:   VecSetRandom(w,rctx); 

 29:   /* create dummy vector to clear cache */
 30:   VecCreate(PETSC_COMM_WORLD,&x);
 31:   VecSetSizes(x,PETSC_DECIDE,10000000);
 32:   VecSetFromOptions(x);
 33:   VecSetRandom(x,rctx);

 35:   /* send v to GPU */
 36:   PetscBarrier(NULL);
 37:   VecNorm(v,NORM_1,&norm1);

 39:   /* register a stage work on GPU */
 40:   PetscLogStageRegister("Work on GPU", &stage);
 41:   PetscLogStagePush(stage);
 42:   VecNorm(w,NORM_1,&norm1); /* send w to GPU */
 43:   VecNorm(x,NORM_1,&norm1); /* clear cache */
 44:   PetscBarrier(NULL); 
 45:   VecAXPY(w,1.0,v);
 46:   VecNorm(x,NORM_INFINITY,&norm1); 
 47:   PetscBarrier(NULL);
 48:   VecDot(w,v,&val); 
 49:   VecNorm(x,NORM_1,&norm1);
 50:   PetscBarrier(NULL);
 51:   VecSet(v,0.0);
 52:   VecNorm(x,NORM_2,&norm2); 
 53:   PetscBarrier(NULL);
 54:   VecCopy(v,w);
 55:   PetscLogStagePop();

 57:   PetscPrintf(PETSC_COMM_WORLD,"Test completed successfully!\n");
 58:   VecDestroy(&v);
 59:   VecDestroy(&w);
 60:   VecDestroy(&x);
 61:   PetscRandomDestroy(&rctx);
 62:   PetscFinalize();
 63:   return ierr;
 64: }

 66: /*TEST

 68:    test:
 69:       suffix: cuda
 70:       nsize: 2
 71:       args: -vec_type mpicuda
 72:       requires: cuda

 74: TEST*/