Actual source code: version.c

  1: #include <petsc/private/petscimpl.h>

  3: /*@C
  4:   PetscGetVersion - Gets the PETSc version information in a string.

  6:   Not Collective; No Fortran Support

  8:   Input Parameter:
  9: . len - length of the string

 11:   Output Parameter:
 12: . version - version string

 14:   Level: developer

 16:   Note:
 17:   For doing runtime checking of supported versions we recommend using `PetscGetVersionNumber()` instead of this routine.

 19: .seealso: `PetscGetProgramName()`, `PetscGetVersionNumber()`
 20: @*/
 21: PetscErrorCode PetscGetVersion(char version[], size_t len)
 22: {
 23:   PetscFunctionBegin;
 24: #if (PETSC_VERSION_RELEASE == 1)
 25:   PetscCall(PetscSNPrintf(version, len, "Petsc Release Version %d.%d.%d, %s ", PETSC_VERSION_MAJOR, PETSC_VERSION_MINOR, PETSC_VERSION_SUBMINOR, PETSC_VERSION_DATE));
 26: #else
 27:   PetscCall(PetscSNPrintf(version, len, "Petsc Development GIT revision: %s  GIT Date: %s", PETSC_VERSION_GIT, PETSC_VERSION_DATE_GIT));
 28: #endif
 29:   PetscFunctionReturn(PETSC_SUCCESS);
 30: }

 32: /*@C
 33:   PetscGetVersionNumber - Gets the PETSc version information from the library

 35:   Not Collective

 37:   Output Parameters:
 38: + major    - the major version (optional, pass `NULL` if not requested)
 39: . minor    - the minor version (optional, pass `NULL` if not requested)
 40: . subminor - the subminor version (patch number)  (optional, pass `NULL` if not requested)
 41: - release  - indicates the library is from a release, not random git repository  (optional, pass `NULL` if not requested)

 43:   Level: developer

 45:   Notes:
 46:   The C macros `PETSC_VERSION_MAJOR`, `PETSC_VERSION_MINOR`, `PETSC_VERSION_SUBMINOR`, `PETSC_VERSION_RELEASE` provide the information at
 47:   compile time. This can be used to confirm that the shared library being loaded at runtime has the appropriate version updates.

 49:   This function can be called before `PetscInitialize()`

 51: .seealso: `PetscGetProgramName()`, `PetscGetVersion()`, `PetscInitialize()`
 52: @*/
 53: PetscErrorCode PetscGetVersionNumber(PetscInt *major, PetscInt *minor, PetscInt *subminor, PetscInt *release)
 54: {
 55:   if (major) *major = PETSC_VERSION_MAJOR;
 56:   if (minor) *minor = PETSC_VERSION_MINOR;
 57:   if (subminor) *subminor = PETSC_VERSION_SUBMINOR;
 58:   if (release) *release = PETSC_VERSION_RELEASE;
 59:   return PETSC_SUCCESS;
 60: }
 61: #if defined(PETSC_HAVE_BLI_THREAD_SET_NUM_THREADS)
 62: EXTERN_C_BEGIN
 63: void bli_thread_set_num_threads(int);
 64: EXTERN_C_END
 65: #elif defined(PETSC_HAVE_MKL_SET_NUM_THREADS)
 66:   #include <mkl.h>
 67: #elif defined(PETSC_HAVE_OPENBLAS_SET_NUM_THREADS)
 68: EXTERN_C_BEGIN
 69: void openblas_set_num_threads(int);
 70: EXTERN_C_END
 71: #endif
 72: PetscInt PetscNumBLASThreads = 1;

 74: /*@
 75:   PetscBLASSetNumThreads - set the number of threads for calls to BLAS to use

 77:   Input Parameter:
 78: . nt - the number of threads

 80:   Options Database Key:
 81: . -blas_num_threads <nt> - set the number of threads when PETSc is initialized

 83:   Level: intermediate

 85:   Notes:
 86:   The environmental variables `BLIS_NUM_THREADS`, `MKL_NUM_THREADS`, or `OPENBLAS_NUM_THREADS`, `OMP_NUM_THREADS`
 87:   may also affect the number of threads used depending on the BLAS libraries being used. A call to this function
 88:   overwrites those values.

 90:   With the BLIS BLAS implementation one can use `BLIS_THREAD_IMPL=pthread` or `BLIS_THREAD_IMPL=openmp` to determine how
 91:   BLIS implements the parallelism.

 93: .seealso: `PetscInitialize()`, `PetscBLASGetNumThreads()`
 94: @*/
 95: PetscErrorCode PetscBLASSetNumThreads(PetscInt nt)
 96: {
 97:   PetscFunctionBegin;
 98:   PetscNumBLASThreads = nt;
 99: #if defined(PETSC_HAVE_BLI_THREAD_SET_NUM_THREADS)
100:   bli_thread_set_num_threads(nt);
101:   PetscCall(PetscInfo(NULL, "Setting number of threads used for BLIS provided BLAS %" PetscInt_FMT "\n", PetscNumBLASThreads));
102: #elif defined(PETSC_HAVE_MKL_SET_NUM_THREADS)
103:   mkl_set_num_threads((int)nt);
104:   PetscCall(PetscInfo(NULL, "Setting number of threads used for MKL provided BLAS %" PetscInt_FMT "\n", PetscNumBLASThreads));
105: #elif defined(PETSC_HAVE_OPENBLAS_SET_NUM_THREADS)
106:   openblas_set_num_threads((int)nt);
107:   PetscCall(PetscInfo(NULL, "Setting number of threads used for OpenBLAS provided BLAS %" PetscInt_FMT "\n", PetscNumBLASThreads));
108: #else
109:   PetscCall(PetscInfo(NULL, "Cannot set number of threads used for BLAS %" PetscInt_FMT ", will be ignored\n", PetscNumBLASThreads));
110: #endif
111:   PetscFunctionReturn(PETSC_SUCCESS);
112: }

114: /*@
115:   PetscBLASGetNumThreads - get the number of threads for calls to BLAS to use

117:   Output Parameter:
118: . nt - the number of threads

120:   Level: intermediate

122: .seealso: `PetscInitialize()`, `PetscBLASSetNumThreads()`
123: @*/
124: PetscErrorCode PetscBLASGetNumThreads(PetscInt *nt)
125: {
126:   PetscFunctionBegin;
127:   PetscAssertPointer(nt, 1);
128:   *nt = PetscNumBLASThreads;
129:   PetscFunctionReturn(PETSC_SUCCESS);
130: }