Actual source code: handle.c

petsc-3.13.6 2020-09-29
Report Typos and Errors
  1: /*
  2:  Management of CUBLAS and CUSOLVER handles
  3:  */

  5:  #include <petscsys.h>
  6:  #include <petsc/private/petscimpl.h>
  7:  #include <petsccublas.h>

  9: static cublasHandle_t     cublasv2handle   = NULL;
 10: static cusolverDnHandle_t cusolverdnhandle = NULL;

 12: /*
 13:    Destroys the CUBLAS handle.
 14:    This function is intended and registered for PetscFinalize - do not call manually!
 15:  */
 16: static PetscErrorCode PetscCUBLASDestroyHandle()
 17: {
 18:   cublasStatus_t cberr;

 21:   if (cublasv2handle) {
 22:     cberr          = cublasDestroy(cublasv2handle);CHKERRCUBLAS(cberr);
 23:     cublasv2handle = NULL;  /* Ensures proper reinitialization */
 24:   }
 25:   return(0);
 26: }

 28: /*
 29:     Initializing the cuBLAS handle can take 1/2 a second therefore
 30:     initialize in PetscInitialize() before being timing so it does
 31:     not distort the -log_view information
 32: */
 33: PetscErrorCode PetscCUBLASInitializeHandle(void)
 34: {
 36:   cublasStatus_t cberr;

 39:   if (!cublasv2handle) {
 40:     cberr = cublasCreate(&cublasv2handle);CHKERRCUBLAS(cberr);
 41:     /* Make sure that the handle will be destroyed properly */
 42:     PetscRegisterFinalize(PetscCUBLASDestroyHandle);
 43:   }
 44:   return(0);
 45: }

 47: PetscErrorCode PetscCUBLASGetHandle(cublasHandle_t *handle)
 48: {

 53:   if (!cublasv2handle) {PetscCUBLASInitializeHandle();}
 54:   *handle = cublasv2handle;
 55:   return(0);
 56: }

 58: /* cusolver */
 59: static PetscErrorCode PetscCUSOLVERDnDestroyHandle()
 60: {
 61:   cusolverStatus_t  cerr;

 64:   if (cusolverdnhandle) {
 65:     cerr             = cusolverDnDestroy(cusolverdnhandle);CHKERRCUSOLVER(cerr);
 66:     cusolverdnhandle = NULL;  /* Ensures proper reinitialization */
 67:   }
 68:   return(0);
 69: }

 71: PetscErrorCode PetscCUSOLVERDnInitializeHandle(void)
 72: {
 73:   PetscErrorCode    ierr;
 74:   cusolverStatus_t  cerr;

 77:   if (!cusolverdnhandle) {
 78:     cerr = cusolverDnCreate(&cusolverdnhandle);CHKERRCUSOLVER(cerr);
 79:     PetscRegisterFinalize(PetscCUSOLVERDnDestroyHandle);
 80:   }
 81:   return(0);
 82: }

 84: PetscErrorCode PetscCUSOLVERDnGetHandle(cusolverDnHandle_t *handle)
 85: {
 86:   PetscErrorCode     ierr;

 90:   if (!cusolverdnhandle) {PetscCUSOLVERDnInitializeHandle();}
 91:   *handle = cusolverdnhandle;
 92:   return(0);
 93: }