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 23030f984aSJacob Faibussowitsch #if defined(PETSC_HAVE_CUDA) || defined(PETSC_HAVE_HIP) 24030f984aSJacob Faibussowitsch # include <petscdevice.h> 2505035670SJunchao Zhang #endif 2605035670SJunchao Zhang 2705035670SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 28c2a741eeSJunchao Zhang #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION) 29c2a741eeSJunchao Zhang #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */ 30c2a741eeSJunchao Zhang #endif 31d9b72601SDominic Meiser #endif 32555d055bSBarry Smith 33f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL) 34f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit(); 35f0a7718cSKarl Rupp #endif 36f0a7718cSKarl Rupp 37e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/ 38e5c89e4eSSatish Balay /* 39e5c89e4eSSatish Balay Indicates if PETSc started up MPI, or it was 40e5c89e4eSSatish Balay already started before PETSc was initialized. 41e5c89e4eSSatish Balay */ 420cbf60d0SJose E. Roman PetscBool PetscBeganMPI = PETSC_FALSE; 438ad20175SVaclav Hapla PetscBool PetscErrorHandlingInitialized = PETSC_FALSE; 440cbf60d0SJose E. Roman PetscBool PetscInitializeCalled = PETSC_FALSE; 450cbf60d0SJose E. Roman PetscBool PetscFinalizeCalled = PETSC_FALSE; 46d6f2c3cbSBarry Smith 477087cfbeSBarry Smith PetscMPIInt PetscGlobalRank = -1; 487087cfbeSBarry Smith PetscMPIInt PetscGlobalSize = -1; 49ba61063dSBarry Smith 50c2b86a48SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS) 51c2b86a48SJunchao Zhang PetscBool PetscBeganKokkos = PETSC_FALSE; 52c2b86a48SJunchao Zhang #endif 53c2b86a48SJunchao Zhang 5471438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM) 5571438e86SJunchao Zhang PetscBool PetscBeganNvshmem = PETSC_FALSE; 5671438e86SJunchao Zhang PetscBool PetscNvshmemInitialized = PETSC_FALSE; 5771438e86SJunchao Zhang #endif 5871438e86SJunchao Zhang 59c2a741eeSJunchao Zhang PetscBool use_gpu_aware_mpi = PETSC_TRUE; 60928a6601SJunchao Zhang PetscBool PetscCreatedGpuObjects = PETSC_FALSE; 61c2a741eeSJunchao Zhang 6250f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX) 63e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE) 64e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */ 65e5c89e4eSSatish Balay #endif 668619c96cSJed Brown 678619c96cSJed Brown /*MC 688619c96cSJed Brown PETSC_i - the imaginary number i 698619c96cSJed Brown 708619c96cSJed Brown Synopsis: 718619c96cSJed Brown #include <petscsys.h> 728619c96cSJed Brown PetscComplex PETSC_i; 738619c96cSJed Brown 748619c96cSJed Brown Level: beginner 758619c96cSJed Brown 768619c96cSJed Brown Note: 778cd53115SBarry Smith Complex numbers are automatically available if PETSc located a working complex implementation 788619c96cSJed Brown 798619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex() 808619c96cSJed Brown M*/ 8150f81f78SJed Brown PetscComplex PETSC_i; 827a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0; 837a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */ 84ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) 85c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0; 86570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 87570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0; 88c90a1750SBarry Smith #endif 897087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0; 90092991acSStefano Zampini MPI_Datatype MPIU_REAL_INT = 0; 91092991acSStefano Zampini MPI_Datatype MPIU_SCALAR_INT = 0; 920354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES) 937087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0; 9444041f26SJed Brown #endif 95b5a892a1SMatthew G. Knepley MPI_Datatype MPI_4INT = 0; 96b5a892a1SMatthew G. Knepley MPI_Datatype MPIU_4INT = 0; 978ad47952SJed Brown MPI_Datatype MPIU_BOOL; 988ad47952SJed Brown MPI_Datatype MPIU_ENUM; 997cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR; 100e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T; 10175567043SBarry Smith 102e5c89e4eSSatish Balay /* 103e5c89e4eSSatish Balay Function that is called to display all error messages 104e5c89e4eSSatish Balay */ 1057087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...) = PetscErrorPrintfDefault; 1067087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...) = PetscHelpPrintfDefault; 1077087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list) = PetscVFPrintfDefault; 108bab1f7e6SVictor Minden /* 1094cf1874eSKarl Rupp This is needed to turn on/off GPU synchronization 1108b5db460SBarry Smith */ 1114cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE; 112bab1f7e6SVictor Minden 113e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 114e5c89e4eSSatish Balay /* 115e5c89e4eSSatish Balay Optional file where all PETSc output from various prints is saved 116e5c89e4eSSatish Balay */ 11795c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 1180298fd71SBarry Smith FILE *petsc_history = NULL; 119e5c89e4eSSatish Balay 1207087cfbeSBarry Smith PetscErrorCode PetscOpenHistoryFile(const char filename[],FILE **fd) 121e5c89e4eSSatish Balay { 122e5c89e4eSSatish Balay PetscErrorCode ierr; 123e5c89e4eSSatish Balay PetscMPIInt rank,size; 124e5c89e4eSSatish Balay char pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64]; 125e5c89e4eSSatish Balay char version[256]; 126e5c89e4eSSatish Balay 127e5c89e4eSSatish Balay PetscFunctionBegin; 128ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 129dd400576SPatrick Sanan if (rank == 0) { 130e5c89e4eSSatish Balay char arch[10]; 131f56c2debSBarry Smith int err; 132f56c2debSBarry Smith 133e5c89e4eSSatish Balay ierr = PetscGetArchType(arch,10);CHKERRQ(ierr); 134e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 135a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 136ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 137e5c89e4eSSatish Balay if (filename) { 138e5c89e4eSSatish Balay ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr); 139e5c89e4eSSatish Balay } else { 140589a23caSBarry Smith ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr); 141589a23caSBarry Smith ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr); 142e5c89e4eSSatish Balay ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr); 143e5c89e4eSSatish Balay } 144e5c89e4eSSatish Balay 145a297a907SKarl Rupp *fd = fopen(fname,"a"); 146a297a907SKarl Rupp if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname); 147a297a907SKarl Rupp 148c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 149e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr); 150589a23caSBarry Smith ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr); 151e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr); 152c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 153a297a907SKarl Rupp 154f56c2debSBarry Smith err = fflush(*fd); 155e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 156e5c89e4eSSatish Balay } 157e5c89e4eSSatish Balay PetscFunctionReturn(0); 158e5c89e4eSSatish Balay } 159e5c89e4eSSatish Balay 16095c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd) 161e5c89e4eSSatish Balay { 162e5c89e4eSSatish Balay PetscErrorCode ierr; 163e5c89e4eSSatish Balay PetscMPIInt rank; 164e5c89e4eSSatish Balay char date[64]; 165f56c2debSBarry Smith int err; 166e5c89e4eSSatish Balay 167e5c89e4eSSatish Balay PetscFunctionBegin; 168ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 169dd400576SPatrick Sanan if (rank == 0) { 170e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 171c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 172e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr); 173c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 174f56c2debSBarry Smith err = fflush(*fd); 175e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 176f56c2debSBarry Smith err = fclose(*fd); 177e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 178e5c89e4eSSatish Balay } 179e5c89e4eSSatish Balay PetscFunctionReturn(0); 180e5c89e4eSSatish Balay } 181e5c89e4eSSatish Balay 182e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 183e5c89e4eSSatish Balay 184e5c89e4eSSatish Balay /* 185e5c89e4eSSatish Balay This is ugly and probably belongs somewhere else, but I want to 186e5c89e4eSSatish Balay be able to put a true MPI abort error handler with command line args. 187e5c89e4eSSatish Balay 188e5c89e4eSSatish Balay This is so MPI errors in the debugger will leave all the stack 1893c311c98SBarry Smith frames. The default MP_Abort() cleans up and exits thus providing no useful information 1903c311c98SBarry Smith in the debugger hence we call abort() instead of MPI_Abort(). 191e5c89e4eSSatish Balay */ 192e5c89e4eSSatish Balay 19333c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 194e5c89e4eSSatish Balay { 195e5c89e4eSSatish Balay PetscFunctionBegin; 1963c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 197e5c89e4eSSatish Balay abort(); 198e5c89e4eSSatish Balay } 199e5c89e4eSSatish Balay 20033c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 201e5c89e4eSSatish Balay { 202e5c89e4eSSatish Balay PetscErrorCode ierr; 203e5c89e4eSSatish Balay 204e5c89e4eSSatish Balay PetscFunctionBegin; 2053c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 206e5c89e4eSSatish Balay ierr = PetscAttachDebugger(); 20741e02c4dSJunchao Zhang if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */ 208e5c89e4eSSatish Balay } 209e5c89e4eSSatish Balay 210e5c89e4eSSatish Balay /*@C 211e5c89e4eSSatish Balay PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one 212e5c89e4eSSatish Balay wishes a clean exit somewhere deep in the program. 213e5c89e4eSSatish Balay 214e5c89e4eSSatish Balay Collective on PETSC_COMM_WORLD 215e5c89e4eSSatish Balay 216e5c89e4eSSatish Balay Options Database Keys are the same as for PetscFinalize() 217e5c89e4eSSatish Balay 218e5c89e4eSSatish Balay Level: advanced 219e5c89e4eSSatish Balay 220e5c89e4eSSatish Balay Note: 221e5c89e4eSSatish Balay See PetscInitialize() for more general runtime options. 222e5c89e4eSSatish Balay 22388c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize() 224e5c89e4eSSatish Balay @*/ 2257087cfbeSBarry Smith PetscErrorCode PetscEnd(void) 226e5c89e4eSSatish Balay { 227e5c89e4eSSatish Balay PetscFunctionBegin; 228e5c89e4eSSatish Balay PetscFinalize(); 229e5c89e4eSSatish Balay exit(0); 230e5c89e4eSSatish Balay return 0; 231e5c89e4eSSatish Balay } 232e5c89e4eSSatish Balay 233ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE; 23495c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void); 23595c0884eSLisandro Dalcin PETSC_INTERN PetscBool petscsetmallocvisited; 236e5c89e4eSSatish Balay static char emacsmachinename[256]; 237e5c89e4eSSatish Balay 23802c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL; 23902c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm) = NULL; 240e5c89e4eSSatish Balay 241e5c89e4eSSatish Balay /*@C 242e5c89e4eSSatish Balay PetscSetHelpVersionFunctions - Sets functions that print help and version information 243e5c89e4eSSatish Balay before the PETSc help and version information is printed. Must call BEFORE PetscInitialize(). 244e5c89e4eSSatish Balay This routine enables a "higher-level" package that uses PETSc to print its messages first. 245e5c89e4eSSatish Balay 246d8d19677SJose E. Roman Input Parameters: 2470298fd71SBarry Smith + help - the help function (may be NULL) 2480298fd71SBarry Smith - version - the version function (may be NULL) 249e5c89e4eSSatish Balay 250e5c89e4eSSatish Balay Level: developer 251e5c89e4eSSatish Balay 252e5c89e4eSSatish Balay @*/ 2537087cfbeSBarry Smith PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm)) 254e5c89e4eSSatish Balay { 255e5c89e4eSSatish Balay PetscFunctionBegin; 256e5c89e4eSSatish Balay PetscExternalHelpFunction = help; 257e5c89e4eSSatish Balay PetscExternalVersionFunction = version; 258e5c89e4eSSatish Balay PetscFunctionReturn(0); 259e5c89e4eSSatish Balay } 260e5c89e4eSSatish Balay 26105df10baSBarry Smith #if defined(PETSC_USE_LOG) 26295c0884eSLisandro Dalcin PETSC_INTERN PetscBool PetscObjectsLog; 26305df10baSBarry Smith #endif 26405df10baSBarry Smith 26505035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP. 26605035670SJunchao Zhang Use the following macros to define CUDA/HIP initialization related vars/routines. 26705035670SJunchao Zhang */ 26805035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 26905035670SJunchao Zhang typedef cudaError_t cupmError_t; 27005035670SJunchao Zhang typedef struct cudaDeviceProp cupmDeviceProp; 271a0e72f99SJunchao Zhang typedef cudaStream_t cupmStream_t; 2729ffd0706SHong Zhang typedef cudaEvent_t cupmEvent_t; 27305035670SJunchao Zhang #define cupmGetDeviceCount(x) cudaGetDeviceCount(x) 27405035670SJunchao Zhang #define cupmGetDevice(x) cudaGetDevice(x) 27505035670SJunchao Zhang #define cupmSetDevice(x) cudaSetDevice(x) 27605035670SJunchao Zhang #define cupmSetDeviceFlags(x) cudaSetDeviceFlags(x) 27705035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) cudaGetDeviceProperties(x,y) 278a0e72f99SJunchao Zhang #define cupmStreamCreate(x) cudaStreamCreate(x) 27905035670SJunchao Zhang #define cupmGetLastError() cudaGetLastError() 28005035670SJunchao Zhang #define cupmDeviceMapHost cudaDeviceMapHost 28105035670SJunchao Zhang #define cupmSuccess cudaSuccess 282e57d7714SBarry Smith #define cupmErrorMemoryAllocation cudaErrorMemoryAllocation 283e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources cudaErrorLaunchOutOfResources 28405035670SJunchao Zhang #define cupmErrorSetOnActiveProcess cudaErrorSetOnActiveProcess 28505035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRCUDA(x) 28605035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() PetscCUBLASInitializeHandle() 28705035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() PetscCUSOLVERDnInitializeHandle() 28805035670SJunchao Zhang #define PetscCUPMInitialize PetscCUDAInitialize 28905035670SJunchao Zhang #define PetscCUPMInitialized PetscCUDAInitialized 29005035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscCUDAInitializeCheck 29105035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscCUDAInitializeAndView 29205035670SJunchao Zhang #define PetscCUPMSynchronize PetscCUDASynchronize 29305035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseCUDA 29405035670SJunchao Zhang #define cupmOptionsStr "CUDA options" 2954dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-cuda_device" 29605035670SJunchao Zhang #define cupmViewStr "-cuda_view" 29705035670SJunchao Zhang #define cupmSynchronizeStr "-cuda_synchronize" 29805035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscCUDAInitialize" 29905035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckCUDA 30005035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPICUDAAwarenessCheck 301a0e72f99SJunchao Zhang #define PetscDefaultCupmStream PetscDefaultCudaStream 3029ffd0706SHong Zhang #define cupmEventCreate(x) cudaEventCreate(x) 30305035670SJunchao Zhang #include "cupminit.inc" 30405035670SJunchao Zhang #endif 30505035670SJunchao Zhang 30605035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 30705035670SJunchao Zhang typedef hipError_t cupmError_t; 30805035670SJunchao Zhang typedef hipDeviceProp_t cupmDeviceProp; 309a0e72f99SJunchao Zhang typedef hipStream_t cupmStream_t; 3109ffd0706SHong Zhang typedef hipEvent_t cupmEvent_t; 31105035670SJunchao Zhang #define cupmGetDeviceCount(x) hipGetDeviceCount(x) 31205035670SJunchao Zhang #define cupmGetDevice(x) hipGetDevice(x) 31305035670SJunchao Zhang #define cupmSetDevice(x) hipSetDevice(x) 31405035670SJunchao Zhang #define cupmSetDeviceFlags(x) hipSetDeviceFlags(x) 31505035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) hipGetDeviceProperties(x,y) 316a0e72f99SJunchao Zhang #define cupmStreamCreate(x) hipStreamCreate(x) 3179ffd0706SHong Zhang #define cupmEventCreate(x) hipEventCreate(x); 31805035670SJunchao Zhang #define cupmGetLastError() hipGetLastError() 31905035670SJunchao Zhang #define cupmDeviceMapHost hipDeviceMapHost 32005035670SJunchao Zhang #define cupmSuccess hipSuccess 321e57d7714SBarry Smith #define cupmErrorMemoryAllocation hipErrorMemoryAllocation 322e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources hipErrorLaunchOutOfResources 32305035670SJunchao Zhang #define cupmErrorSetOnActiveProcess hipErrorSetOnActiveProcess 32405035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB) 32505035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() 0 32605035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() 0 32705035670SJunchao Zhang #define PetscCUPMInitialize PetscHIPInitialize 32805035670SJunchao Zhang #define PetscCUPMInitialized PetscHIPInitialized 32905035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscHIPInitializeCheck 33005035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscHIPInitializeAndView 33105035670SJunchao Zhang #define PetscCUPMSynchronize PetscHIPSynchronize 33205035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseHIP 33305035670SJunchao Zhang #define cupmOptionsStr "HIP options" 3344dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-hip_device" 33505035670SJunchao Zhang #define cupmViewStr "-hip_view" 33605035670SJunchao Zhang #define cupmSynchronizeStr "-hip_synchronize" 33705035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscHIPInitialize" 33805035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckHIP 33905035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPIHIPAwarenessCheck 340a0e72f99SJunchao Zhang #define PetscDefaultCupmStream PetscDefaultHipStream 34105035670SJunchao Zhang #include "cupminit.inc" 34205035670SJunchao Zhang #endif 34305035670SJunchao Zhang 34457171095SVaclav Hapla PETSC_INTERN PetscErrorCode PetscOptionsCheckInitial_Private(const char help[]) 345e5c89e4eSSatish Balay { 346e5ed2c37SJose E. Roman char string[64]; 347e5c89e4eSSatish Balay MPI_Comm comm = PETSC_COMM_WORLD; 34805035670SJunchao Zhang PetscBool flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView; 349e5c89e4eSSatish Balay PetscErrorCode ierr; 35067584ceeSBarry Smith PetscReal si; 35128559dc8SJed Brown PetscInt intensity; 352e5c89e4eSSatish Balay int i; 353e5c89e4eSSatish Balay PetscMPIInt rank; 354d314f959SVaclav Hapla char version[256]; 3552479a3a6SBarry Smith #if defined(PETSC_USE_LOG) 356e5ed2c37SJose E. Roman char mname[PETSC_MAX_PATH_LEN]; 3572479a3a6SBarry Smith PetscViewerFormat format; 35867584ceeSBarry Smith PetscBool flg4 = PETSC_FALSE; 35967584ceeSBarry Smith #endif 3607381773fSBarry Smith 361e5c89e4eSSatish Balay PetscFunctionBegin; 362ffc4695bSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 363e5c89e4eSSatish Balay 364*27104ee2SJacob Faibussowitsch /* 365*27104ee2SJacob Faibussowitsch Setup building of stack frames for all function calls 366*27104ee2SJacob Faibussowitsch */ 367*27104ee2SJacob Faibussowitsch if (PetscDefined(USE_DEBUG) && !PetscDefined(HAVE_THREADSAFETY)) { 368*27104ee2SJacob Faibussowitsch ierr = PetscOptionsGetBool(NULL,NULL,"-checkstack",&flg1,NULL);CHKERRQ(ierr); 369*27104ee2SJacob Faibussowitsch ierr = PetscStackSetCheck(flg1);CHKERRQ(ierr); 370*27104ee2SJacob Faibussowitsch } 371*27104ee2SJacob Faibussowitsch 37267584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY) 37392f119d6SBarry Smith if (!(PETSC_RUNNING_ON_VALGRIND)) { 374e5c89e4eSSatish Balay /* 375e5c89e4eSSatish Balay Setup the memory management; support for tracing malloc() usage 376e5c89e4eSSatish Balay */ 377244bdbccSBarry Smith PetscBool mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE; 37892f119d6SBarry Smith 37976bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 38092f119d6SBarry Smith mdebug = PETSC_TRUE; 38192f119d6SBarry Smith initializenan = PETSC_TRUE; 38292f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 38376bd3646SJed Brown } else { 38492f119d6SBarry Smith /* don't warn about unused option */ 38592f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 38692f119d6SBarry Smith flg1 = PETSC_FALSE; 38776bd3646SJed Brown } 38879dccf82SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr); 38992f119d6SBarry Smith if (flg1 || flg2) { 39092f119d6SBarry Smith mdebug = PETSC_TRUE; 39192f119d6SBarry Smith eachcall = PETSC_TRUE; 39292f119d6SBarry Smith initializenan = PETSC_TRUE; 39379dccf82SBarry Smith } else if (flg3 && !flg2) { 39479dccf82SBarry Smith mdebug = PETSC_FALSE; 39579dccf82SBarry Smith eachcall = PETSC_FALSE; 39679dccf82SBarry Smith initializenan = PETSC_FALSE; 397e5c89e4eSSatish Balay } 39892f119d6SBarry Smith 399608c71bfSMatthew G. Knepley ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr); 400608c71bfSMatthew G. Knepley if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);} 401608c71bfSMatthew G. Knepley 40292f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr); 40392f119d6SBarry Smith if (mlog) { 40492f119d6SBarry Smith mdebug = PETSC_TRUE; 40592f119d6SBarry Smith } 40679dccf82SBarry Smith /* the next line is deprecated */ 40792f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr); 40892f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr); 40992f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr); 41092f119d6SBarry Smith if (mdebug) { 41192f119d6SBarry Smith ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr); 41292f119d6SBarry Smith } 41392f119d6SBarry Smith if (mlog) { 41492f119d6SBarry Smith PetscReal logthreshold = 0; 41592f119d6SBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr); 41692f119d6SBarry Smith ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr); 41792f119d6SBarry Smith } 4188b254c29SBarry Smith #if defined(PETSC_USE_LOG) 4198b254c29SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr); 4208b254c29SBarry Smith #endif 42192f119d6SBarry Smith } 42292f119d6SBarry Smith 423ba282f50SJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr); 424ba282f50SJed Brown if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);} 42590d69ab7SBarry Smith flg1 = PETSC_FALSE; 4262f21b5c6SHong Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr); 427cf6f3811SHong Zhang /* ignore this option if malloc is already set */ 428cf6f3811SHong Zhang if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);} 429e5c89e4eSSatish Balay 43090d69ab7SBarry Smith flg1 = PETSC_FALSE; 431c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr); 4327783f70dSSatish Balay if (!flg1) { 43390d69ab7SBarry Smith flg1 = PETSC_FALSE; 434c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr); 4357783f70dSSatish Balay } 436e5c89e4eSSatish Balay if (flg1) { 437e5c89e4eSSatish Balay ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 438e5c89e4eSSatish Balay } 43967584ceeSBarry Smith #endif 440e5c89e4eSSatish Balay 441b4427426SBarry Smith #if defined(PETSC_USE_LOG) 442c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr); 443b4427426SBarry Smith #endif 44405df10baSBarry Smith 445e5c89e4eSSatish Balay /* 446e5c89e4eSSatish Balay Set the display variable for graphics 447e5c89e4eSSatish Balay */ 448e5c89e4eSSatish Balay ierr = PetscSetDisplay();CHKERRQ(ierr); 449e5c89e4eSSatish Balay 45051dcc849SKerry Stevens /* 45157171095SVaclav Hapla Print main application help message 45257171095SVaclav Hapla */ 45357171095SVaclav Hapla ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr); 45457171095SVaclav Hapla if (help && hasHelp) { 45557171095SVaclav Hapla ierr = PetscPrintf(comm,help);CHKERRQ(ierr); 45657171095SVaclav Hapla ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr); 45757171095SVaclav Hapla } 45857171095SVaclav Hapla 45957171095SVaclav Hapla /* 460e5c89e4eSSatish Balay Print the PETSc version information 461e5c89e4eSSatish Balay */ 462d314f959SVaclav Hapla ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr); 463d314f959SVaclav Hapla if (flg1 || hasHelp) { 464e5c89e4eSSatish Balay /* 465e5c89e4eSSatish Balay Print "higher-level" package version message 466e5c89e4eSSatish Balay */ 467e5c89e4eSSatish Balay if (PetscExternalVersionFunction) { 468e5c89e4eSSatish Balay ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 469e5c89e4eSSatish Balay } 470e5c89e4eSSatish Balay 471a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 472e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 473e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 474e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 47584e42920SBarry Smith ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr); 476e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 477e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 478c0bb3764SVaclav Hapla ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr); 4797ca660e7SBarry Smith } 4807ca660e7SBarry Smith 48194941ca7SBarry Smith /* 48294941ca7SBarry Smith Print "higher-level" package help message 48394941ca7SBarry Smith */ 48457171095SVaclav Hapla if (hasHelp) { 485d314f959SVaclav Hapla PetscBool hasHelpIntro; 486d314f959SVaclav Hapla 48794941ca7SBarry Smith if (PetscExternalHelpFunction) { 48894941ca7SBarry Smith ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 48994941ca7SBarry Smith } 490d314f959SVaclav Hapla ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr); 491d314f959SVaclav Hapla if (hasHelpIntro) { 492bdb346e9SBarry Smith ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr); 493008a6e76SBarry Smith ierr = PetscFreeMPIResources();CHKERRQ(ierr); 494ffc4695bSBarry Smith ierr = MPI_Finalize();CHKERRMPI(ierr); 4957ca660e7SBarry Smith exit(0); 4967ca660e7SBarry Smith } 497e5c89e4eSSatish Balay } 498e5c89e4eSSatish Balay 499e5c89e4eSSatish Balay /* 500e5c89e4eSSatish Balay Setup the error handling 501e5c89e4eSSatish Balay */ 50290d69ab7SBarry Smith flg1 = PETSC_FALSE; 503c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr); 504b59baad1SJed Brown if (flg1) { 505ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr); 50602c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 507b59baad1SJed Brown } 50890d69ab7SBarry Smith flg1 = PETSC_FALSE; 509c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr); 51002c9f0b5SLisandro Dalcin if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);} 51190d69ab7SBarry Smith flg1 = PETSC_FALSE; 512c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr); 513e5c89e4eSSatish Balay if (flg1) { 514ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr); 515e5c89e4eSSatish Balay } 51690d69ab7SBarry Smith flg1 = PETSC_FALSE; 517c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr); 5188d359177SBarry Smith if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);} 519e5c89e4eSSatish Balay 520e5c89e4eSSatish Balay /* 521e5c89e4eSSatish Balay Setup debugger information 522e5c89e4eSSatish Balay */ 523e5c89e4eSSatish Balay ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 524589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 525e5c89e4eSSatish Balay if (flg1) { 526e5c89e4eSSatish Balay MPI_Errhandler err_handler; 527e5c89e4eSSatish Balay 528e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 529ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr); 530ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 53102c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr); 532e5c89e4eSSatish Balay } 533589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr); 5345e96ac45SJed Brown if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 535589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 536589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr); 537e5c89e4eSSatish Balay if (flg1 || flg2) { 538e5c89e4eSSatish Balay PetscMPIInt size; 539bf4d2887SBarry Smith PetscInt lsize,*ranks; 540e5c89e4eSSatish Balay MPI_Errhandler err_handler; 541e5c89e4eSSatish Balay /* 542e5c89e4eSSatish Balay we have to make sure that all processors have opened 543e5c89e4eSSatish Balay connections to all other processors, otherwise once the 544e5c89e4eSSatish Balay debugger has stated it is likely to receive a SIGUSR1 545e5c89e4eSSatish Balay and kill the program. 546e5c89e4eSSatish Balay */ 547ffc4695bSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr); 548e5c89e4eSSatish Balay if (size > 2) { 549533163c2SBarry Smith PetscMPIInt dummy = 0; 550e5c89e4eSSatish Balay MPI_Status status; 551e5c89e4eSSatish Balay for (i=0; i<size; i++) { 552e5c89e4eSSatish Balay if (rank != i) { 553ffc4695bSBarry Smith ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr); 554e5c89e4eSSatish Balay } 555e5c89e4eSSatish Balay } 556e5c89e4eSSatish Balay for (i=0; i<size; i++) { 557e5c89e4eSSatish Balay if (rank != i) { 558ffc4695bSBarry Smith ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr); 559e5c89e4eSSatish Balay } 560e5c89e4eSSatish Balay } 561e5c89e4eSSatish Balay } 562e5c89e4eSSatish Balay /* check if this processor node should be in debugger */ 563bf4d2887SBarry Smith ierr = PetscMalloc1(size,&ranks);CHKERRQ(ierr); 564e5c89e4eSSatish Balay lsize = size; 565bf4d2887SBarry Smith /* Deprecated in 3.14 */ 566bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr); 567bf4d2887SBarry Smith if (flag) { 568bf4d2887SBarry Smith const char * const quietopt="-options_suppress_deprecated_warnings"; 569bf4d2887SBarry Smith char msg[4096]; 570bf4d2887SBarry Smith PetscBool quiet = PETSC_FALSE; 571bf4d2887SBarry Smith 572bf4d2887SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr); 573bf4d2887SBarry Smith if (!quiet) { 574bf4d2887SBarry Smith ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr); 575bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr); 576bf4d2887SBarry Smith ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr); 577bf4d2887SBarry Smith ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr); 578bf4d2887SBarry Smith ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr); 579bf4d2887SBarry Smith ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr); 580bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr); 581bf4d2887SBarry Smith ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr); 582bf4d2887SBarry Smith ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr); 583bf4d2887SBarry Smith ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr); 584bf4d2887SBarry Smith ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr); 585bf4d2887SBarry Smith ierr = PetscPrintf(comm,msg);CHKERRQ(ierr); 586bf4d2887SBarry Smith } 587bf4d2887SBarry Smith } else { 588bf4d2887SBarry Smith lsize = size; 589bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr); 590bf4d2887SBarry Smith } 591e5c89e4eSSatish Balay if (flag) { 592e5c89e4eSSatish Balay for (i=0; i<lsize; i++) { 593bf4d2887SBarry Smith if (ranks[i] == rank) { flag = PETSC_FALSE; break; } 594e5c89e4eSSatish Balay } 595e5c89e4eSSatish Balay } 596e5c89e4eSSatish Balay if (!flag) { 597e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 59802c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 599e5c89e4eSSatish Balay if (flg1) { 600e5c89e4eSSatish Balay ierr = PetscAttachDebugger();CHKERRQ(ierr); 601e5c89e4eSSatish Balay } else { 602e5c89e4eSSatish Balay ierr = PetscStopForDebugger();CHKERRQ(ierr); 603e5c89e4eSSatish Balay } 604ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr); 605ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 6062a2a2941SBarry Smith } else { 6072a2a2941SBarry Smith ierr = PetscWaitOnError();CHKERRQ(ierr); 608e5c89e4eSSatish Balay } 609bf4d2887SBarry Smith ierr = PetscFree(ranks);CHKERRQ(ierr); 610e5c89e4eSSatish Balay } 611e5c89e4eSSatish Balay 612589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr); 613dd400576SPatrick Sanan if (flg1 && rank == 0) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);} 614e5c89e4eSSatish Balay 615e5c89e4eSSatish Balay /* 616e5c89e4eSSatish Balay Setup profiling and logging 617e5c89e4eSSatish Balay */ 6186cf91177SBarry Smith #if defined(PETSC_USE_INFO) 6198bb29257SSatish Balay { 620e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr); 621e5c89e4eSSatish Balay } 622865f6aa8SSatish Balay #endif 623aba4c478SBarry Smith ierr = PetscDetermineInitialFPTrap(); 624cc9df77eSBarry Smith flg1 = PETSC_FALSE; 625cc9df77eSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr); 626cc9df77eSBarry Smith if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);} 627cc9df77eSBarry Smith ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr); 628cc9df77eSBarry Smith if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);} 629865f6aa8SSatish Balay #if defined(PETSC_USE_LOG) 630865f6aa8SSatish Balay mname[0] = 0; 631589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 632865f6aa8SSatish Balay if (flg1) { 633865f6aa8SSatish Balay if (mname[0]) { 634f3dea69dSBarry Smith ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 635865f6aa8SSatish Balay } else { 636706d7a88SBarry Smith ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr); 637865f6aa8SSatish Balay } 638865f6aa8SSatish Balay } 639217044c2SLisandro Dalcin 640217044c2SLisandro Dalcin ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr); 641217044c2SLisandro Dalcin 642e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 64390d69ab7SBarry Smith flg1 = PETSC_FALSE; 644c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 645495fc317SBarry Smith if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);} 646e5c89e4eSSatish Balay #endif 64790d69ab7SBarry Smith flg1 = PETSC_FALSE; 64890d69ab7SBarry Smith flg3 = PETSC_FALSE; 649c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr); 650c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 651e5c89e4eSSatish Balay if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 652bb1d7374SBarry Smith else if (flg3) { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);} 653e5c89e4eSSatish Balay 654589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 655e5c89e4eSSatish Balay if (flg1) { 656e5c89e4eSSatish Balay char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 657e5c89e4eSSatish Balay FILE *file; 658e5c89e4eSSatish Balay if (mname[0]) { 6592e924ca5SSatish Balay PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank); 660e5c89e4eSSatish Balay ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 661e5c89e4eSSatish Balay file = fopen(fname,"w"); 662f3dea69dSBarry Smith if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 663a297a907SKarl Rupp } else file = PETSC_STDOUT; 664e5c89e4eSSatish Balay ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 665e5c89e4eSSatish Balay } 666bb1d7374SBarry Smith 66716413a6aSBarry Smith ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr); 668bb1d7374SBarry Smith if (flg4) { 669d0a29bd7SConnor Ward if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) { 670bb1d7374SBarry Smith ierr = PetscLogNestedBegin();CHKERRQ(ierr); 671bb1d7374SBarry Smith } else { 672bb1d7374SBarry Smith ierr = PetscLogDefaultBegin();CHKERRQ(ierr); 673bb1d7374SBarry Smith } 674eccbb886SLisandro Dalcin } 675d0a29bd7SConnor Ward if (flg4 && (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH)) { 676eccbb886SLisandro Dalcin PetscReal threshold = PetscRealConstant(0.01); 677eccbb886SLisandro Dalcin ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr); 678eccbb886SLisandro Dalcin if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);} 679bb1d7374SBarry Smith } 680e5c89e4eSSatish Balay #endif 681e5c89e4eSSatish Balay 682c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr); 68305035670SJunchao Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr); 6848d4e85a7SStefano Zampini /* 68505035670SJunchao Zhang If collecting logging information, by default, wait for device to complete its operations 6868d4e85a7SStefano Zampini before returning to the CPU in order to get accurate timings of each event 6878d4e85a7SStefano Zampini */ 688cae85d06SJunchao Zhang ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr); 68905035670SJunchao Zhang if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);} 6908d4e85a7SStefano Zampini 69105035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 69205035670SJunchao Zhang ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr); 69305035670SJunchao Zhang #endif 694cae85d06SJunchao Zhang 69505035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 69605035670SJunchao Zhang ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr); 6974b0a73b2SBarry Smith #endif 6984b0a73b2SBarry Smith 699e5c89e4eSSatish Balay /* 700e5c89e4eSSatish Balay Print basic help message 701e5c89e4eSSatish Balay */ 70257171095SVaclav Hapla if (hasHelp) { 703e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 704d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr); 705d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr); 706d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr); 707301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr); 708301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," only when run in the debugger\n");CHKERRQ(ierr); 709e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 710e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 711e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 712e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 713e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 714e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 715e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 716bf4d2887SBarry Smith ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr); 717e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 718e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 719e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 7201cda70a7SBarry Smith ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr); 721e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 722e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 723e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 724e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 725e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 72679dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr); 72779dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr); 7284161f2a3SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 72992f119d6SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr); 73079dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr); 73126a7e8d4SBarry Smith ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr); 732e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 733e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 734e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 735e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 736a8c7a070SBarry Smith ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 7370841954dSBarry Smith ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr); 738e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 739e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 740185ae32fSMatthew G. Knepley ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr); 741e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 74256071f75SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr); 743e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 744495fc317SBarry Smith ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr); 745e5c89e4eSSatish Balay #endif 746e94e781bSJacob Faibussowitsch #endif 747e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO) 748fe9b927eSVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr); 749e5c89e4eSSatish Balay #endif 750e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 751c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr); 752c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr); 753e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 754e5c89e4eSSatish Balay } 755e5c89e4eSSatish Balay 75674ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN) 75774ba8654SBarry Smith { 75874ba8654SBarry Smith char machine[128]; 759589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr); 76074ba8654SBarry Smith if (flg1) { 76174ba8654SBarry Smith ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr); 76274ba8654SBarry Smith } 76374ba8654SBarry Smith } 76474ba8654SBarry Smith #endif 76574ba8654SBarry Smith 766c5929fdfSBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 767e5c89e4eSSatish Balay if (flg1) { 768e5c89e4eSSatish Balay ierr = PetscSleep(si);CHKERRQ(ierr); 769e5c89e4eSSatish Balay } 770e5c89e4eSSatish Balay 771fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL) 772c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 773f14045dbSBarry Smith if (!flg3) { 774c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr); 775f14045dbSBarry Smith } 776c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr); 777f14045dbSBarry Smith PetscViennaCLSynchronize = flg3; 778fdc842d1SBarry Smith ierr = PetscViennaCLInit();CHKERRQ(ierr); 7794cf1874eSKarl Rupp #endif 78082f73ecaSAlejandro Lamas Daviña 781fdc842d1SBarry Smith /* 782fdc842d1SBarry Smith Creates the logging data structures; this is enabled even if logging is not turned on 783fdc842d1SBarry Smith This is the last thing we do before returning to the user code to prevent having the 784fdc842d1SBarry Smith logging numbers contaminated by any startup time associated with MPI and the GPUs 785fdc842d1SBarry Smith */ 786fdc842d1SBarry Smith #if defined(PETSC_USE_LOG) 787fdc842d1SBarry Smith ierr = PetscLogInitialize();CHKERRQ(ierr); 788f0a7718cSKarl Rupp #endif 789f0a7718cSKarl Rupp 790e5c89e4eSSatish Balay PetscFunctionReturn(0); 791e5c89e4eSSatish Balay } 792