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> 11022afb99SBarry Smith #include <petscvalgrind.h> 12665c2dedSJed Brown #include <petscviewer.h> 13fdc842d1SBarry Smith #if defined(PETSC_USE_LOG) 14fdc842d1SBarry Smith PETSC_INTERN PetscErrorCode PetscLogInitialize(void); 15fdc842d1SBarry Smith #endif 16ef386f4bSSatish Balay 17ba61063dSBarry Smith #if defined(PETSC_HAVE_SYS_SYSINFO_H) 1851d315f7SKerry Stevens #include <sys/sysinfo.h> 19ba61063dSBarry Smith #endif 20121deb67SSatish Balay #if defined(PETSC_HAVE_UNISTD_H) 2151d315f7SKerry Stevens #include <unistd.h> 22121deb67SSatish Balay #endif 2305035670SJunchao Zhang 24d9b72601SDominic Meiser #if defined(PETSC_HAVE_CUDA) 25d9b72601SDominic Meiser #include <cuda_runtime.h> 2623622779SBarry Smith #include <cuda_runtime_api.h> 2723622779SBarry Smith #include <cuda_device_runtime_api.h> 287fd2f626SJose E. Roman #include <petsccublas.h> 2905035670SJunchao Zhang #endif 3005035670SJunchao Zhang 3105035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 3205035670SJunchao Zhang #include <hip/hip_runtime.h> 3305035670SJunchao Zhang #endif 3405035670SJunchao Zhang 3505035670SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 36c2a741eeSJunchao Zhang #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION) 37c2a741eeSJunchao Zhang #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */ 38c2a741eeSJunchao Zhang #endif 39d9b72601SDominic Meiser #endif 40555d055bSBarry Smith 41f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL) 42f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit(); 43f0a7718cSKarl Rupp #endif 44f0a7718cSKarl Rupp 45e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/ 46e5c89e4eSSatish Balay /* 47e5c89e4eSSatish Balay Indicates if PETSc started up MPI, or it was 48e5c89e4eSSatish Balay already started before PETSc was initialized. 49e5c89e4eSSatish Balay */ 500cbf60d0SJose E. Roman PetscBool PetscBeganMPI = PETSC_FALSE; 518ad20175SVaclav Hapla PetscBool PetscErrorHandlingInitialized = PETSC_FALSE; 520cbf60d0SJose E. Roman PetscBool PetscInitializeCalled = PETSC_FALSE; 530cbf60d0SJose E. Roman PetscBool PetscFinalizeCalled = PETSC_FALSE; 54d6f2c3cbSBarry Smith 557087cfbeSBarry Smith PetscMPIInt PetscGlobalRank = -1; 567087cfbeSBarry Smith PetscMPIInt PetscGlobalSize = -1; 57ba61063dSBarry Smith 58c2b86a48SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS) 59c2b86a48SJunchao Zhang PetscBool PetscBeganKokkos = PETSC_FALSE; 60c2b86a48SJunchao Zhang #endif 61c2b86a48SJunchao Zhang 6271438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM) 6371438e86SJunchao Zhang PetscBool PetscBeganNvshmem = PETSC_FALSE; 6471438e86SJunchao Zhang PetscBool PetscNvshmemInitialized = PETSC_FALSE; 6571438e86SJunchao Zhang #endif 6671438e86SJunchao Zhang 67c2a741eeSJunchao Zhang PetscBool use_gpu_aware_mpi = PETSC_TRUE; 68928a6601SJunchao Zhang PetscBool PetscCreatedGpuObjects = PETSC_FALSE; 69c2a741eeSJunchao Zhang 7050f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX) 71e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE) 72e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */ 73e5c89e4eSSatish Balay #endif 748619c96cSJed Brown 758619c96cSJed Brown /*MC 768619c96cSJed Brown PETSC_i - the imaginary number i 778619c96cSJed Brown 788619c96cSJed Brown Synopsis: 798619c96cSJed Brown #include <petscsys.h> 808619c96cSJed Brown PetscComplex PETSC_i; 818619c96cSJed Brown 828619c96cSJed Brown Level: beginner 838619c96cSJed Brown 848619c96cSJed Brown Note: 858cd53115SBarry Smith Complex numbers are automatically available if PETSc located a working complex implementation 868619c96cSJed Brown 878619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex() 888619c96cSJed Brown M*/ 8950f81f78SJed Brown PetscComplex PETSC_i; 907a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0; 917a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */ 92ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) 93c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0; 94570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 95570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0; 96c90a1750SBarry Smith #endif 977087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0; 98*092991acSStefano Zampini MPI_Datatype MPIU_REAL_INT = 0; 99*092991acSStefano Zampini MPI_Datatype MPIU_SCALAR_INT = 0; 1000354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES) 1017087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0; 10244041f26SJed Brown #endif 1038ad47952SJed Brown MPI_Datatype MPIU_BOOL; 1048ad47952SJed Brown MPI_Datatype MPIU_ENUM; 1057cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR; 106e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T; 10775567043SBarry Smith 108e5c89e4eSSatish Balay /* 109e5c89e4eSSatish Balay Function that is called to display all error messages 110e5c89e4eSSatish Balay */ 1117087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...) = PetscErrorPrintfDefault; 1127087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...) = PetscHelpPrintfDefault; 1137087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list) = PetscVFPrintfDefault; 114bab1f7e6SVictor Minden /* 1154cf1874eSKarl Rupp This is needed to turn on/off GPU synchronization 1168b5db460SBarry Smith */ 1174cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE; 118bab1f7e6SVictor Minden 119e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 120e5c89e4eSSatish Balay /* 121e5c89e4eSSatish Balay Optional file where all PETSc output from various prints is saved 122e5c89e4eSSatish Balay */ 12395c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 1240298fd71SBarry Smith FILE *petsc_history = NULL; 125e5c89e4eSSatish Balay 1267087cfbeSBarry Smith PetscErrorCode PetscOpenHistoryFile(const char filename[],FILE **fd) 127e5c89e4eSSatish Balay { 128e5c89e4eSSatish Balay PetscErrorCode ierr; 129e5c89e4eSSatish Balay PetscMPIInt rank,size; 130e5c89e4eSSatish Balay char pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64]; 131e5c89e4eSSatish Balay char version[256]; 132e5c89e4eSSatish Balay 133e5c89e4eSSatish Balay PetscFunctionBegin; 134ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 135e5c89e4eSSatish Balay if (!rank) { 136e5c89e4eSSatish Balay char arch[10]; 137f56c2debSBarry Smith int err; 138f56c2debSBarry Smith 139e5c89e4eSSatish Balay ierr = PetscGetArchType(arch,10);CHKERRQ(ierr); 140e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 141a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 142ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 143e5c89e4eSSatish Balay if (filename) { 144e5c89e4eSSatish Balay ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr); 145e5c89e4eSSatish Balay } else { 146589a23caSBarry Smith ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr); 147589a23caSBarry Smith ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr); 148e5c89e4eSSatish Balay ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr); 149e5c89e4eSSatish Balay } 150e5c89e4eSSatish Balay 151a297a907SKarl Rupp *fd = fopen(fname,"a"); 152a297a907SKarl Rupp if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname); 153a297a907SKarl Rupp 154c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 155e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr); 156589a23caSBarry Smith ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr); 157e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr); 158c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 159a297a907SKarl Rupp 160f56c2debSBarry Smith err = fflush(*fd); 161e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 162e5c89e4eSSatish Balay } 163e5c89e4eSSatish Balay PetscFunctionReturn(0); 164e5c89e4eSSatish Balay } 165e5c89e4eSSatish Balay 16695c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd) 167e5c89e4eSSatish Balay { 168e5c89e4eSSatish Balay PetscErrorCode ierr; 169e5c89e4eSSatish Balay PetscMPIInt rank; 170e5c89e4eSSatish Balay char date[64]; 171f56c2debSBarry Smith int err; 172e5c89e4eSSatish Balay 173e5c89e4eSSatish Balay PetscFunctionBegin; 174ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 175e5c89e4eSSatish Balay if (!rank) { 176e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 177c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 178e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr); 179c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 180f56c2debSBarry Smith err = fflush(*fd); 181e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 182f56c2debSBarry Smith err = fclose(*fd); 183e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 184e5c89e4eSSatish Balay } 185e5c89e4eSSatish Balay PetscFunctionReturn(0); 186e5c89e4eSSatish Balay } 187e5c89e4eSSatish Balay 188e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 189e5c89e4eSSatish Balay 190e5c89e4eSSatish Balay /* 191e5c89e4eSSatish Balay This is ugly and probably belongs somewhere else, but I want to 192e5c89e4eSSatish Balay be able to put a true MPI abort error handler with command line args. 193e5c89e4eSSatish Balay 194e5c89e4eSSatish Balay This is so MPI errors in the debugger will leave all the stack 1953c311c98SBarry Smith frames. The default MP_Abort() cleans up and exits thus providing no useful information 1963c311c98SBarry Smith in the debugger hence we call abort() instead of MPI_Abort(). 197e5c89e4eSSatish Balay */ 198e5c89e4eSSatish Balay 19933c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 200e5c89e4eSSatish Balay { 201e5c89e4eSSatish Balay PetscFunctionBegin; 2023c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 203e5c89e4eSSatish Balay abort(); 204e5c89e4eSSatish Balay } 205e5c89e4eSSatish Balay 20633c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 207e5c89e4eSSatish Balay { 208e5c89e4eSSatish Balay PetscErrorCode ierr; 209e5c89e4eSSatish Balay 210e5c89e4eSSatish Balay PetscFunctionBegin; 2113c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 212e5c89e4eSSatish Balay ierr = PetscAttachDebugger(); 21341e02c4dSJunchao Zhang if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */ 214e5c89e4eSSatish Balay } 215e5c89e4eSSatish Balay 216e5c89e4eSSatish Balay /*@C 217e5c89e4eSSatish Balay PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one 218e5c89e4eSSatish Balay wishes a clean exit somewhere deep in the program. 219e5c89e4eSSatish Balay 220e5c89e4eSSatish Balay Collective on PETSC_COMM_WORLD 221e5c89e4eSSatish Balay 222e5c89e4eSSatish Balay Options Database Keys are the same as for PetscFinalize() 223e5c89e4eSSatish Balay 224e5c89e4eSSatish Balay Level: advanced 225e5c89e4eSSatish Balay 226e5c89e4eSSatish Balay Note: 227e5c89e4eSSatish Balay See PetscInitialize() for more general runtime options. 228e5c89e4eSSatish Balay 22988c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize() 230e5c89e4eSSatish Balay @*/ 2317087cfbeSBarry Smith PetscErrorCode PetscEnd(void) 232e5c89e4eSSatish Balay { 233e5c89e4eSSatish Balay PetscFunctionBegin; 234e5c89e4eSSatish Balay PetscFinalize(); 235e5c89e4eSSatish Balay exit(0); 236e5c89e4eSSatish Balay return 0; 237e5c89e4eSSatish Balay } 238e5c89e4eSSatish Balay 239ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE; 24095c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void); 24195c0884eSLisandro Dalcin PETSC_INTERN PetscBool petscsetmallocvisited; 242e5c89e4eSSatish Balay static char emacsmachinename[256]; 243e5c89e4eSSatish Balay 24402c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL; 24502c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm) = NULL; 246e5c89e4eSSatish Balay 247e5c89e4eSSatish Balay /*@C 248e5c89e4eSSatish Balay PetscSetHelpVersionFunctions - Sets functions that print help and version information 249e5c89e4eSSatish Balay before the PETSc help and version information is printed. Must call BEFORE PetscInitialize(). 250e5c89e4eSSatish Balay This routine enables a "higher-level" package that uses PETSc to print its messages first. 251e5c89e4eSSatish Balay 252e5c89e4eSSatish Balay Input Parameter: 2530298fd71SBarry Smith + help - the help function (may be NULL) 2540298fd71SBarry Smith - version - the version function (may be NULL) 255e5c89e4eSSatish Balay 256e5c89e4eSSatish Balay Level: developer 257e5c89e4eSSatish Balay 258e5c89e4eSSatish Balay @*/ 2597087cfbeSBarry Smith PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm)) 260e5c89e4eSSatish Balay { 261e5c89e4eSSatish Balay PetscFunctionBegin; 262e5c89e4eSSatish Balay PetscExternalHelpFunction = help; 263e5c89e4eSSatish Balay PetscExternalVersionFunction = version; 264e5c89e4eSSatish Balay PetscFunctionReturn(0); 265e5c89e4eSSatish Balay } 266e5c89e4eSSatish Balay 26705df10baSBarry Smith #if defined(PETSC_USE_LOG) 26895c0884eSLisandro Dalcin PETSC_INTERN PetscBool PetscObjectsLog; 26905df10baSBarry Smith #endif 27005df10baSBarry Smith 27105035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP. 27205035670SJunchao Zhang Use the following macros to define CUDA/HIP initialization related vars/routines. 27305035670SJunchao Zhang */ 27405035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 27505035670SJunchao Zhang typedef cudaError_t cupmError_t; 27605035670SJunchao Zhang typedef struct cudaDeviceProp cupmDeviceProp; 277a0e72f99SJunchao Zhang typedef cudaStream_t cupmStream_t; 2789ffd0706SHong Zhang typedef cudaEvent_t cupmEvent_t; 27905035670SJunchao Zhang #define cupmGetDeviceCount(x) cudaGetDeviceCount(x) 28005035670SJunchao Zhang #define cupmGetDevice(x) cudaGetDevice(x) 28105035670SJunchao Zhang #define cupmSetDevice(x) cudaSetDevice(x) 28205035670SJunchao Zhang #define cupmSetDeviceFlags(x) cudaSetDeviceFlags(x) 28305035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) cudaGetDeviceProperties(x,y) 284a0e72f99SJunchao Zhang #define cupmStreamCreate(x) cudaStreamCreate(x) 28505035670SJunchao Zhang #define cupmGetLastError() cudaGetLastError() 28605035670SJunchao Zhang #define cupmDeviceMapHost cudaDeviceMapHost 28705035670SJunchao Zhang #define cupmSuccess cudaSuccess 288e57d7714SBarry Smith #define cupmErrorMemoryAllocation cudaErrorMemoryAllocation 289e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources cudaErrorLaunchOutOfResources 29005035670SJunchao Zhang #define cupmErrorSetOnActiveProcess cudaErrorSetOnActiveProcess 29105035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRCUDA(x) 29205035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() PetscCUBLASInitializeHandle() 29305035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() PetscCUSOLVERDnInitializeHandle() 29405035670SJunchao Zhang #define PetscCUPMInitialize PetscCUDAInitialize 29505035670SJunchao Zhang #define PetscCUPMInitialized PetscCUDAInitialized 29605035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscCUDAInitializeCheck 29705035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscCUDAInitializeAndView 29805035670SJunchao Zhang #define PetscCUPMSynchronize PetscCUDASynchronize 29905035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseCUDA 30005035670SJunchao Zhang #define cupmOptionsStr "CUDA options" 3014dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-cuda_device" 30205035670SJunchao Zhang #define cupmViewStr "-cuda_view" 30305035670SJunchao Zhang #define cupmSynchronizeStr "-cuda_synchronize" 30405035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscCUDAInitialize" 30505035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckCUDA 30605035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPICUDAAwarenessCheck 307a0e72f99SJunchao Zhang #define PetscDefaultCupmStream PetscDefaultCudaStream 3089ffd0706SHong Zhang #define cupmEventCreate(x) cudaEventCreate(x) 30905035670SJunchao Zhang #include "cupminit.inc" 31005035670SJunchao Zhang #endif 31105035670SJunchao Zhang 31205035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 31305035670SJunchao Zhang typedef hipError_t cupmError_t; 31405035670SJunchao Zhang typedef hipDeviceProp_t cupmDeviceProp; 315a0e72f99SJunchao Zhang typedef hipStream_t cupmStream_t; 3169ffd0706SHong Zhang typedef hipEvent_t cupmEvent_t; 31705035670SJunchao Zhang #define cupmGetDeviceCount(x) hipGetDeviceCount(x) 31805035670SJunchao Zhang #define cupmGetDevice(x) hipGetDevice(x) 31905035670SJunchao Zhang #define cupmSetDevice(x) hipSetDevice(x) 32005035670SJunchao Zhang #define cupmSetDeviceFlags(x) hipSetDeviceFlags(x) 32105035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) hipGetDeviceProperties(x,y) 322a0e72f99SJunchao Zhang #define cupmStreamCreate(x) hipStreamCreate(x) 3239ffd0706SHong Zhang #define cupmEventCreate(x) hipEventCreate(x); 32405035670SJunchao Zhang #define cupmGetLastError() hipGetLastError() 32505035670SJunchao Zhang #define cupmDeviceMapHost hipDeviceMapHost 32605035670SJunchao Zhang #define cupmSuccess hipSuccess 327e57d7714SBarry Smith #define cupmErrorMemoryAllocation hipErrorMemoryAllocation 328e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources hipErrorLaunchOutOfResources 32905035670SJunchao Zhang #define cupmErrorSetOnActiveProcess hipErrorSetOnActiveProcess 33005035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB) 33105035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() 0 33205035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() 0 33305035670SJunchao Zhang #define PetscCUPMInitialize PetscHIPInitialize 33405035670SJunchao Zhang #define PetscCUPMInitialized PetscHIPInitialized 33505035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscHIPInitializeCheck 33605035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscHIPInitializeAndView 33705035670SJunchao Zhang #define PetscCUPMSynchronize PetscHIPSynchronize 33805035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseHIP 33905035670SJunchao Zhang #define cupmOptionsStr "HIP options" 3404dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-hip_device" 34105035670SJunchao Zhang #define cupmViewStr "-hip_view" 34205035670SJunchao Zhang #define cupmSynchronizeStr "-hip_synchronize" 34305035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscHIPInitialize" 34405035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckHIP 34505035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPIHIPAwarenessCheck 346a0e72f99SJunchao Zhang #define PetscDefaultCupmStream PetscDefaultHipStream 34705035670SJunchao Zhang #include "cupminit.inc" 34805035670SJunchao Zhang #endif 34905035670SJunchao Zhang 35057171095SVaclav Hapla PETSC_INTERN PetscErrorCode PetscOptionsCheckInitial_Private(const char help[]) 351e5c89e4eSSatish Balay { 352e5ed2c37SJose E. Roman char string[64]; 353e5c89e4eSSatish Balay MPI_Comm comm = PETSC_COMM_WORLD; 35405035670SJunchao Zhang PetscBool flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView; 355e5c89e4eSSatish Balay PetscErrorCode ierr; 35667584ceeSBarry Smith PetscReal si; 35728559dc8SJed Brown PetscInt intensity; 358e5c89e4eSSatish Balay int i; 359e5c89e4eSSatish Balay PetscMPIInt rank; 360d314f959SVaclav Hapla char version[256]; 3612479a3a6SBarry Smith #if defined(PETSC_USE_LOG) 362e5ed2c37SJose E. Roman char mname[PETSC_MAX_PATH_LEN]; 3632479a3a6SBarry Smith PetscViewerFormat format; 36467584ceeSBarry Smith PetscBool flg4 = PETSC_FALSE; 36567584ceeSBarry Smith #endif 3667381773fSBarry Smith 367e5c89e4eSSatish Balay PetscFunctionBegin; 368ffc4695bSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 369e5c89e4eSSatish Balay 37067584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY) 37192f119d6SBarry Smith if (!(PETSC_RUNNING_ON_VALGRIND)) { 372e5c89e4eSSatish Balay /* 373e5c89e4eSSatish Balay Setup the memory management; support for tracing malloc() usage 374e5c89e4eSSatish Balay */ 375244bdbccSBarry Smith PetscBool mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE; 37692f119d6SBarry Smith 37776bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 37892f119d6SBarry Smith mdebug = PETSC_TRUE; 37992f119d6SBarry Smith initializenan = PETSC_TRUE; 38092f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 38176bd3646SJed Brown } else { 38292f119d6SBarry Smith /* don't warn about unused option */ 38392f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 38492f119d6SBarry Smith flg1 = PETSC_FALSE; 38576bd3646SJed Brown } 38679dccf82SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr); 38792f119d6SBarry Smith if (flg1 || flg2) { 38892f119d6SBarry Smith mdebug = PETSC_TRUE; 38992f119d6SBarry Smith eachcall = PETSC_TRUE; 39092f119d6SBarry Smith initializenan = PETSC_TRUE; 39179dccf82SBarry Smith } else if (flg3 && !flg2) { 39279dccf82SBarry Smith mdebug = PETSC_FALSE; 39379dccf82SBarry Smith eachcall = PETSC_FALSE; 39479dccf82SBarry Smith initializenan = PETSC_FALSE; 395e5c89e4eSSatish Balay } 39692f119d6SBarry Smith 397608c71bfSMatthew G. Knepley ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr); 398608c71bfSMatthew G. Knepley if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);} 399608c71bfSMatthew G. Knepley 40092f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr); 40192f119d6SBarry Smith if (mlog) { 40292f119d6SBarry Smith mdebug = PETSC_TRUE; 40392f119d6SBarry Smith } 40479dccf82SBarry Smith /* the next line is deprecated */ 40592f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr); 40692f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr); 40792f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr); 40892f119d6SBarry Smith if (mdebug) { 40992f119d6SBarry Smith ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr); 41092f119d6SBarry Smith } 41192f119d6SBarry Smith if (mlog) { 41292f119d6SBarry Smith PetscReal logthreshold = 0; 41392f119d6SBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr); 41492f119d6SBarry Smith ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr); 41592f119d6SBarry Smith } 4168b254c29SBarry Smith #if defined(PETSC_USE_LOG) 4178b254c29SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr); 4188b254c29SBarry Smith #endif 41992f119d6SBarry Smith } 42092f119d6SBarry Smith 421ba282f50SJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr); 422ba282f50SJed Brown if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);} 42390d69ab7SBarry Smith flg1 = PETSC_FALSE; 4242f21b5c6SHong Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr); 425cf6f3811SHong Zhang /* ignore this option if malloc is already set */ 426cf6f3811SHong Zhang if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);} 427e5c89e4eSSatish Balay 42890d69ab7SBarry Smith flg1 = PETSC_FALSE; 429c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr); 4307783f70dSSatish Balay if (!flg1) { 43190d69ab7SBarry Smith flg1 = PETSC_FALSE; 432c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr); 4337783f70dSSatish Balay } 434e5c89e4eSSatish Balay if (flg1) { 435e5c89e4eSSatish Balay ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 436e5c89e4eSSatish Balay } 43767584ceeSBarry Smith #endif 438e5c89e4eSSatish Balay 439b4427426SBarry Smith #if defined(PETSC_USE_LOG) 440c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr); 441b4427426SBarry Smith #endif 44205df10baSBarry Smith 443e5c89e4eSSatish Balay /* 444e5c89e4eSSatish Balay Set the display variable for graphics 445e5c89e4eSSatish Balay */ 446e5c89e4eSSatish Balay ierr = PetscSetDisplay();CHKERRQ(ierr); 447e5c89e4eSSatish Balay 44851dcc849SKerry Stevens /* 44957171095SVaclav Hapla Print main application help message 45057171095SVaclav Hapla */ 45157171095SVaclav Hapla ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr); 45257171095SVaclav Hapla if (help && hasHelp) { 45357171095SVaclav Hapla ierr = PetscPrintf(comm,help);CHKERRQ(ierr); 45457171095SVaclav Hapla ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr); 45557171095SVaclav Hapla } 45657171095SVaclav Hapla 45757171095SVaclav Hapla /* 458e5c89e4eSSatish Balay Print the PETSc version information 459e5c89e4eSSatish Balay */ 460d314f959SVaclav Hapla ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr); 461d314f959SVaclav Hapla if (flg1 || hasHelp) { 462e5c89e4eSSatish Balay /* 463e5c89e4eSSatish Balay Print "higher-level" package version message 464e5c89e4eSSatish Balay */ 465e5c89e4eSSatish Balay if (PetscExternalVersionFunction) { 466e5c89e4eSSatish Balay ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 467e5c89e4eSSatish Balay } 468e5c89e4eSSatish Balay 469a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 470e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 471e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 472e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 47384e42920SBarry Smith ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr); 474e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 475e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 476c0bb3764SVaclav Hapla ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr); 4777ca660e7SBarry Smith } 4787ca660e7SBarry Smith 47994941ca7SBarry Smith /* 48094941ca7SBarry Smith Print "higher-level" package help message 48194941ca7SBarry Smith */ 48257171095SVaclav Hapla if (hasHelp) { 483d314f959SVaclav Hapla PetscBool hasHelpIntro; 484d314f959SVaclav Hapla 48594941ca7SBarry Smith if (PetscExternalHelpFunction) { 48694941ca7SBarry Smith ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 48794941ca7SBarry Smith } 488d314f959SVaclav Hapla ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr); 489d314f959SVaclav Hapla if (hasHelpIntro) { 490bdb346e9SBarry Smith ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr); 491008a6e76SBarry Smith ierr = PetscFreeMPIResources();CHKERRQ(ierr); 492ffc4695bSBarry Smith ierr = MPI_Finalize();CHKERRMPI(ierr); 4937ca660e7SBarry Smith exit(0); 4947ca660e7SBarry Smith } 495e5c89e4eSSatish Balay } 496e5c89e4eSSatish Balay 497e5c89e4eSSatish Balay /* 498e5c89e4eSSatish Balay Setup the error handling 499e5c89e4eSSatish Balay */ 50090d69ab7SBarry Smith flg1 = PETSC_FALSE; 501c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr); 502b59baad1SJed Brown if (flg1) { 503ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr); 50402c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 505b59baad1SJed Brown } 50690d69ab7SBarry Smith flg1 = PETSC_FALSE; 507c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr); 50802c9f0b5SLisandro Dalcin if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);} 50990d69ab7SBarry Smith flg1 = PETSC_FALSE; 510c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr); 511e5c89e4eSSatish Balay if (flg1) { 512ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr); 513e5c89e4eSSatish Balay } 51490d69ab7SBarry Smith flg1 = PETSC_FALSE; 515c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr); 5168d359177SBarry Smith if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);} 517e5c89e4eSSatish Balay 518e5c89e4eSSatish Balay /* 519e5c89e4eSSatish Balay Setup debugger information 520e5c89e4eSSatish Balay */ 521e5c89e4eSSatish Balay ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 522589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 523e5c89e4eSSatish Balay if (flg1) { 524e5c89e4eSSatish Balay MPI_Errhandler err_handler; 525e5c89e4eSSatish Balay 526e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 527ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr); 528ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 52902c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr); 530e5c89e4eSSatish Balay } 531589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr); 5325e96ac45SJed Brown if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 533589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 534589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr); 535e5c89e4eSSatish Balay if (flg1 || flg2) { 536e5c89e4eSSatish Balay PetscMPIInt size; 537bf4d2887SBarry Smith PetscInt lsize,*ranks; 538e5c89e4eSSatish Balay MPI_Errhandler err_handler; 539e5c89e4eSSatish Balay /* 540e5c89e4eSSatish Balay we have to make sure that all processors have opened 541e5c89e4eSSatish Balay connections to all other processors, otherwise once the 542e5c89e4eSSatish Balay debugger has stated it is likely to receive a SIGUSR1 543e5c89e4eSSatish Balay and kill the program. 544e5c89e4eSSatish Balay */ 545ffc4695bSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr); 546e5c89e4eSSatish Balay if (size > 2) { 547533163c2SBarry Smith PetscMPIInt dummy = 0; 548e5c89e4eSSatish Balay MPI_Status status; 549e5c89e4eSSatish Balay for (i=0; i<size; i++) { 550e5c89e4eSSatish Balay if (rank != i) { 551ffc4695bSBarry Smith ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr); 552e5c89e4eSSatish Balay } 553e5c89e4eSSatish Balay } 554e5c89e4eSSatish Balay for (i=0; i<size; i++) { 555e5c89e4eSSatish Balay if (rank != i) { 556ffc4695bSBarry Smith ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr); 557e5c89e4eSSatish Balay } 558e5c89e4eSSatish Balay } 559e5c89e4eSSatish Balay } 560e5c89e4eSSatish Balay /* check if this processor node should be in debugger */ 561bf4d2887SBarry Smith ierr = PetscMalloc1(size,&ranks);CHKERRQ(ierr); 562e5c89e4eSSatish Balay lsize = size; 563bf4d2887SBarry Smith /* Deprecated in 3.14 */ 564bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr); 565bf4d2887SBarry Smith if (flag) { 566bf4d2887SBarry Smith const char * const quietopt="-options_suppress_deprecated_warnings"; 567bf4d2887SBarry Smith char msg[4096]; 568bf4d2887SBarry Smith PetscBool quiet = PETSC_FALSE; 569bf4d2887SBarry Smith 570bf4d2887SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr); 571bf4d2887SBarry Smith if (!quiet) { 572bf4d2887SBarry Smith ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr); 573bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr); 574bf4d2887SBarry Smith ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr); 575bf4d2887SBarry Smith ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr); 576bf4d2887SBarry Smith ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr); 577bf4d2887SBarry Smith ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr); 578bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr); 579bf4d2887SBarry Smith ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr); 580bf4d2887SBarry Smith ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr); 581bf4d2887SBarry Smith ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr); 582bf4d2887SBarry Smith ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr); 583bf4d2887SBarry Smith ierr = PetscPrintf(comm,msg);CHKERRQ(ierr); 584bf4d2887SBarry Smith } 585bf4d2887SBarry Smith } else { 586bf4d2887SBarry Smith lsize = size; 587bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr); 588bf4d2887SBarry Smith } 589e5c89e4eSSatish Balay if (flag) { 590e5c89e4eSSatish Balay for (i=0; i<lsize; i++) { 591bf4d2887SBarry Smith if (ranks[i] == rank) { flag = PETSC_FALSE; break; } 592e5c89e4eSSatish Balay } 593e5c89e4eSSatish Balay } 594e5c89e4eSSatish Balay if (!flag) { 595e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 59602c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 597e5c89e4eSSatish Balay if (flg1) { 598e5c89e4eSSatish Balay ierr = PetscAttachDebugger();CHKERRQ(ierr); 599e5c89e4eSSatish Balay } else { 600e5c89e4eSSatish Balay ierr = PetscStopForDebugger();CHKERRQ(ierr); 601e5c89e4eSSatish Balay } 602ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr); 603ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 6042a2a2941SBarry Smith } else { 6052a2a2941SBarry Smith ierr = PetscWaitOnError();CHKERRQ(ierr); 606e5c89e4eSSatish Balay } 607bf4d2887SBarry Smith ierr = PetscFree(ranks);CHKERRQ(ierr); 608e5c89e4eSSatish Balay } 609e5c89e4eSSatish Balay 610589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr); 611cb9801acSJed Brown if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);} 612e5c89e4eSSatish Balay 613e5c89e4eSSatish Balay /* 614e5c89e4eSSatish Balay Setup profiling and logging 615e5c89e4eSSatish Balay */ 6166cf91177SBarry Smith #if defined(PETSC_USE_INFO) 6178bb29257SSatish Balay { 618e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr); 619e5c89e4eSSatish Balay } 620865f6aa8SSatish Balay #endif 621aba4c478SBarry Smith ierr = PetscDetermineInitialFPTrap(); 622cc9df77eSBarry Smith flg1 = PETSC_FALSE; 623cc9df77eSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr); 624cc9df77eSBarry Smith if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);} 625cc9df77eSBarry Smith ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr); 626cc9df77eSBarry Smith if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);} 627865f6aa8SSatish Balay #if defined(PETSC_USE_LOG) 628865f6aa8SSatish Balay mname[0] = 0; 629589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 630865f6aa8SSatish Balay if (flg1) { 631865f6aa8SSatish Balay if (mname[0]) { 632f3dea69dSBarry Smith ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 633865f6aa8SSatish Balay } else { 634706d7a88SBarry Smith ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr); 635865f6aa8SSatish Balay } 636865f6aa8SSatish Balay } 637217044c2SLisandro Dalcin 638217044c2SLisandro Dalcin ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr); 639217044c2SLisandro Dalcin 640e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 64190d69ab7SBarry Smith flg1 = PETSC_FALSE; 642c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 643495fc317SBarry Smith if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);} 644e5c89e4eSSatish Balay #endif 64590d69ab7SBarry Smith flg1 = PETSC_FALSE; 64690d69ab7SBarry Smith flg3 = PETSC_FALSE; 647c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr); 648c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 649e5c89e4eSSatish Balay if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 650bb1d7374SBarry Smith else if (flg3) { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);} 651e5c89e4eSSatish Balay 652589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 653e5c89e4eSSatish Balay if (flg1) { 654e5c89e4eSSatish Balay char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 655e5c89e4eSSatish Balay FILE *file; 656e5c89e4eSSatish Balay if (mname[0]) { 6572e924ca5SSatish Balay PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank); 658e5c89e4eSSatish Balay ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 659e5c89e4eSSatish Balay file = fopen(fname,"w"); 660f3dea69dSBarry Smith if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 661a297a907SKarl Rupp } else file = PETSC_STDOUT; 662e5c89e4eSSatish Balay ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 663e5c89e4eSSatish Balay } 664bb1d7374SBarry Smith 66516413a6aSBarry Smith ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr); 666bb1d7374SBarry Smith if (flg4) { 667d0a29bd7SConnor Ward if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) { 668bb1d7374SBarry Smith ierr = PetscLogNestedBegin();CHKERRQ(ierr); 669bb1d7374SBarry Smith } else { 670bb1d7374SBarry Smith ierr = PetscLogDefaultBegin();CHKERRQ(ierr); 671bb1d7374SBarry Smith } 672eccbb886SLisandro Dalcin } 673d0a29bd7SConnor Ward if (flg4 && (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH)) { 674eccbb886SLisandro Dalcin PetscReal threshold = PetscRealConstant(0.01); 675eccbb886SLisandro Dalcin ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr); 676eccbb886SLisandro Dalcin if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);} 677bb1d7374SBarry Smith } 678e5c89e4eSSatish Balay #endif 679e5c89e4eSSatish Balay 680c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr); 68105035670SJunchao Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr); 6828d4e85a7SStefano Zampini /* 68305035670SJunchao Zhang If collecting logging information, by default, wait for device to complete its operations 6848d4e85a7SStefano Zampini before returning to the CPU in order to get accurate timings of each event 6858d4e85a7SStefano Zampini */ 686cae85d06SJunchao Zhang ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr); 68705035670SJunchao Zhang if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);} 6888d4e85a7SStefano Zampini 68905035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 69005035670SJunchao Zhang ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr); 69105035670SJunchao Zhang #endif 692cae85d06SJunchao Zhang 69305035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 69405035670SJunchao Zhang ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr); 6954b0a73b2SBarry Smith #endif 6964b0a73b2SBarry Smith 697e5c89e4eSSatish Balay /* 698e5c89e4eSSatish Balay Print basic help message 699e5c89e4eSSatish Balay */ 70057171095SVaclav Hapla if (hasHelp) { 701e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 702d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr); 703d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr); 704d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr); 705301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr); 706301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," only when run in the debugger\n");CHKERRQ(ierr); 707e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 708e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 709e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 710e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 711e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 712e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 713e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 714bf4d2887SBarry Smith ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr); 715e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 716e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 717e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 7181cda70a7SBarry Smith ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr); 719e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 720e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 721e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 722e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 723e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 72479dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr); 72579dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr); 7264161f2a3SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 72792f119d6SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr); 72879dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr); 72926a7e8d4SBarry Smith ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr); 730e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 731e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 732e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 733e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 734a8c7a070SBarry Smith ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 7350841954dSBarry Smith ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr); 736e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 737e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 738185ae32fSMatthew G. Knepley ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr); 739e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 74056071f75SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr); 741e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 742495fc317SBarry Smith ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr); 743e5c89e4eSSatish Balay #endif 744e94e781bSJacob Faibussowitsch #endif 745e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO) 746fe9b927eSVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr); 747e5c89e4eSSatish Balay #endif 748e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 749c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr); 750c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr); 751e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 752e5c89e4eSSatish Balay } 753e5c89e4eSSatish Balay 75474ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN) 75574ba8654SBarry Smith { 75674ba8654SBarry Smith char machine[128]; 757589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr); 75874ba8654SBarry Smith if (flg1) { 75974ba8654SBarry Smith ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr); 76074ba8654SBarry Smith } 76174ba8654SBarry Smith } 76274ba8654SBarry Smith #endif 76374ba8654SBarry Smith 764c5929fdfSBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 765e5c89e4eSSatish Balay if (flg1) { 766e5c89e4eSSatish Balay ierr = PetscSleep(si);CHKERRQ(ierr); 767e5c89e4eSSatish Balay } 768e5c89e4eSSatish Balay 769fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL) 770c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 771f14045dbSBarry Smith if (!flg3) { 772c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr); 773f14045dbSBarry Smith } 774c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr); 775f14045dbSBarry Smith PetscViennaCLSynchronize = flg3; 776fdc842d1SBarry Smith ierr = PetscViennaCLInit();CHKERRQ(ierr); 7774cf1874eSKarl Rupp #endif 77882f73ecaSAlejandro Lamas Daviña 779fdc842d1SBarry Smith /* 780fdc842d1SBarry Smith Creates the logging data structures; this is enabled even if logging is not turned on 781fdc842d1SBarry Smith This is the last thing we do before returning to the user code to prevent having the 782fdc842d1SBarry Smith logging numbers contaminated by any startup time associated with MPI and the GPUs 783fdc842d1SBarry Smith */ 784fdc842d1SBarry Smith #if defined(PETSC_USE_LOG) 785fdc842d1SBarry Smith ierr = PetscLogInitialize();CHKERRQ(ierr); 786f0a7718cSKarl Rupp #endif 787f0a7718cSKarl Rupp 788e5c89e4eSSatish Balay PetscFunctionReturn(0); 789e5c89e4eSSatish Balay } 790