1e5c89e4eSSatish Balay /* 2e5c89e4eSSatish Balay 3e5c89e4eSSatish Balay This file defines part of the initialization of PETSc 4e5c89e4eSSatish Balay 5540e20f2SPierre Jolivet This file uses regular malloc and free because it cannot be known 6e5c89e4eSSatish Balay what malloc is being used until it has already processed the input. 7e5c89e4eSSatish Balay */ 8ef386f4bSSatish Balay 9ef386f4bSSatish Balay #include <petscsys.h> /*I "petscsys.h" I*/ 10f67a399dSBarry Smith #include <petsc/private/petscimpl.h> 11665c2dedSJed Brown #include <petscviewer.h> 12fdc842d1SBarry Smith #if defined(PETSC_USE_LOG) 13fdc842d1SBarry Smith PETSC_INTERN PetscErrorCode PetscLogInitialize(void); 14fdc842d1SBarry Smith #endif 15ef386f4bSSatish Balay 16ba61063dSBarry Smith #if defined(PETSC_HAVE_SYS_SYSINFO_H) 1751d315f7SKerry Stevens #include <sys/sysinfo.h> 18ba61063dSBarry Smith #endif 19121deb67SSatish Balay #if defined(PETSC_HAVE_UNISTD_H) 2051d315f7SKerry Stevens #include <unistd.h> 21121deb67SSatish Balay #endif 2205035670SJunchao Zhang 23d9b72601SDominic Meiser #if defined(PETSC_HAVE_CUDA) 24d9b72601SDominic Meiser #include <cuda_runtime.h> 2523622779SBarry Smith #include <cuda_runtime_api.h> 2623622779SBarry Smith #include <cuda_device_runtime_api.h> 277fd2f626SJose E. Roman #include <petsccublas.h> 2805035670SJunchao Zhang #endif 2905035670SJunchao Zhang 3005035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 3105035670SJunchao Zhang #include <hip/hip_runtime.h> 3205035670SJunchao Zhang #endif 3305035670SJunchao Zhang 3405035670SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 35c2a741eeSJunchao Zhang #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION) 36c2a741eeSJunchao Zhang #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */ 37c2a741eeSJunchao Zhang #endif 38d9b72601SDominic Meiser #endif 39555d055bSBarry Smith 40f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL) 41f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit(); 42f0a7718cSKarl Rupp #endif 43f0a7718cSKarl Rupp 44e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/ 45e5c89e4eSSatish Balay /* 46e5c89e4eSSatish Balay Indicates if PETSc started up MPI, or it was 47e5c89e4eSSatish Balay already started before PETSc was initialized. 48e5c89e4eSSatish Balay */ 490cbf60d0SJose E. Roman PetscBool PetscBeganMPI = PETSC_FALSE; 508ad20175SVaclav Hapla PetscBool PetscErrorHandlingInitialized = PETSC_FALSE; 510cbf60d0SJose E. Roman PetscBool PetscInitializeCalled = PETSC_FALSE; 520cbf60d0SJose E. Roman PetscBool PetscFinalizeCalled = PETSC_FALSE; 53d6f2c3cbSBarry Smith 547087cfbeSBarry Smith PetscMPIInt PetscGlobalRank = -1; 557087cfbeSBarry Smith PetscMPIInt PetscGlobalSize = -1; 56ba61063dSBarry Smith 57c2b86a48SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS) 58c2b86a48SJunchao Zhang PetscBool PetscBeganKokkos = PETSC_FALSE; 59c2b86a48SJunchao Zhang #endif 60c2b86a48SJunchao Zhang 6171438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM) 6271438e86SJunchao Zhang PetscBool PetscBeganNvshmem = PETSC_FALSE; 6371438e86SJunchao Zhang PetscBool PetscNvshmemInitialized = PETSC_FALSE; 6471438e86SJunchao Zhang #endif 6571438e86SJunchao Zhang 66c2a741eeSJunchao Zhang PetscBool use_gpu_aware_mpi = PETSC_TRUE; 67928a6601SJunchao Zhang PetscBool PetscCreatedGpuObjects = PETSC_FALSE; 68c2a741eeSJunchao Zhang 6950f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX) 70e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE) 71e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */ 72e5c89e4eSSatish Balay #endif 738619c96cSJed Brown 748619c96cSJed Brown /*MC 758619c96cSJed Brown PETSC_i - the imaginary number i 768619c96cSJed Brown 778619c96cSJed Brown Synopsis: 788619c96cSJed Brown #include <petscsys.h> 798619c96cSJed Brown PetscComplex PETSC_i; 808619c96cSJed Brown 818619c96cSJed Brown Level: beginner 828619c96cSJed Brown 838619c96cSJed Brown Note: 848cd53115SBarry Smith Complex numbers are automatically available if PETSc located a working complex implementation 858619c96cSJed Brown 868619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex() 878619c96cSJed Brown M*/ 8850f81f78SJed Brown PetscComplex PETSC_i; 897a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0; 907a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */ 91ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) 92c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0; 93570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 94570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0; 95c90a1750SBarry Smith #endif 967087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0; 97092991acSStefano Zampini MPI_Datatype MPIU_REAL_INT = 0; 98092991acSStefano Zampini MPI_Datatype MPIU_SCALAR_INT = 0; 990354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES) 1007087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0; 10144041f26SJed Brown #endif 102*b5a892a1SMatthew G. Knepley MPI_Datatype MPI_4INT = 0; 103*b5a892a1SMatthew G. Knepley MPI_Datatype MPIU_4INT = 0; 1048ad47952SJed Brown MPI_Datatype MPIU_BOOL; 1058ad47952SJed Brown MPI_Datatype MPIU_ENUM; 1067cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR; 107e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T; 10875567043SBarry Smith 109e5c89e4eSSatish Balay /* 110e5c89e4eSSatish Balay Function that is called to display all error messages 111e5c89e4eSSatish Balay */ 1127087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...) = PetscErrorPrintfDefault; 1137087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...) = PetscHelpPrintfDefault; 1147087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list) = PetscVFPrintfDefault; 115bab1f7e6SVictor Minden /* 1164cf1874eSKarl Rupp This is needed to turn on/off GPU synchronization 1178b5db460SBarry Smith */ 1184cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE; 119bab1f7e6SVictor Minden 120e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 121e5c89e4eSSatish Balay /* 122e5c89e4eSSatish Balay Optional file where all PETSc output from various prints is saved 123e5c89e4eSSatish Balay */ 12495c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 1250298fd71SBarry Smith FILE *petsc_history = NULL; 126e5c89e4eSSatish Balay 1277087cfbeSBarry Smith PetscErrorCode PetscOpenHistoryFile(const char filename[],FILE **fd) 128e5c89e4eSSatish Balay { 129e5c89e4eSSatish Balay PetscErrorCode ierr; 130e5c89e4eSSatish Balay PetscMPIInt rank,size; 131e5c89e4eSSatish Balay char pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64]; 132e5c89e4eSSatish Balay char version[256]; 133e5c89e4eSSatish Balay 134e5c89e4eSSatish Balay PetscFunctionBegin; 135ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 136e5c89e4eSSatish Balay if (!rank) { 137e5c89e4eSSatish Balay char arch[10]; 138f56c2debSBarry Smith int err; 139f56c2debSBarry Smith 140e5c89e4eSSatish Balay ierr = PetscGetArchType(arch,10);CHKERRQ(ierr); 141e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 142a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 143ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 144e5c89e4eSSatish Balay if (filename) { 145e5c89e4eSSatish Balay ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr); 146e5c89e4eSSatish Balay } else { 147589a23caSBarry Smith ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr); 148589a23caSBarry Smith ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr); 149e5c89e4eSSatish Balay ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr); 150e5c89e4eSSatish Balay } 151e5c89e4eSSatish Balay 152a297a907SKarl Rupp *fd = fopen(fname,"a"); 153a297a907SKarl Rupp if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname); 154a297a907SKarl Rupp 155c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 156e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr); 157589a23caSBarry Smith ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr); 158e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr); 159c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 160a297a907SKarl Rupp 161f56c2debSBarry Smith err = fflush(*fd); 162e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 163e5c89e4eSSatish Balay } 164e5c89e4eSSatish Balay PetscFunctionReturn(0); 165e5c89e4eSSatish Balay } 166e5c89e4eSSatish Balay 16795c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd) 168e5c89e4eSSatish Balay { 169e5c89e4eSSatish Balay PetscErrorCode ierr; 170e5c89e4eSSatish Balay PetscMPIInt rank; 171e5c89e4eSSatish Balay char date[64]; 172f56c2debSBarry Smith int err; 173e5c89e4eSSatish Balay 174e5c89e4eSSatish Balay PetscFunctionBegin; 175ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 176e5c89e4eSSatish Balay if (!rank) { 177e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 178c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 179e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr); 180c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 181f56c2debSBarry Smith err = fflush(*fd); 182e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 183f56c2debSBarry Smith err = fclose(*fd); 184e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 185e5c89e4eSSatish Balay } 186e5c89e4eSSatish Balay PetscFunctionReturn(0); 187e5c89e4eSSatish Balay } 188e5c89e4eSSatish Balay 189e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 190e5c89e4eSSatish Balay 191e5c89e4eSSatish Balay /* 192e5c89e4eSSatish Balay This is ugly and probably belongs somewhere else, but I want to 193e5c89e4eSSatish Balay be able to put a true MPI abort error handler with command line args. 194e5c89e4eSSatish Balay 195e5c89e4eSSatish Balay This is so MPI errors in the debugger will leave all the stack 1963c311c98SBarry Smith frames. The default MP_Abort() cleans up and exits thus providing no useful information 1973c311c98SBarry Smith in the debugger hence we call abort() instead of MPI_Abort(). 198e5c89e4eSSatish Balay */ 199e5c89e4eSSatish Balay 20033c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 201e5c89e4eSSatish Balay { 202e5c89e4eSSatish Balay PetscFunctionBegin; 2033c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 204e5c89e4eSSatish Balay abort(); 205e5c89e4eSSatish Balay } 206e5c89e4eSSatish Balay 20733c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 208e5c89e4eSSatish Balay { 209e5c89e4eSSatish Balay PetscErrorCode ierr; 210e5c89e4eSSatish Balay 211e5c89e4eSSatish Balay PetscFunctionBegin; 2123c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 213e5c89e4eSSatish Balay ierr = PetscAttachDebugger(); 21441e02c4dSJunchao Zhang if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */ 215e5c89e4eSSatish Balay } 216e5c89e4eSSatish Balay 217e5c89e4eSSatish Balay /*@C 218e5c89e4eSSatish Balay PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one 219e5c89e4eSSatish Balay wishes a clean exit somewhere deep in the program. 220e5c89e4eSSatish Balay 221e5c89e4eSSatish Balay Collective on PETSC_COMM_WORLD 222e5c89e4eSSatish Balay 223e5c89e4eSSatish Balay Options Database Keys are the same as for PetscFinalize() 224e5c89e4eSSatish Balay 225e5c89e4eSSatish Balay Level: advanced 226e5c89e4eSSatish Balay 227e5c89e4eSSatish Balay Note: 228e5c89e4eSSatish Balay See PetscInitialize() for more general runtime options. 229e5c89e4eSSatish Balay 23088c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize() 231e5c89e4eSSatish Balay @*/ 2327087cfbeSBarry Smith PetscErrorCode PetscEnd(void) 233e5c89e4eSSatish Balay { 234e5c89e4eSSatish Balay PetscFunctionBegin; 235e5c89e4eSSatish Balay PetscFinalize(); 236e5c89e4eSSatish Balay exit(0); 237e5c89e4eSSatish Balay return 0; 238e5c89e4eSSatish Balay } 239e5c89e4eSSatish Balay 240ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE; 24195c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void); 24295c0884eSLisandro Dalcin PETSC_INTERN PetscBool petscsetmallocvisited; 243e5c89e4eSSatish Balay static char emacsmachinename[256]; 244e5c89e4eSSatish Balay 24502c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL; 24602c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm) = NULL; 247e5c89e4eSSatish Balay 248e5c89e4eSSatish Balay /*@C 249e5c89e4eSSatish Balay PetscSetHelpVersionFunctions - Sets functions that print help and version information 250e5c89e4eSSatish Balay before the PETSc help and version information is printed. Must call BEFORE PetscInitialize(). 251e5c89e4eSSatish Balay This routine enables a "higher-level" package that uses PETSc to print its messages first. 252e5c89e4eSSatish Balay 253e5c89e4eSSatish Balay Input Parameter: 2540298fd71SBarry Smith + help - the help function (may be NULL) 2550298fd71SBarry Smith - version - the version function (may be NULL) 256e5c89e4eSSatish Balay 257e5c89e4eSSatish Balay Level: developer 258e5c89e4eSSatish Balay 259e5c89e4eSSatish Balay @*/ 2607087cfbeSBarry Smith PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm)) 261e5c89e4eSSatish Balay { 262e5c89e4eSSatish Balay PetscFunctionBegin; 263e5c89e4eSSatish Balay PetscExternalHelpFunction = help; 264e5c89e4eSSatish Balay PetscExternalVersionFunction = version; 265e5c89e4eSSatish Balay PetscFunctionReturn(0); 266e5c89e4eSSatish Balay } 267e5c89e4eSSatish Balay 26805df10baSBarry Smith #if defined(PETSC_USE_LOG) 26995c0884eSLisandro Dalcin PETSC_INTERN PetscBool PetscObjectsLog; 27005df10baSBarry Smith #endif 27105df10baSBarry Smith 27205035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP. 27305035670SJunchao Zhang Use the following macros to define CUDA/HIP initialization related vars/routines. 27405035670SJunchao Zhang */ 27505035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 27605035670SJunchao Zhang typedef cudaError_t cupmError_t; 27705035670SJunchao Zhang typedef struct cudaDeviceProp cupmDeviceProp; 278a0e72f99SJunchao Zhang typedef cudaStream_t cupmStream_t; 2799ffd0706SHong Zhang typedef cudaEvent_t cupmEvent_t; 28005035670SJunchao Zhang #define cupmGetDeviceCount(x) cudaGetDeviceCount(x) 28105035670SJunchao Zhang #define cupmGetDevice(x) cudaGetDevice(x) 28205035670SJunchao Zhang #define cupmSetDevice(x) cudaSetDevice(x) 28305035670SJunchao Zhang #define cupmSetDeviceFlags(x) cudaSetDeviceFlags(x) 28405035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) cudaGetDeviceProperties(x,y) 285a0e72f99SJunchao Zhang #define cupmStreamCreate(x) cudaStreamCreate(x) 28605035670SJunchao Zhang #define cupmGetLastError() cudaGetLastError() 28705035670SJunchao Zhang #define cupmDeviceMapHost cudaDeviceMapHost 28805035670SJunchao Zhang #define cupmSuccess cudaSuccess 289e57d7714SBarry Smith #define cupmErrorMemoryAllocation cudaErrorMemoryAllocation 290e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources cudaErrorLaunchOutOfResources 29105035670SJunchao Zhang #define cupmErrorSetOnActiveProcess cudaErrorSetOnActiveProcess 29205035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRCUDA(x) 29305035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() PetscCUBLASInitializeHandle() 29405035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() PetscCUSOLVERDnInitializeHandle() 29505035670SJunchao Zhang #define PetscCUPMInitialize PetscCUDAInitialize 29605035670SJunchao Zhang #define PetscCUPMInitialized PetscCUDAInitialized 29705035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscCUDAInitializeCheck 29805035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscCUDAInitializeAndView 29905035670SJunchao Zhang #define PetscCUPMSynchronize PetscCUDASynchronize 30005035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseCUDA 30105035670SJunchao Zhang #define cupmOptionsStr "CUDA options" 3024dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-cuda_device" 30305035670SJunchao Zhang #define cupmViewStr "-cuda_view" 30405035670SJunchao Zhang #define cupmSynchronizeStr "-cuda_synchronize" 30505035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscCUDAInitialize" 30605035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckCUDA 30705035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPICUDAAwarenessCheck 308a0e72f99SJunchao Zhang #define PetscDefaultCupmStream PetscDefaultCudaStream 3099ffd0706SHong Zhang #define cupmEventCreate(x) cudaEventCreate(x) 31005035670SJunchao Zhang #include "cupminit.inc" 31105035670SJunchao Zhang #endif 31205035670SJunchao Zhang 31305035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 31405035670SJunchao Zhang typedef hipError_t cupmError_t; 31505035670SJunchao Zhang typedef hipDeviceProp_t cupmDeviceProp; 316a0e72f99SJunchao Zhang typedef hipStream_t cupmStream_t; 3179ffd0706SHong Zhang typedef hipEvent_t cupmEvent_t; 31805035670SJunchao Zhang #define cupmGetDeviceCount(x) hipGetDeviceCount(x) 31905035670SJunchao Zhang #define cupmGetDevice(x) hipGetDevice(x) 32005035670SJunchao Zhang #define cupmSetDevice(x) hipSetDevice(x) 32105035670SJunchao Zhang #define cupmSetDeviceFlags(x) hipSetDeviceFlags(x) 32205035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) hipGetDeviceProperties(x,y) 323a0e72f99SJunchao Zhang #define cupmStreamCreate(x) hipStreamCreate(x) 3249ffd0706SHong Zhang #define cupmEventCreate(x) hipEventCreate(x); 32505035670SJunchao Zhang #define cupmGetLastError() hipGetLastError() 32605035670SJunchao Zhang #define cupmDeviceMapHost hipDeviceMapHost 32705035670SJunchao Zhang #define cupmSuccess hipSuccess 328e57d7714SBarry Smith #define cupmErrorMemoryAllocation hipErrorMemoryAllocation 329e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources hipErrorLaunchOutOfResources 33005035670SJunchao Zhang #define cupmErrorSetOnActiveProcess hipErrorSetOnActiveProcess 33105035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB) 33205035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() 0 33305035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() 0 33405035670SJunchao Zhang #define PetscCUPMInitialize PetscHIPInitialize 33505035670SJunchao Zhang #define PetscCUPMInitialized PetscHIPInitialized 33605035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscHIPInitializeCheck 33705035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscHIPInitializeAndView 33805035670SJunchao Zhang #define PetscCUPMSynchronize PetscHIPSynchronize 33905035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseHIP 34005035670SJunchao Zhang #define cupmOptionsStr "HIP options" 3414dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-hip_device" 34205035670SJunchao Zhang #define cupmViewStr "-hip_view" 34305035670SJunchao Zhang #define cupmSynchronizeStr "-hip_synchronize" 34405035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscHIPInitialize" 34505035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckHIP 34605035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPIHIPAwarenessCheck 347a0e72f99SJunchao Zhang #define PetscDefaultCupmStream PetscDefaultHipStream 34805035670SJunchao Zhang #include "cupminit.inc" 34905035670SJunchao Zhang #endif 35005035670SJunchao Zhang 35157171095SVaclav Hapla PETSC_INTERN PetscErrorCode PetscOptionsCheckInitial_Private(const char help[]) 352e5c89e4eSSatish Balay { 353e5ed2c37SJose E. Roman char string[64]; 354e5c89e4eSSatish Balay MPI_Comm comm = PETSC_COMM_WORLD; 35505035670SJunchao Zhang PetscBool flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView; 356e5c89e4eSSatish Balay PetscErrorCode ierr; 35767584ceeSBarry Smith PetscReal si; 35828559dc8SJed Brown PetscInt intensity; 359e5c89e4eSSatish Balay int i; 360e5c89e4eSSatish Balay PetscMPIInt rank; 361d314f959SVaclav Hapla char version[256]; 3622479a3a6SBarry Smith #if defined(PETSC_USE_LOG) 363e5ed2c37SJose E. Roman char mname[PETSC_MAX_PATH_LEN]; 3642479a3a6SBarry Smith PetscViewerFormat format; 36567584ceeSBarry Smith PetscBool flg4 = PETSC_FALSE; 36667584ceeSBarry Smith #endif 3677381773fSBarry Smith 368e5c89e4eSSatish Balay PetscFunctionBegin; 369ffc4695bSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 370e5c89e4eSSatish Balay 37167584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY) 37292f119d6SBarry Smith if (!(PETSC_RUNNING_ON_VALGRIND)) { 373e5c89e4eSSatish Balay /* 374e5c89e4eSSatish Balay Setup the memory management; support for tracing malloc() usage 375e5c89e4eSSatish Balay */ 376244bdbccSBarry Smith PetscBool mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE; 37792f119d6SBarry Smith 37876bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 37992f119d6SBarry Smith mdebug = PETSC_TRUE; 38092f119d6SBarry Smith initializenan = PETSC_TRUE; 38192f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 38276bd3646SJed Brown } else { 38392f119d6SBarry Smith /* don't warn about unused option */ 38492f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 38592f119d6SBarry Smith flg1 = PETSC_FALSE; 38676bd3646SJed Brown } 38779dccf82SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr); 38892f119d6SBarry Smith if (flg1 || flg2) { 38992f119d6SBarry Smith mdebug = PETSC_TRUE; 39092f119d6SBarry Smith eachcall = PETSC_TRUE; 39192f119d6SBarry Smith initializenan = PETSC_TRUE; 39279dccf82SBarry Smith } else if (flg3 && !flg2) { 39379dccf82SBarry Smith mdebug = PETSC_FALSE; 39479dccf82SBarry Smith eachcall = PETSC_FALSE; 39579dccf82SBarry Smith initializenan = PETSC_FALSE; 396e5c89e4eSSatish Balay } 39792f119d6SBarry Smith 398608c71bfSMatthew G. Knepley ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr); 399608c71bfSMatthew G. Knepley if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);} 400608c71bfSMatthew G. Knepley 40192f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr); 40292f119d6SBarry Smith if (mlog) { 40392f119d6SBarry Smith mdebug = PETSC_TRUE; 40492f119d6SBarry Smith } 40579dccf82SBarry Smith /* the next line is deprecated */ 40692f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr); 40792f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr); 40892f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr); 40992f119d6SBarry Smith if (mdebug) { 41092f119d6SBarry Smith ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr); 41192f119d6SBarry Smith } 41292f119d6SBarry Smith if (mlog) { 41392f119d6SBarry Smith PetscReal logthreshold = 0; 41492f119d6SBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr); 41592f119d6SBarry Smith ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr); 41692f119d6SBarry Smith } 4178b254c29SBarry Smith #if defined(PETSC_USE_LOG) 4188b254c29SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr); 4198b254c29SBarry Smith #endif 42092f119d6SBarry Smith } 42192f119d6SBarry Smith 422ba282f50SJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr); 423ba282f50SJed Brown if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);} 42490d69ab7SBarry Smith flg1 = PETSC_FALSE; 4252f21b5c6SHong Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr); 426cf6f3811SHong Zhang /* ignore this option if malloc is already set */ 427cf6f3811SHong Zhang if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);} 428e5c89e4eSSatish Balay 42990d69ab7SBarry Smith flg1 = PETSC_FALSE; 430c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr); 4317783f70dSSatish Balay if (!flg1) { 43290d69ab7SBarry Smith flg1 = PETSC_FALSE; 433c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr); 4347783f70dSSatish Balay } 435e5c89e4eSSatish Balay if (flg1) { 436e5c89e4eSSatish Balay ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 437e5c89e4eSSatish Balay } 43867584ceeSBarry Smith #endif 439e5c89e4eSSatish Balay 440b4427426SBarry Smith #if defined(PETSC_USE_LOG) 441c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr); 442b4427426SBarry Smith #endif 44305df10baSBarry Smith 444e5c89e4eSSatish Balay /* 445e5c89e4eSSatish Balay Set the display variable for graphics 446e5c89e4eSSatish Balay */ 447e5c89e4eSSatish Balay ierr = PetscSetDisplay();CHKERRQ(ierr); 448e5c89e4eSSatish Balay 44951dcc849SKerry Stevens /* 45057171095SVaclav Hapla Print main application help message 45157171095SVaclav Hapla */ 45257171095SVaclav Hapla ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr); 45357171095SVaclav Hapla if (help && hasHelp) { 45457171095SVaclav Hapla ierr = PetscPrintf(comm,help);CHKERRQ(ierr); 45557171095SVaclav Hapla ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr); 45657171095SVaclav Hapla } 45757171095SVaclav Hapla 45857171095SVaclav Hapla /* 459e5c89e4eSSatish Balay Print the PETSc version information 460e5c89e4eSSatish Balay */ 461d314f959SVaclav Hapla ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr); 462d314f959SVaclav Hapla if (flg1 || hasHelp) { 463e5c89e4eSSatish Balay /* 464e5c89e4eSSatish Balay Print "higher-level" package version message 465e5c89e4eSSatish Balay */ 466e5c89e4eSSatish Balay if (PetscExternalVersionFunction) { 467e5c89e4eSSatish Balay ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 468e5c89e4eSSatish Balay } 469e5c89e4eSSatish Balay 470a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 471e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 472e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 473e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 47484e42920SBarry Smith ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr); 475e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 476e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 477c0bb3764SVaclav Hapla ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr); 4787ca660e7SBarry Smith } 4797ca660e7SBarry Smith 48094941ca7SBarry Smith /* 48194941ca7SBarry Smith Print "higher-level" package help message 48294941ca7SBarry Smith */ 48357171095SVaclav Hapla if (hasHelp) { 484d314f959SVaclav Hapla PetscBool hasHelpIntro; 485d314f959SVaclav Hapla 48694941ca7SBarry Smith if (PetscExternalHelpFunction) { 48794941ca7SBarry Smith ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 48894941ca7SBarry Smith } 489d314f959SVaclav Hapla ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr); 490d314f959SVaclav Hapla if (hasHelpIntro) { 491bdb346e9SBarry Smith ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr); 492008a6e76SBarry Smith ierr = PetscFreeMPIResources();CHKERRQ(ierr); 493ffc4695bSBarry Smith ierr = MPI_Finalize();CHKERRMPI(ierr); 4947ca660e7SBarry Smith exit(0); 4957ca660e7SBarry Smith } 496e5c89e4eSSatish Balay } 497e5c89e4eSSatish Balay 498e5c89e4eSSatish Balay /* 499e5c89e4eSSatish Balay Setup the error handling 500e5c89e4eSSatish Balay */ 50190d69ab7SBarry Smith flg1 = PETSC_FALSE; 502c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr); 503b59baad1SJed Brown if (flg1) { 504ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr); 50502c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 506b59baad1SJed Brown } 50790d69ab7SBarry Smith flg1 = PETSC_FALSE; 508c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr); 50902c9f0b5SLisandro Dalcin if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);} 51090d69ab7SBarry Smith flg1 = PETSC_FALSE; 511c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr); 512e5c89e4eSSatish Balay if (flg1) { 513ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr); 514e5c89e4eSSatish Balay } 51590d69ab7SBarry Smith flg1 = PETSC_FALSE; 516c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr); 5178d359177SBarry Smith if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);} 518e5c89e4eSSatish Balay 519e5c89e4eSSatish Balay /* 520e5c89e4eSSatish Balay Setup debugger information 521e5c89e4eSSatish Balay */ 522e5c89e4eSSatish Balay ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 523589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 524e5c89e4eSSatish Balay if (flg1) { 525e5c89e4eSSatish Balay MPI_Errhandler err_handler; 526e5c89e4eSSatish Balay 527e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 528ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr); 529ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 53002c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr); 531e5c89e4eSSatish Balay } 532589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr); 5335e96ac45SJed Brown if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 534589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 535589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr); 536e5c89e4eSSatish Balay if (flg1 || flg2) { 537e5c89e4eSSatish Balay PetscMPIInt size; 538bf4d2887SBarry Smith PetscInt lsize,*ranks; 539e5c89e4eSSatish Balay MPI_Errhandler err_handler; 540e5c89e4eSSatish Balay /* 541e5c89e4eSSatish Balay we have to make sure that all processors have opened 542e5c89e4eSSatish Balay connections to all other processors, otherwise once the 543e5c89e4eSSatish Balay debugger has stated it is likely to receive a SIGUSR1 544e5c89e4eSSatish Balay and kill the program. 545e5c89e4eSSatish Balay */ 546ffc4695bSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr); 547e5c89e4eSSatish Balay if (size > 2) { 548533163c2SBarry Smith PetscMPIInt dummy = 0; 549e5c89e4eSSatish Balay MPI_Status status; 550e5c89e4eSSatish Balay for (i=0; i<size; i++) { 551e5c89e4eSSatish Balay if (rank != i) { 552ffc4695bSBarry Smith ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr); 553e5c89e4eSSatish Balay } 554e5c89e4eSSatish Balay } 555e5c89e4eSSatish Balay for (i=0; i<size; i++) { 556e5c89e4eSSatish Balay if (rank != i) { 557ffc4695bSBarry Smith ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr); 558e5c89e4eSSatish Balay } 559e5c89e4eSSatish Balay } 560e5c89e4eSSatish Balay } 561e5c89e4eSSatish Balay /* check if this processor node should be in debugger */ 562bf4d2887SBarry Smith ierr = PetscMalloc1(size,&ranks);CHKERRQ(ierr); 563e5c89e4eSSatish Balay lsize = size; 564bf4d2887SBarry Smith /* Deprecated in 3.14 */ 565bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr); 566bf4d2887SBarry Smith if (flag) { 567bf4d2887SBarry Smith const char * const quietopt="-options_suppress_deprecated_warnings"; 568bf4d2887SBarry Smith char msg[4096]; 569bf4d2887SBarry Smith PetscBool quiet = PETSC_FALSE; 570bf4d2887SBarry Smith 571bf4d2887SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr); 572bf4d2887SBarry Smith if (!quiet) { 573bf4d2887SBarry Smith ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr); 574bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr); 575bf4d2887SBarry Smith ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr); 576bf4d2887SBarry Smith ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr); 577bf4d2887SBarry Smith ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr); 578bf4d2887SBarry Smith ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr); 579bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr); 580bf4d2887SBarry Smith ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr); 581bf4d2887SBarry Smith ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr); 582bf4d2887SBarry Smith ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr); 583bf4d2887SBarry Smith ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr); 584bf4d2887SBarry Smith ierr = PetscPrintf(comm,msg);CHKERRQ(ierr); 585bf4d2887SBarry Smith } 586bf4d2887SBarry Smith } else { 587bf4d2887SBarry Smith lsize = size; 588bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr); 589bf4d2887SBarry Smith } 590e5c89e4eSSatish Balay if (flag) { 591e5c89e4eSSatish Balay for (i=0; i<lsize; i++) { 592bf4d2887SBarry Smith if (ranks[i] == rank) { flag = PETSC_FALSE; break; } 593e5c89e4eSSatish Balay } 594e5c89e4eSSatish Balay } 595e5c89e4eSSatish Balay if (!flag) { 596e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 59702c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 598e5c89e4eSSatish Balay if (flg1) { 599e5c89e4eSSatish Balay ierr = PetscAttachDebugger();CHKERRQ(ierr); 600e5c89e4eSSatish Balay } else { 601e5c89e4eSSatish Balay ierr = PetscStopForDebugger();CHKERRQ(ierr); 602e5c89e4eSSatish Balay } 603ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr); 604ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 6052a2a2941SBarry Smith } else { 6062a2a2941SBarry Smith ierr = PetscWaitOnError();CHKERRQ(ierr); 607e5c89e4eSSatish Balay } 608bf4d2887SBarry Smith ierr = PetscFree(ranks);CHKERRQ(ierr); 609e5c89e4eSSatish Balay } 610e5c89e4eSSatish Balay 611589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr); 612cb9801acSJed Brown if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);} 613e5c89e4eSSatish Balay 614e5c89e4eSSatish Balay /* 615e5c89e4eSSatish Balay Setup profiling and logging 616e5c89e4eSSatish Balay */ 6176cf91177SBarry Smith #if defined(PETSC_USE_INFO) 6188bb29257SSatish Balay { 619e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr); 620e5c89e4eSSatish Balay } 621865f6aa8SSatish Balay #endif 622aba4c478SBarry Smith ierr = PetscDetermineInitialFPTrap(); 623cc9df77eSBarry Smith flg1 = PETSC_FALSE; 624cc9df77eSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr); 625cc9df77eSBarry Smith if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);} 626cc9df77eSBarry Smith ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr); 627cc9df77eSBarry Smith if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);} 628865f6aa8SSatish Balay #if defined(PETSC_USE_LOG) 629865f6aa8SSatish Balay mname[0] = 0; 630589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 631865f6aa8SSatish Balay if (flg1) { 632865f6aa8SSatish Balay if (mname[0]) { 633f3dea69dSBarry Smith ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 634865f6aa8SSatish Balay } else { 635706d7a88SBarry Smith ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr); 636865f6aa8SSatish Balay } 637865f6aa8SSatish Balay } 638217044c2SLisandro Dalcin 639217044c2SLisandro Dalcin ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr); 640217044c2SLisandro Dalcin 641e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 64290d69ab7SBarry Smith flg1 = PETSC_FALSE; 643c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 644495fc317SBarry Smith if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);} 645e5c89e4eSSatish Balay #endif 64690d69ab7SBarry Smith flg1 = PETSC_FALSE; 64790d69ab7SBarry Smith flg3 = PETSC_FALSE; 648c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr); 649c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 650e5c89e4eSSatish Balay if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 651bb1d7374SBarry Smith else if (flg3) { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);} 652e5c89e4eSSatish Balay 653589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 654e5c89e4eSSatish Balay if (flg1) { 655e5c89e4eSSatish Balay char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 656e5c89e4eSSatish Balay FILE *file; 657e5c89e4eSSatish Balay if (mname[0]) { 6582e924ca5SSatish Balay PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank); 659e5c89e4eSSatish Balay ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 660e5c89e4eSSatish Balay file = fopen(fname,"w"); 661f3dea69dSBarry Smith if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 662a297a907SKarl Rupp } else file = PETSC_STDOUT; 663e5c89e4eSSatish Balay ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 664e5c89e4eSSatish Balay } 665bb1d7374SBarry Smith 66616413a6aSBarry Smith ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr); 667bb1d7374SBarry Smith if (flg4) { 668d0a29bd7SConnor Ward if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) { 669bb1d7374SBarry Smith ierr = PetscLogNestedBegin();CHKERRQ(ierr); 670bb1d7374SBarry Smith } else { 671bb1d7374SBarry Smith ierr = PetscLogDefaultBegin();CHKERRQ(ierr); 672bb1d7374SBarry Smith } 673eccbb886SLisandro Dalcin } 674d0a29bd7SConnor Ward if (flg4 && (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH)) { 675eccbb886SLisandro Dalcin PetscReal threshold = PetscRealConstant(0.01); 676eccbb886SLisandro Dalcin ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr); 677eccbb886SLisandro Dalcin if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);} 678bb1d7374SBarry Smith } 679e5c89e4eSSatish Balay #endif 680e5c89e4eSSatish Balay 681c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr); 68205035670SJunchao Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr); 6838d4e85a7SStefano Zampini /* 68405035670SJunchao Zhang If collecting logging information, by default, wait for device to complete its operations 6858d4e85a7SStefano Zampini before returning to the CPU in order to get accurate timings of each event 6868d4e85a7SStefano Zampini */ 687cae85d06SJunchao Zhang ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr); 68805035670SJunchao Zhang if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);} 6898d4e85a7SStefano Zampini 69005035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 69105035670SJunchao Zhang ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr); 69205035670SJunchao Zhang #endif 693cae85d06SJunchao Zhang 69405035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 69505035670SJunchao Zhang ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr); 6964b0a73b2SBarry Smith #endif 6974b0a73b2SBarry Smith 698e5c89e4eSSatish Balay /* 699e5c89e4eSSatish Balay Print basic help message 700e5c89e4eSSatish Balay */ 70157171095SVaclav Hapla if (hasHelp) { 702e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 703d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr); 704d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr); 705d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr); 706301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr); 707301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," only when run in the debugger\n");CHKERRQ(ierr); 708e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 709e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 710e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 711e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 712e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 713e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 714e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 715bf4d2887SBarry Smith ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr); 716e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 717e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 718e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 7191cda70a7SBarry Smith ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr); 720e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 721e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 722e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 723e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 724e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 72579dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr); 72679dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr); 7274161f2a3SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 72892f119d6SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr); 72979dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr); 73026a7e8d4SBarry Smith ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr); 731e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 732e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 733e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 734e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 735a8c7a070SBarry Smith ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 7360841954dSBarry Smith ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr); 737e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 738e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 739185ae32fSMatthew G. Knepley ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr); 740e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 74156071f75SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr); 742e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 743495fc317SBarry Smith ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr); 744e5c89e4eSSatish Balay #endif 745e94e781bSJacob Faibussowitsch #endif 746e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO) 747fe9b927eSVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr); 748e5c89e4eSSatish Balay #endif 749e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 750c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr); 751c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr); 752e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 753e5c89e4eSSatish Balay } 754e5c89e4eSSatish Balay 75574ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN) 75674ba8654SBarry Smith { 75774ba8654SBarry Smith char machine[128]; 758589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr); 75974ba8654SBarry Smith if (flg1) { 76074ba8654SBarry Smith ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr); 76174ba8654SBarry Smith } 76274ba8654SBarry Smith } 76374ba8654SBarry Smith #endif 76474ba8654SBarry Smith 765c5929fdfSBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 766e5c89e4eSSatish Balay if (flg1) { 767e5c89e4eSSatish Balay ierr = PetscSleep(si);CHKERRQ(ierr); 768e5c89e4eSSatish Balay } 769e5c89e4eSSatish Balay 770fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL) 771c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 772f14045dbSBarry Smith if (!flg3) { 773c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr); 774f14045dbSBarry Smith } 775c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr); 776f14045dbSBarry Smith PetscViennaCLSynchronize = flg3; 777fdc842d1SBarry Smith ierr = PetscViennaCLInit();CHKERRQ(ierr); 7784cf1874eSKarl Rupp #endif 77982f73ecaSAlejandro Lamas Daviña 780fdc842d1SBarry Smith /* 781fdc842d1SBarry Smith Creates the logging data structures; this is enabled even if logging is not turned on 782fdc842d1SBarry Smith This is the last thing we do before returning to the user code to prevent having the 783fdc842d1SBarry Smith logging numbers contaminated by any startup time associated with MPI and the GPUs 784fdc842d1SBarry Smith */ 785fdc842d1SBarry Smith #if defined(PETSC_USE_LOG) 786fdc842d1SBarry Smith ierr = PetscLogInitialize();CHKERRQ(ierr); 787f0a7718cSKarl Rupp #endif 788f0a7718cSKarl Rupp 789e5c89e4eSSatish Balay PetscFunctionReturn(0); 790e5c89e4eSSatish Balay } 791