Actual source code: performance.c

      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: {
     10:   Vec            v,w,x;
     11:   PetscInt       n=15;
     12:   PetscScalar    val;
     13:   PetscReal      norm1,norm2;
     14:   PetscRandom    rctx;
     15: #if defined(PETSC_USE_LOG)
     16:   PetscLogStage  stage;
     17: #endif

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

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

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

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

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

     67: /*TEST

     69:    testset:
     70:       nsize: 2
     71:       output_file: output/performance_cuda.out

     73:       test:
     74:         suffix: cuda
     75:         args: -vec_type mpicuda
     76:         requires: cuda

     78:       test:
     79:         suffix: hip
     80:         args: -vec_type mpihip
     81:         requires: hip

     83: TEST*/