Actual source code: ex2cu.cu

  1: static char help[] = "Benchmarking cudaPointerGetAttributes() time\n";
  2: /*
  3:   Running example on Summit at OLCF:
  4:   # run with total 1 resource set (RS) (-n1), 1 RS per node (-r1), 1 MPI rank (-a1), 7 cores (-c7) and 1 GPU (-g1) per RS
  5:   $ jsrun -n1 -a1 -c7 -g1 -r1  ./ex2cu
  6:     Average cudaPointerGetAttributes() time = 0.29 microseconds
  7: */
  8: #include <petscsys.h>
  9: #include <petscdevice.h>

 11: int main(int argc,char **argv)
 12: {
 13:   PetscInt                     i,n=2000;
 14:   cudaError_t                  cerr;
 15:   PetscScalar                  **ptrs;
 16:   PetscLogDouble               tstart,tend,time;
 17:   struct cudaPointerAttributes attr;

 19:   PetscInitialize(&argc,&argv,(char*)0,help);
 20:   PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);

 22:   PetscMalloc1(n,&ptrs);
 23:   for (i=0; i<n; i++) {
 24:     if (i%2) PetscMalloc1(i+16,&ptrs[i]);
 25:     else cudaMalloc((void**)&ptrs[i],(i+16)*sizeof(PetscScalar));
 26:   }

 28:   PetscTime(&tstart);
 29:   for (i=0; i<n; i++) {
 30:     cerr = cudaPointerGetAttributes(&attr,ptrs[i]);
 31:     if (cerr) cudaGetLastError();
 32:   }
 33:   PetscTime(&tend);
 34:   time = (tend-tstart)*1e6/n;

 36:   PetscPrintf(PETSC_COMM_WORLD,"Average cudaPointerGetAttributes() time = %.2f microseconds\n",time);

 38:   for (i=0; i<n; i++) {
 39:     if (i%2) PetscFree(ptrs[i]);
 40:     else cudaFree(ptrs[i]);
 41:   }
 42:   PetscFree(ptrs);

 44:   PetscFinalize();
 45:   return 0;
 46: }

 48: /*TEST
 49:   build:
 50:     requires: cuda

 52:   test:
 53:     requires: cuda
 54:     args: -n 2
 55:     output_file: output/empty.out
 56:     filter: grep "DOES_NOT_EXIST"

 58: TEST*/