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: /*@
     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: }