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> 267fd2f626SJose E. Roman #include <petsccublas.h> 2705035670SJunchao Zhang #endif 2805035670SJunchao Zhang 2905035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 3005035670SJunchao Zhang #include <hip/hip_runtime.h> 3105035670SJunchao Zhang #endif 3205035670SJunchao Zhang 3305035670SJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 34c2a741eeSJunchao Zhang #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION) 35c2a741eeSJunchao Zhang #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */ 36c2a741eeSJunchao Zhang #endif 37d9b72601SDominic Meiser #endif 38555d055bSBarry Smith 39f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL) 40f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit(); 41f0a7718cSKarl Rupp #endif 42f0a7718cSKarl Rupp 4305035670SJunchao Zhang 44e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/ 45e5c89e4eSSatish Balay /* 46e5c89e4eSSatish Balay Indicates if PETSc started up MPI, or it was 47e5c89e4eSSatish Balay already started before PETSc was initialized. 48e5c89e4eSSatish Balay */ 490cbf60d0SJose E. Roman PetscBool PetscBeganMPI = PETSC_FALSE; 508ad20175SVaclav Hapla PetscBool PetscErrorHandlingInitialized = PETSC_FALSE; 510cbf60d0SJose E. Roman PetscBool PetscInitializeCalled = PETSC_FALSE; 520cbf60d0SJose E. Roman PetscBool PetscFinalizeCalled = PETSC_FALSE; 53d6f2c3cbSBarry Smith 547087cfbeSBarry Smith PetscMPIInt PetscGlobalRank = -1; 557087cfbeSBarry Smith PetscMPIInt PetscGlobalSize = -1; 56ba61063dSBarry Smith 57c2b86a48SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS) 58c2b86a48SJunchao Zhang PetscBool PetscBeganKokkos = PETSC_FALSE; 59c2b86a48SJunchao Zhang #endif 60c2b86a48SJunchao Zhang 61c2a741eeSJunchao Zhang PetscBool use_gpu_aware_mpi = PETSC_TRUE; 62928a6601SJunchao Zhang PetscBool PetscCreatedGpuObjects = PETSC_FALSE; 63c2a741eeSJunchao Zhang 6450f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX) 65e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE) 66e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */ 67e5c89e4eSSatish Balay #endif 688619c96cSJed Brown 698619c96cSJed Brown /*MC 708619c96cSJed Brown PETSC_i - the imaginary number i 718619c96cSJed Brown 728619c96cSJed Brown Synopsis: 738619c96cSJed Brown #include <petscsys.h> 748619c96cSJed Brown PetscComplex PETSC_i; 758619c96cSJed Brown 768619c96cSJed Brown Level: beginner 778619c96cSJed Brown 788619c96cSJed Brown Note: 798cd53115SBarry Smith Complex numbers are automatically available if PETSc located a working complex implementation 808619c96cSJed Brown 818619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex() 828619c96cSJed Brown M*/ 8350f81f78SJed Brown PetscComplex PETSC_i; 847a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0; 857a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */ 86ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) 87c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0; 88570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 89570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0; 90c90a1750SBarry Smith #endif 917087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0; 920354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES) 937087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0; 9444041f26SJed Brown #endif 958ad47952SJed Brown MPI_Datatype MPIU_BOOL; 968ad47952SJed Brown MPI_Datatype MPIU_ENUM; 977cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR; 98e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T; 9975567043SBarry Smith 100e5c89e4eSSatish Balay /* 101e5c89e4eSSatish Balay Function that is called to display all error messages 102e5c89e4eSSatish Balay */ 1037087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...) = PetscErrorPrintfDefault; 1047087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...) = PetscHelpPrintfDefault; 1057087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list) = PetscVFPrintfDefault; 106bab1f7e6SVictor Minden /* 1074cf1874eSKarl Rupp This is needed to turn on/off GPU synchronization 1088b5db460SBarry Smith */ 1094cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE; 110bab1f7e6SVictor Minden 111e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 112e5c89e4eSSatish Balay /* 113e5c89e4eSSatish Balay Optional file where all PETSc output from various prints is saved 114e5c89e4eSSatish Balay */ 11595c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 1160298fd71SBarry Smith FILE *petsc_history = NULL; 117e5c89e4eSSatish Balay 1187087cfbeSBarry Smith PetscErrorCode PetscOpenHistoryFile(const char filename[],FILE **fd) 119e5c89e4eSSatish Balay { 120e5c89e4eSSatish Balay PetscErrorCode ierr; 121e5c89e4eSSatish Balay PetscMPIInt rank,size; 122e5c89e4eSSatish Balay char pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64]; 123e5c89e4eSSatish Balay char version[256]; 124e5c89e4eSSatish Balay 125e5c89e4eSSatish Balay PetscFunctionBegin; 126ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 127e5c89e4eSSatish Balay if (!rank) { 128e5c89e4eSSatish Balay char arch[10]; 129f56c2debSBarry Smith int err; 130f56c2debSBarry Smith 131e5c89e4eSSatish Balay ierr = PetscGetArchType(arch,10);CHKERRQ(ierr); 132e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 133a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 134ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 135e5c89e4eSSatish Balay if (filename) { 136e5c89e4eSSatish Balay ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr); 137e5c89e4eSSatish Balay } else { 138589a23caSBarry Smith ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr); 139589a23caSBarry Smith ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr); 140e5c89e4eSSatish Balay ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr); 141e5c89e4eSSatish Balay } 142e5c89e4eSSatish Balay 143a297a907SKarl Rupp *fd = fopen(fname,"a"); 144a297a907SKarl Rupp if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname); 145a297a907SKarl Rupp 146c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 147e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr); 148589a23caSBarry Smith ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr); 149e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr); 150c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 151a297a907SKarl Rupp 152f56c2debSBarry Smith err = fflush(*fd); 153e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 154e5c89e4eSSatish Balay } 155e5c89e4eSSatish Balay PetscFunctionReturn(0); 156e5c89e4eSSatish Balay } 157e5c89e4eSSatish Balay 15895c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd) 159e5c89e4eSSatish Balay { 160e5c89e4eSSatish Balay PetscErrorCode ierr; 161e5c89e4eSSatish Balay PetscMPIInt rank; 162e5c89e4eSSatish Balay char date[64]; 163f56c2debSBarry Smith int err; 164e5c89e4eSSatish Balay 165e5c89e4eSSatish Balay PetscFunctionBegin; 166ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 167e5c89e4eSSatish Balay if (!rank) { 168e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 169c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 170e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr); 171c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 172f56c2debSBarry Smith err = fflush(*fd); 173e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 174f56c2debSBarry Smith err = fclose(*fd); 175e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 176e5c89e4eSSatish Balay } 177e5c89e4eSSatish Balay PetscFunctionReturn(0); 178e5c89e4eSSatish Balay } 179e5c89e4eSSatish Balay 180e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 181e5c89e4eSSatish Balay 182e5c89e4eSSatish Balay /* 183e5c89e4eSSatish Balay This is ugly and probably belongs somewhere else, but I want to 184e5c89e4eSSatish Balay be able to put a true MPI abort error handler with command line args. 185e5c89e4eSSatish Balay 186e5c89e4eSSatish Balay This is so MPI errors in the debugger will leave all the stack 1873c311c98SBarry Smith frames. The default MP_Abort() cleans up and exits thus providing no useful information 1883c311c98SBarry Smith in the debugger hence we call abort() instead of MPI_Abort(). 189e5c89e4eSSatish Balay */ 190e5c89e4eSSatish Balay 19133c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 192e5c89e4eSSatish Balay { 193e5c89e4eSSatish Balay PetscFunctionBegin; 1943c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 195e5c89e4eSSatish Balay abort(); 196e5c89e4eSSatish Balay } 197e5c89e4eSSatish Balay 19833c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 199e5c89e4eSSatish Balay { 200e5c89e4eSSatish Balay PetscErrorCode ierr; 201e5c89e4eSSatish Balay 202e5c89e4eSSatish Balay PetscFunctionBegin; 2033c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 204e5c89e4eSSatish Balay ierr = PetscAttachDebugger(); 20541e02c4dSJunchao Zhang if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */ 206e5c89e4eSSatish Balay } 207e5c89e4eSSatish Balay 208e5c89e4eSSatish Balay /*@C 209e5c89e4eSSatish Balay PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one 210e5c89e4eSSatish Balay wishes a clean exit somewhere deep in the program. 211e5c89e4eSSatish Balay 212e5c89e4eSSatish Balay Collective on PETSC_COMM_WORLD 213e5c89e4eSSatish Balay 214e5c89e4eSSatish Balay Options Database Keys are the same as for PetscFinalize() 215e5c89e4eSSatish Balay 216e5c89e4eSSatish Balay Level: advanced 217e5c89e4eSSatish Balay 218e5c89e4eSSatish Balay Note: 219e5c89e4eSSatish Balay See PetscInitialize() for more general runtime options. 220e5c89e4eSSatish Balay 22188c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize() 222e5c89e4eSSatish Balay @*/ 2237087cfbeSBarry Smith PetscErrorCode PetscEnd(void) 224e5c89e4eSSatish Balay { 225e5c89e4eSSatish Balay PetscFunctionBegin; 226e5c89e4eSSatish Balay PetscFinalize(); 227e5c89e4eSSatish Balay exit(0); 228e5c89e4eSSatish Balay return 0; 229e5c89e4eSSatish Balay } 230e5c89e4eSSatish Balay 231ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE; 23295c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void); 23395c0884eSLisandro Dalcin PETSC_INTERN PetscBool petscsetmallocvisited; 234e5c89e4eSSatish Balay static char emacsmachinename[256]; 235e5c89e4eSSatish Balay 23602c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL; 23702c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm) = NULL; 238e5c89e4eSSatish Balay 239e5c89e4eSSatish Balay /*@C 240e5c89e4eSSatish Balay PetscSetHelpVersionFunctions - Sets functions that print help and version information 241e5c89e4eSSatish Balay before the PETSc help and version information is printed. Must call BEFORE PetscInitialize(). 242e5c89e4eSSatish Balay This routine enables a "higher-level" package that uses PETSc to print its messages first. 243e5c89e4eSSatish Balay 244e5c89e4eSSatish Balay Input Parameter: 2450298fd71SBarry Smith + help - the help function (may be NULL) 2460298fd71SBarry Smith - version - the version function (may be NULL) 247e5c89e4eSSatish Balay 248e5c89e4eSSatish Balay Level: developer 249e5c89e4eSSatish Balay 250e5c89e4eSSatish Balay @*/ 2517087cfbeSBarry Smith PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm)) 252e5c89e4eSSatish Balay { 253e5c89e4eSSatish Balay PetscFunctionBegin; 254e5c89e4eSSatish Balay PetscExternalHelpFunction = help; 255e5c89e4eSSatish Balay PetscExternalVersionFunction = version; 256e5c89e4eSSatish Balay PetscFunctionReturn(0); 257e5c89e4eSSatish Balay } 258e5c89e4eSSatish Balay 25905df10baSBarry Smith #if defined(PETSC_USE_LOG) 26095c0884eSLisandro Dalcin PETSC_INTERN PetscBool PetscObjectsLog; 26105df10baSBarry Smith #endif 26205df10baSBarry Smith 26305035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP. 26405035670SJunchao Zhang Use the following macros to define CUDA/HIP initialization related vars/routines. 26505035670SJunchao Zhang */ 26605035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 26705035670SJunchao Zhang typedef cudaError_t cupmError_t; 26805035670SJunchao Zhang typedef struct cudaDeviceProp cupmDeviceProp; 269*a0e72f99SJunchao Zhang typedef cudaStream_t cupmStream_t; 27005035670SJunchao Zhang #define cupmGetDeviceCount(x) cudaGetDeviceCount(x) 27105035670SJunchao Zhang #define cupmGetDevice(x) cudaGetDevice(x) 27205035670SJunchao Zhang #define cupmSetDevice(x) cudaSetDevice(x) 27305035670SJunchao Zhang #define cupmSetDeviceFlags(x) cudaSetDeviceFlags(x) 27405035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) cudaGetDeviceProperties(x,y) 275*a0e72f99SJunchao Zhang #define cupmStreamCreate(x) cudaStreamCreate(x) 27605035670SJunchao Zhang #define cupmGetLastError() cudaGetLastError() 27705035670SJunchao Zhang #define cupmDeviceMapHost cudaDeviceMapHost 27805035670SJunchao Zhang #define cupmSuccess cudaSuccess 279e57d7714SBarry Smith #define cupmErrorMemoryAllocation cudaErrorMemoryAllocation 280e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources cudaErrorLaunchOutOfResources 28105035670SJunchao Zhang #define cupmErrorSetOnActiveProcess cudaErrorSetOnActiveProcess 28205035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRCUDA(x) 28305035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() PetscCUBLASInitializeHandle() 28405035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() PetscCUSOLVERDnInitializeHandle() 28505035670SJunchao Zhang #define PetscCUPMInitialize PetscCUDAInitialize 28605035670SJunchao Zhang #define PetscCUPMInitialized PetscCUDAInitialized 28705035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscCUDAInitializeCheck 28805035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscCUDAInitializeAndView 28905035670SJunchao Zhang #define PetscCUPMSynchronize PetscCUDASynchronize 29005035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseCUDA 29105035670SJunchao Zhang #define cupmOptionsStr "CUDA options" 2924dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-cuda_device" 29305035670SJunchao Zhang #define cupmViewStr "-cuda_view" 29405035670SJunchao Zhang #define cupmSynchronizeStr "-cuda_synchronize" 29505035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscCUDAInitialize" 29605035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckCUDA 29705035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPICUDAAwarenessCheck 298*a0e72f99SJunchao Zhang #define PetscDefaultCupmStream PetscDefaultCudaStream 29905035670SJunchao Zhang #include "cupminit.inc" 30005035670SJunchao Zhang #endif 30105035670SJunchao Zhang 30205035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 30305035670SJunchao Zhang typedef hipError_t cupmError_t; 30405035670SJunchao Zhang typedef hipDeviceProp_t cupmDeviceProp; 305*a0e72f99SJunchao Zhang typedef hipStream_t cupmStream_t; 30605035670SJunchao Zhang #define cupmGetDeviceCount(x) hipGetDeviceCount(x) 30705035670SJunchao Zhang #define cupmGetDevice(x) hipGetDevice(x) 30805035670SJunchao Zhang #define cupmSetDevice(x) hipSetDevice(x) 30905035670SJunchao Zhang #define cupmSetDeviceFlags(x) hipSetDeviceFlags(x) 31005035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) hipGetDeviceProperties(x,y) 311*a0e72f99SJunchao Zhang #define cupmStreamCreate(x) hipStreamCreate(x) 31205035670SJunchao Zhang #define cupmGetLastError() hipGetLastError() 31305035670SJunchao Zhang #define cupmDeviceMapHost hipDeviceMapHost 31405035670SJunchao Zhang #define cupmSuccess hipSuccess 315e57d7714SBarry Smith #define cupmErrorMemoryAllocation hipErrorMemoryAllocation 316e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources hipErrorLaunchOutOfResources 31705035670SJunchao Zhang #define cupmErrorSetOnActiveProcess hipErrorSetOnActiveProcess 31805035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB) 31905035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() 0 32005035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() 0 32105035670SJunchao Zhang #define PetscCUPMInitialize PetscHIPInitialize 32205035670SJunchao Zhang #define PetscCUPMInitialized PetscHIPInitialized 32305035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscHIPInitializeCheck 32405035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscHIPInitializeAndView 32505035670SJunchao Zhang #define PetscCUPMSynchronize PetscHIPSynchronize 32605035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseHIP 32705035670SJunchao Zhang #define cupmOptionsStr "HIP options" 3284dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-hip_device" 32905035670SJunchao Zhang #define cupmViewStr "-hip_view" 33005035670SJunchao Zhang #define cupmSynchronizeStr "-hip_synchronize" 33105035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscHIPInitialize" 33205035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckHIP 33305035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPIHIPAwarenessCheck 334*a0e72f99SJunchao Zhang #define PetscDefaultCupmStream PetscDefaultHipStream 33505035670SJunchao Zhang #include "cupminit.inc" 33605035670SJunchao Zhang #endif 33705035670SJunchao Zhang 33857171095SVaclav Hapla PETSC_INTERN PetscErrorCode PetscOptionsCheckInitial_Private(const char help[]) 339e5c89e4eSSatish Balay { 340e5ed2c37SJose E. Roman char string[64]; 341e5c89e4eSSatish Balay MPI_Comm comm = PETSC_COMM_WORLD; 34205035670SJunchao Zhang PetscBool flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView; 343e5c89e4eSSatish Balay PetscErrorCode ierr; 34467584ceeSBarry Smith PetscReal si; 34528559dc8SJed Brown PetscInt intensity; 346e5c89e4eSSatish Balay int i; 347e5c89e4eSSatish Balay PetscMPIInt rank; 348d314f959SVaclav Hapla char version[256]; 3492479a3a6SBarry Smith #if defined(PETSC_USE_LOG) 350e5ed2c37SJose E. Roman char mname[PETSC_MAX_PATH_LEN]; 3512479a3a6SBarry Smith PetscViewerFormat format; 35267584ceeSBarry Smith PetscBool flg4 = PETSC_FALSE; 35367584ceeSBarry Smith #endif 3547381773fSBarry Smith 355e5c89e4eSSatish Balay PetscFunctionBegin; 356ffc4695bSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 357e5c89e4eSSatish Balay 35867584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY) 35992f119d6SBarry Smith if (!(PETSC_RUNNING_ON_VALGRIND)) { 360e5c89e4eSSatish Balay /* 361e5c89e4eSSatish Balay Setup the memory management; support for tracing malloc() usage 362e5c89e4eSSatish Balay */ 363244bdbccSBarry Smith PetscBool mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE; 36492f119d6SBarry Smith 36576bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 36692f119d6SBarry Smith mdebug = PETSC_TRUE; 36792f119d6SBarry Smith initializenan = PETSC_TRUE; 36892f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 36976bd3646SJed Brown } else { 37092f119d6SBarry Smith /* don't warn about unused option */ 37192f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 37292f119d6SBarry Smith flg1 = PETSC_FALSE; 37376bd3646SJed Brown } 37479dccf82SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr); 37592f119d6SBarry Smith if (flg1 || flg2) { 37692f119d6SBarry Smith mdebug = PETSC_TRUE; 37792f119d6SBarry Smith eachcall = PETSC_TRUE; 37892f119d6SBarry Smith initializenan = PETSC_TRUE; 37979dccf82SBarry Smith } else if (flg3 && !flg2) { 38079dccf82SBarry Smith mdebug = PETSC_FALSE; 38179dccf82SBarry Smith eachcall = PETSC_FALSE; 38279dccf82SBarry Smith initializenan = PETSC_FALSE; 383e5c89e4eSSatish Balay } 38492f119d6SBarry Smith 385608c71bfSMatthew G. Knepley ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr); 386608c71bfSMatthew G. Knepley if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);} 387608c71bfSMatthew G. Knepley 38892f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr); 38992f119d6SBarry Smith if (mlog) { 39092f119d6SBarry Smith mdebug = PETSC_TRUE; 39192f119d6SBarry Smith } 39279dccf82SBarry Smith /* the next line is deprecated */ 39392f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr); 39492f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr); 39592f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr); 39692f119d6SBarry Smith if (mdebug) { 39792f119d6SBarry Smith ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr); 39892f119d6SBarry Smith } 39992f119d6SBarry Smith if (mlog) { 40092f119d6SBarry Smith PetscReal logthreshold = 0; 40192f119d6SBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr); 40292f119d6SBarry Smith ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr); 40392f119d6SBarry Smith } 4048b254c29SBarry Smith #if defined(PETSC_USE_LOG) 4058b254c29SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr); 4068b254c29SBarry Smith #endif 40792f119d6SBarry Smith } 40892f119d6SBarry Smith 409ba282f50SJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr); 410ba282f50SJed Brown if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);} 41190d69ab7SBarry Smith flg1 = PETSC_FALSE; 4122f21b5c6SHong Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr); 413cf6f3811SHong Zhang /* ignore this option if malloc is already set */ 414cf6f3811SHong Zhang if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);} 415e5c89e4eSSatish Balay 41690d69ab7SBarry Smith flg1 = PETSC_FALSE; 417c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr); 4187783f70dSSatish Balay if (!flg1) { 41990d69ab7SBarry Smith flg1 = PETSC_FALSE; 420c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr); 4217783f70dSSatish Balay } 422e5c89e4eSSatish Balay if (flg1) { 423e5c89e4eSSatish Balay ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 424e5c89e4eSSatish Balay } 42567584ceeSBarry Smith #endif 426e5c89e4eSSatish Balay 427b4427426SBarry Smith #if defined(PETSC_USE_LOG) 428c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr); 429b4427426SBarry Smith #endif 43005df10baSBarry Smith 431e5c89e4eSSatish Balay /* 432e5c89e4eSSatish Balay Set the display variable for graphics 433e5c89e4eSSatish Balay */ 434e5c89e4eSSatish Balay ierr = PetscSetDisplay();CHKERRQ(ierr); 435e5c89e4eSSatish Balay 43651dcc849SKerry Stevens /* 43757171095SVaclav Hapla Print main application help message 43857171095SVaclav Hapla */ 43957171095SVaclav Hapla ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr); 44057171095SVaclav Hapla if (help && hasHelp) { 44157171095SVaclav Hapla ierr = PetscPrintf(comm,help);CHKERRQ(ierr); 44257171095SVaclav Hapla ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr); 44357171095SVaclav Hapla } 44457171095SVaclav Hapla 44557171095SVaclav Hapla /* 446e5c89e4eSSatish Balay Print the PETSc version information 447e5c89e4eSSatish Balay */ 448d314f959SVaclav Hapla ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr); 449d314f959SVaclav Hapla if (flg1 || hasHelp) { 450e5c89e4eSSatish Balay /* 451e5c89e4eSSatish Balay Print "higher-level" package version message 452e5c89e4eSSatish Balay */ 453e5c89e4eSSatish Balay if (PetscExternalVersionFunction) { 454e5c89e4eSSatish Balay ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 455e5c89e4eSSatish Balay } 456e5c89e4eSSatish Balay 457a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 458e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 459e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 460e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 46184e42920SBarry Smith ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr); 462e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 463e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 464c0bb3764SVaclav Hapla ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr); 4657ca660e7SBarry Smith } 4667ca660e7SBarry Smith 46794941ca7SBarry Smith /* 46894941ca7SBarry Smith Print "higher-level" package help message 46994941ca7SBarry Smith */ 47057171095SVaclav Hapla if (hasHelp) { 471d314f959SVaclav Hapla PetscBool hasHelpIntro; 472d314f959SVaclav Hapla 47394941ca7SBarry Smith if (PetscExternalHelpFunction) { 47494941ca7SBarry Smith ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 47594941ca7SBarry Smith } 476d314f959SVaclav Hapla ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr); 477d314f959SVaclav Hapla if (hasHelpIntro) { 478bdb346e9SBarry Smith ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr); 479008a6e76SBarry Smith ierr = PetscFreeMPIResources();CHKERRQ(ierr); 480ffc4695bSBarry Smith ierr = MPI_Finalize();CHKERRMPI(ierr); 4817ca660e7SBarry Smith exit(0); 4827ca660e7SBarry Smith } 483e5c89e4eSSatish Balay } 484e5c89e4eSSatish Balay 485e5c89e4eSSatish Balay /* 486e5c89e4eSSatish Balay Setup the error handling 487e5c89e4eSSatish Balay */ 48890d69ab7SBarry Smith flg1 = PETSC_FALSE; 489c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr); 490b59baad1SJed Brown if (flg1) { 491ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr); 49202c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 493b59baad1SJed Brown } 49490d69ab7SBarry Smith flg1 = PETSC_FALSE; 495c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr); 49602c9f0b5SLisandro Dalcin if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);} 49790d69ab7SBarry Smith flg1 = PETSC_FALSE; 498c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr); 499e5c89e4eSSatish Balay if (flg1) { 500ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr); 501e5c89e4eSSatish Balay } 50290d69ab7SBarry Smith flg1 = PETSC_FALSE; 503c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr); 5048d359177SBarry Smith if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);} 505e5c89e4eSSatish Balay 506e5c89e4eSSatish Balay /* 507e5c89e4eSSatish Balay Setup debugger information 508e5c89e4eSSatish Balay */ 509e5c89e4eSSatish Balay ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 510589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 511e5c89e4eSSatish Balay if (flg1) { 512e5c89e4eSSatish Balay MPI_Errhandler err_handler; 513e5c89e4eSSatish Balay 514e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 515ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr); 516ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 51702c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr); 518e5c89e4eSSatish Balay } 519589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr); 5205e96ac45SJed Brown if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 521589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 522589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr); 523e5c89e4eSSatish Balay if (flg1 || flg2) { 524e5c89e4eSSatish Balay PetscMPIInt size; 525bf4d2887SBarry Smith PetscInt lsize,*ranks; 526e5c89e4eSSatish Balay MPI_Errhandler err_handler; 527e5c89e4eSSatish Balay /* 528e5c89e4eSSatish Balay we have to make sure that all processors have opened 529e5c89e4eSSatish Balay connections to all other processors, otherwise once the 530e5c89e4eSSatish Balay debugger has stated it is likely to receive a SIGUSR1 531e5c89e4eSSatish Balay and kill the program. 532e5c89e4eSSatish Balay */ 533ffc4695bSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr); 534e5c89e4eSSatish Balay if (size > 2) { 535533163c2SBarry Smith PetscMPIInt dummy = 0; 536e5c89e4eSSatish Balay MPI_Status status; 537e5c89e4eSSatish Balay for (i=0; i<size; i++) { 538e5c89e4eSSatish Balay if (rank != i) { 539ffc4695bSBarry Smith ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr); 540e5c89e4eSSatish Balay } 541e5c89e4eSSatish Balay } 542e5c89e4eSSatish Balay for (i=0; i<size; i++) { 543e5c89e4eSSatish Balay if (rank != i) { 544ffc4695bSBarry Smith ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr); 545e5c89e4eSSatish Balay } 546e5c89e4eSSatish Balay } 547e5c89e4eSSatish Balay } 548e5c89e4eSSatish Balay /* check if this processor node should be in debugger */ 549bf4d2887SBarry Smith ierr = PetscMalloc1(size,&ranks);CHKERRQ(ierr); 550e5c89e4eSSatish Balay lsize = size; 551bf4d2887SBarry Smith /* Deprecated in 3.14 */ 552bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr); 553bf4d2887SBarry Smith if (flag) { 554bf4d2887SBarry Smith const char * const quietopt="-options_suppress_deprecated_warnings"; 555bf4d2887SBarry Smith char msg[4096]; 556bf4d2887SBarry Smith PetscBool quiet = PETSC_FALSE; 557bf4d2887SBarry Smith 558bf4d2887SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr); 559bf4d2887SBarry Smith if (!quiet) { 560bf4d2887SBarry Smith ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr); 561bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr); 562bf4d2887SBarry Smith ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr); 563bf4d2887SBarry Smith ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr); 564bf4d2887SBarry Smith ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr); 565bf4d2887SBarry Smith ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr); 566bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr); 567bf4d2887SBarry Smith ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr); 568bf4d2887SBarry Smith ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr); 569bf4d2887SBarry Smith ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr); 570bf4d2887SBarry Smith ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr); 571bf4d2887SBarry Smith ierr = PetscPrintf(comm,msg);CHKERRQ(ierr); 572bf4d2887SBarry Smith } 573bf4d2887SBarry Smith } else { 574bf4d2887SBarry Smith lsize = size; 575bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr); 576bf4d2887SBarry Smith } 577e5c89e4eSSatish Balay if (flag) { 578e5c89e4eSSatish Balay for (i=0; i<lsize; i++) { 579bf4d2887SBarry Smith if (ranks[i] == rank) { flag = PETSC_FALSE; break; } 580e5c89e4eSSatish Balay } 581e5c89e4eSSatish Balay } 582e5c89e4eSSatish Balay if (!flag) { 583e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 58402c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 585e5c89e4eSSatish Balay if (flg1) { 586e5c89e4eSSatish Balay ierr = PetscAttachDebugger();CHKERRQ(ierr); 587e5c89e4eSSatish Balay } else { 588e5c89e4eSSatish Balay ierr = PetscStopForDebugger();CHKERRQ(ierr); 589e5c89e4eSSatish Balay } 590ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr); 591ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 5922a2a2941SBarry Smith } else { 5932a2a2941SBarry Smith ierr = PetscWaitOnError();CHKERRQ(ierr); 594e5c89e4eSSatish Balay } 595bf4d2887SBarry Smith ierr = PetscFree(ranks);CHKERRQ(ierr); 596e5c89e4eSSatish Balay } 597e5c89e4eSSatish Balay 598589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr); 599cb9801acSJed Brown if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);} 600e5c89e4eSSatish Balay 601e5c89e4eSSatish Balay /* 602e5c89e4eSSatish Balay Setup profiling and logging 603e5c89e4eSSatish Balay */ 6046cf91177SBarry Smith #if defined(PETSC_USE_INFO) 6058bb29257SSatish Balay { 606e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr); 607e5c89e4eSSatish Balay } 608865f6aa8SSatish Balay #endif 609aba4c478SBarry Smith ierr = PetscDetermineInitialFPTrap(); 610cc9df77eSBarry Smith flg1 = PETSC_FALSE; 611cc9df77eSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr); 612cc9df77eSBarry Smith if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);} 613cc9df77eSBarry Smith ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr); 614cc9df77eSBarry Smith if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);} 615865f6aa8SSatish Balay #if defined(PETSC_USE_LOG) 616865f6aa8SSatish Balay mname[0] = 0; 617589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 618865f6aa8SSatish Balay if (flg1) { 619865f6aa8SSatish Balay if (mname[0]) { 620f3dea69dSBarry Smith ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 621865f6aa8SSatish Balay } else { 622706d7a88SBarry Smith ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr); 623865f6aa8SSatish Balay } 624865f6aa8SSatish Balay } 625217044c2SLisandro Dalcin 626217044c2SLisandro Dalcin ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr); 627217044c2SLisandro Dalcin 628e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 62990d69ab7SBarry Smith flg1 = PETSC_FALSE; 630c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 631495fc317SBarry Smith if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);} 632e5c89e4eSSatish Balay #endif 63390d69ab7SBarry Smith flg1 = PETSC_FALSE; 63490d69ab7SBarry Smith flg3 = PETSC_FALSE; 635c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr); 636c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 637e5c89e4eSSatish Balay if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 638bb1d7374SBarry Smith else if (flg3) { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);} 639e5c89e4eSSatish Balay 640589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 641e5c89e4eSSatish Balay if (flg1) { 642e5c89e4eSSatish Balay char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 643e5c89e4eSSatish Balay FILE *file; 644e5c89e4eSSatish Balay if (mname[0]) { 6452e924ca5SSatish Balay PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank); 646e5c89e4eSSatish Balay ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 647e5c89e4eSSatish Balay file = fopen(fname,"w"); 648f3dea69dSBarry Smith if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 649a297a907SKarl Rupp } else file = PETSC_STDOUT; 650e5c89e4eSSatish Balay ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 651e5c89e4eSSatish Balay } 652bb1d7374SBarry Smith 65316413a6aSBarry Smith ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr); 654bb1d7374SBarry Smith if (flg4) { 655bb1d7374SBarry Smith if (format == PETSC_VIEWER_ASCII_XML) { 656bb1d7374SBarry Smith ierr = PetscLogNestedBegin();CHKERRQ(ierr); 657bb1d7374SBarry Smith } else { 658bb1d7374SBarry Smith ierr = PetscLogDefaultBegin();CHKERRQ(ierr); 659bb1d7374SBarry Smith } 660eccbb886SLisandro Dalcin } 661eccbb886SLisandro Dalcin if (flg4 && format == PETSC_VIEWER_ASCII_XML) { 662eccbb886SLisandro Dalcin PetscReal threshold = PetscRealConstant(0.01); 663eccbb886SLisandro Dalcin ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr); 664eccbb886SLisandro Dalcin if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);} 665bb1d7374SBarry Smith } 666e5c89e4eSSatish Balay #endif 667e5c89e4eSSatish Balay 668c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr); 66905035670SJunchao Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr); 6708d4e85a7SStefano Zampini /* 67105035670SJunchao Zhang If collecting logging information, by default, wait for device to complete its operations 6728d4e85a7SStefano Zampini before returning to the CPU in order to get accurate timings of each event 6738d4e85a7SStefano Zampini */ 674cae85d06SJunchao Zhang ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr); 67505035670SJunchao Zhang if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);} 6768d4e85a7SStefano Zampini 67705035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 67805035670SJunchao Zhang ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr); 67905035670SJunchao Zhang #endif 680cae85d06SJunchao Zhang 68105035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 68205035670SJunchao Zhang ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr); 6834b0a73b2SBarry Smith #endif 6844b0a73b2SBarry Smith 685e5c89e4eSSatish Balay /* 686e5c89e4eSSatish Balay Print basic help message 687e5c89e4eSSatish Balay */ 68857171095SVaclav Hapla if (hasHelp) { 689e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 690d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr); 691d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr); 692d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr); 693301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr); 694301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," only when run in the debugger\n");CHKERRQ(ierr); 695e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 696e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 697e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 698e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 699e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 700e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 701e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 702bf4d2887SBarry Smith ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr); 703e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 704e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 705e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 7061cda70a7SBarry Smith ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr); 707e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 708e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 709e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 710e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 711e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 71279dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr); 71379dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr); 7144161f2a3SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 71592f119d6SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr); 71679dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr); 71726a7e8d4SBarry Smith ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr); 718e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 719e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 720e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 721e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 722a8c7a070SBarry Smith ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 7230841954dSBarry Smith ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr); 724e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 725e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 726185ae32fSMatthew G. Knepley ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr); 727e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 72856071f75SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr); 729e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 730495fc317SBarry Smith ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr); 731e5c89e4eSSatish Balay #endif 732e94e781bSJacob Faibussowitsch #endif 733e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO) 734fe9b927eSVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr); 735e5c89e4eSSatish Balay #endif 736e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 737c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr); 738c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr); 739e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 740e5c89e4eSSatish Balay } 741e5c89e4eSSatish Balay 74274ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN) 74374ba8654SBarry Smith { 74474ba8654SBarry Smith char machine[128]; 745589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr); 74674ba8654SBarry Smith if (flg1) { 74774ba8654SBarry Smith ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr); 74874ba8654SBarry Smith } 74974ba8654SBarry Smith } 75074ba8654SBarry Smith #endif 75174ba8654SBarry Smith 752c5929fdfSBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 753e5c89e4eSSatish Balay if (flg1) { 754e5c89e4eSSatish Balay ierr = PetscSleep(si);CHKERRQ(ierr); 755e5c89e4eSSatish Balay } 756e5c89e4eSSatish Balay 757fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL) 758c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 759f14045dbSBarry Smith if (!flg3) { 760c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr); 761f14045dbSBarry Smith } 762c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr); 763f14045dbSBarry Smith PetscViennaCLSynchronize = flg3; 764fdc842d1SBarry Smith ierr = PetscViennaCLInit();CHKERRQ(ierr); 7654cf1874eSKarl Rupp #endif 76682f73ecaSAlejandro Lamas Daviña 767fdc842d1SBarry Smith /* 768fdc842d1SBarry Smith Creates the logging data structures; this is enabled even if logging is not turned on 769fdc842d1SBarry Smith This is the last thing we do before returning to the user code to prevent having the 770fdc842d1SBarry Smith logging numbers contaminated by any startup time associated with MPI and the GPUs 771fdc842d1SBarry Smith */ 772fdc842d1SBarry Smith #if defined(PETSC_USE_LOG) 773fdc842d1SBarry Smith ierr = PetscLogInitialize();CHKERRQ(ierr); 774f0a7718cSKarl Rupp #endif 775f0a7718cSKarl Rupp 776e5c89e4eSSatish Balay PetscFunctionReturn(0); 777e5c89e4eSSatish Balay } 778