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> 26*23622779SBarry Smith #include <cuda_runtime_api.h> 27*23622779SBarry 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 4505035670SJunchao Zhang 46e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/ 47e5c89e4eSSatish Balay /* 48e5c89e4eSSatish Balay Indicates if PETSc started up MPI, or it was 49e5c89e4eSSatish Balay already started before PETSc was initialized. 50e5c89e4eSSatish Balay */ 510cbf60d0SJose E. Roman PetscBool PetscBeganMPI = PETSC_FALSE; 528ad20175SVaclav Hapla PetscBool PetscErrorHandlingInitialized = PETSC_FALSE; 530cbf60d0SJose E. Roman PetscBool PetscInitializeCalled = PETSC_FALSE; 540cbf60d0SJose E. Roman PetscBool PetscFinalizeCalled = PETSC_FALSE; 55d6f2c3cbSBarry Smith 567087cfbeSBarry Smith PetscMPIInt PetscGlobalRank = -1; 577087cfbeSBarry Smith PetscMPIInt PetscGlobalSize = -1; 58ba61063dSBarry Smith 59c2b86a48SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS) 60c2b86a48SJunchao Zhang PetscBool PetscBeganKokkos = PETSC_FALSE; 61c2b86a48SJunchao Zhang #endif 62c2b86a48SJunchao Zhang 6371438e86SJunchao Zhang #if defined(PETSC_HAVE_NVSHMEM) 6471438e86SJunchao Zhang PetscBool PetscBeganNvshmem = PETSC_FALSE; 6571438e86SJunchao Zhang PetscBool PetscNvshmemInitialized = PETSC_FALSE; 6671438e86SJunchao Zhang #endif 6771438e86SJunchao Zhang 68c2a741eeSJunchao Zhang PetscBool use_gpu_aware_mpi = PETSC_TRUE; 69928a6601SJunchao Zhang PetscBool PetscCreatedGpuObjects = PETSC_FALSE; 70c2a741eeSJunchao Zhang 7150f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX) 72e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE) 73e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */ 74e5c89e4eSSatish Balay #endif 758619c96cSJed Brown 768619c96cSJed Brown /*MC 778619c96cSJed Brown PETSC_i - the imaginary number i 788619c96cSJed Brown 798619c96cSJed Brown Synopsis: 808619c96cSJed Brown #include <petscsys.h> 818619c96cSJed Brown PetscComplex PETSC_i; 828619c96cSJed Brown 838619c96cSJed Brown Level: beginner 848619c96cSJed Brown 858619c96cSJed Brown Note: 868cd53115SBarry Smith Complex numbers are automatically available if PETSc located a working complex implementation 878619c96cSJed Brown 888619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex() 898619c96cSJed Brown M*/ 9050f81f78SJed Brown PetscComplex PETSC_i; 917a19d461SSatish Balay MPI_Datatype MPIU___COMPLEX128 = 0; 927a19d461SSatish Balay #endif /* PETSC_HAVE_COMPLEX */ 93ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) 94c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0; 95570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 96570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0; 97c90a1750SBarry Smith #endif 987087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0; 990354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES) 1007087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0; 10144041f26SJed Brown #endif 1028ad47952SJed Brown MPI_Datatype MPIU_BOOL; 1038ad47952SJed Brown MPI_Datatype MPIU_ENUM; 1047cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR; 105e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T; 10675567043SBarry Smith 107e5c89e4eSSatish Balay /* 108e5c89e4eSSatish Balay Function that is called to display all error messages 109e5c89e4eSSatish Balay */ 1107087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...) = PetscErrorPrintfDefault; 1117087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...) = PetscHelpPrintfDefault; 1127087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list) = PetscVFPrintfDefault; 113bab1f7e6SVictor Minden /* 1144cf1874eSKarl Rupp This is needed to turn on/off GPU synchronization 1158b5db460SBarry Smith */ 1164cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE; 117bab1f7e6SVictor Minden 118e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 119e5c89e4eSSatish Balay /* 120e5c89e4eSSatish Balay Optional file where all PETSc output from various prints is saved 121e5c89e4eSSatish Balay */ 12295c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 1230298fd71SBarry Smith FILE *petsc_history = NULL; 124e5c89e4eSSatish Balay 1257087cfbeSBarry Smith PetscErrorCode PetscOpenHistoryFile(const char filename[],FILE **fd) 126e5c89e4eSSatish Balay { 127e5c89e4eSSatish Balay PetscErrorCode ierr; 128e5c89e4eSSatish Balay PetscMPIInt rank,size; 129e5c89e4eSSatish Balay char pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64]; 130e5c89e4eSSatish Balay char version[256]; 131e5c89e4eSSatish Balay 132e5c89e4eSSatish Balay PetscFunctionBegin; 133ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 134e5c89e4eSSatish Balay if (!rank) { 135e5c89e4eSSatish Balay char arch[10]; 136f56c2debSBarry Smith int err; 137f56c2debSBarry Smith 138e5c89e4eSSatish Balay ierr = PetscGetArchType(arch,10);CHKERRQ(ierr); 139e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 140a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 141ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 142e5c89e4eSSatish Balay if (filename) { 143e5c89e4eSSatish Balay ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr); 144e5c89e4eSSatish Balay } else { 145589a23caSBarry Smith ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr); 146589a23caSBarry Smith ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr); 147e5c89e4eSSatish Balay ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr); 148e5c89e4eSSatish Balay } 149e5c89e4eSSatish Balay 150a297a907SKarl Rupp *fd = fopen(fname,"a"); 151a297a907SKarl Rupp if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname); 152a297a907SKarl Rupp 153c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 154e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr); 155589a23caSBarry Smith ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr); 156e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr); 157c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 158a297a907SKarl Rupp 159f56c2debSBarry Smith err = fflush(*fd); 160e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 161e5c89e4eSSatish Balay } 162e5c89e4eSSatish Balay PetscFunctionReturn(0); 163e5c89e4eSSatish Balay } 164e5c89e4eSSatish Balay 16595c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd) 166e5c89e4eSSatish Balay { 167e5c89e4eSSatish Balay PetscErrorCode ierr; 168e5c89e4eSSatish Balay PetscMPIInt rank; 169e5c89e4eSSatish Balay char date[64]; 170f56c2debSBarry Smith int err; 171e5c89e4eSSatish Balay 172e5c89e4eSSatish Balay PetscFunctionBegin; 173ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 174e5c89e4eSSatish Balay if (!rank) { 175e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 176c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 177e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr); 178c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 179f56c2debSBarry Smith err = fflush(*fd); 180e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 181f56c2debSBarry Smith err = fclose(*fd); 182e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 183e5c89e4eSSatish Balay } 184e5c89e4eSSatish Balay PetscFunctionReturn(0); 185e5c89e4eSSatish Balay } 186e5c89e4eSSatish Balay 187e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 188e5c89e4eSSatish Balay 189e5c89e4eSSatish Balay /* 190e5c89e4eSSatish Balay This is ugly and probably belongs somewhere else, but I want to 191e5c89e4eSSatish Balay be able to put a true MPI abort error handler with command line args. 192e5c89e4eSSatish Balay 193e5c89e4eSSatish Balay This is so MPI errors in the debugger will leave all the stack 1943c311c98SBarry Smith frames. The default MP_Abort() cleans up and exits thus providing no useful information 1953c311c98SBarry Smith in the debugger hence we call abort() instead of MPI_Abort(). 196e5c89e4eSSatish Balay */ 197e5c89e4eSSatish Balay 19833c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 199e5c89e4eSSatish Balay { 200e5c89e4eSSatish Balay PetscFunctionBegin; 2013c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 202e5c89e4eSSatish Balay abort(); 203e5c89e4eSSatish Balay } 204e5c89e4eSSatish Balay 20533c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 206e5c89e4eSSatish Balay { 207e5c89e4eSSatish Balay PetscErrorCode ierr; 208e5c89e4eSSatish Balay 209e5c89e4eSSatish Balay PetscFunctionBegin; 2103c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 211e5c89e4eSSatish Balay ierr = PetscAttachDebugger(); 21241e02c4dSJunchao Zhang if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */ 213e5c89e4eSSatish Balay } 214e5c89e4eSSatish Balay 215e5c89e4eSSatish Balay /*@C 216e5c89e4eSSatish Balay PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one 217e5c89e4eSSatish Balay wishes a clean exit somewhere deep in the program. 218e5c89e4eSSatish Balay 219e5c89e4eSSatish Balay Collective on PETSC_COMM_WORLD 220e5c89e4eSSatish Balay 221e5c89e4eSSatish Balay Options Database Keys are the same as for PetscFinalize() 222e5c89e4eSSatish Balay 223e5c89e4eSSatish Balay Level: advanced 224e5c89e4eSSatish Balay 225e5c89e4eSSatish Balay Note: 226e5c89e4eSSatish Balay See PetscInitialize() for more general runtime options. 227e5c89e4eSSatish Balay 22888c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize() 229e5c89e4eSSatish Balay @*/ 2307087cfbeSBarry Smith PetscErrorCode PetscEnd(void) 231e5c89e4eSSatish Balay { 232e5c89e4eSSatish Balay PetscFunctionBegin; 233e5c89e4eSSatish Balay PetscFinalize(); 234e5c89e4eSSatish Balay exit(0); 235e5c89e4eSSatish Balay return 0; 236e5c89e4eSSatish Balay } 237e5c89e4eSSatish Balay 238ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE; 23995c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void); 24095c0884eSLisandro Dalcin PETSC_INTERN PetscBool petscsetmallocvisited; 241e5c89e4eSSatish Balay static char emacsmachinename[256]; 242e5c89e4eSSatish Balay 24302c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL; 24402c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm) = NULL; 245e5c89e4eSSatish Balay 246e5c89e4eSSatish Balay /*@C 247e5c89e4eSSatish Balay PetscSetHelpVersionFunctions - Sets functions that print help and version information 248e5c89e4eSSatish Balay before the PETSc help and version information is printed. Must call BEFORE PetscInitialize(). 249e5c89e4eSSatish Balay This routine enables a "higher-level" package that uses PETSc to print its messages first. 250e5c89e4eSSatish Balay 251e5c89e4eSSatish Balay Input Parameter: 2520298fd71SBarry Smith + help - the help function (may be NULL) 2530298fd71SBarry Smith - version - the version function (may be NULL) 254e5c89e4eSSatish Balay 255e5c89e4eSSatish Balay Level: developer 256e5c89e4eSSatish Balay 257e5c89e4eSSatish Balay @*/ 2587087cfbeSBarry Smith PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm)) 259e5c89e4eSSatish Balay { 260e5c89e4eSSatish Balay PetscFunctionBegin; 261e5c89e4eSSatish Balay PetscExternalHelpFunction = help; 262e5c89e4eSSatish Balay PetscExternalVersionFunction = version; 263e5c89e4eSSatish Balay PetscFunctionReturn(0); 264e5c89e4eSSatish Balay } 265e5c89e4eSSatish Balay 26605df10baSBarry Smith #if defined(PETSC_USE_LOG) 26795c0884eSLisandro Dalcin PETSC_INTERN PetscBool PetscObjectsLog; 26805df10baSBarry Smith #endif 26905df10baSBarry Smith 27005035670SJunchao Zhang /* CUPM stands for 'CUDA Programming Model', which is implemented in either CUDA or HIP. 27105035670SJunchao Zhang Use the following macros to define CUDA/HIP initialization related vars/routines. 27205035670SJunchao Zhang */ 27305035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 27405035670SJunchao Zhang typedef cudaError_t cupmError_t; 27505035670SJunchao Zhang typedef struct cudaDeviceProp cupmDeviceProp; 276a0e72f99SJunchao Zhang typedef cudaStream_t cupmStream_t; 2779ffd0706SHong Zhang typedef cudaEvent_t cupmEvent_t; 27805035670SJunchao Zhang #define cupmGetDeviceCount(x) cudaGetDeviceCount(x) 27905035670SJunchao Zhang #define cupmGetDevice(x) cudaGetDevice(x) 28005035670SJunchao Zhang #define cupmSetDevice(x) cudaSetDevice(x) 28105035670SJunchao Zhang #define cupmSetDeviceFlags(x) cudaSetDeviceFlags(x) 28205035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) cudaGetDeviceProperties(x,y) 283a0e72f99SJunchao Zhang #define cupmStreamCreate(x) cudaStreamCreate(x) 28405035670SJunchao Zhang #define cupmGetLastError() cudaGetLastError() 28505035670SJunchao Zhang #define cupmDeviceMapHost cudaDeviceMapHost 28605035670SJunchao Zhang #define cupmSuccess cudaSuccess 287e57d7714SBarry Smith #define cupmErrorMemoryAllocation cudaErrorMemoryAllocation 288e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources cudaErrorLaunchOutOfResources 28905035670SJunchao Zhang #define cupmErrorSetOnActiveProcess cudaErrorSetOnActiveProcess 29005035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRCUDA(x) 29105035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() PetscCUBLASInitializeHandle() 29205035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() PetscCUSOLVERDnInitializeHandle() 29305035670SJunchao Zhang #define PetscCUPMInitialize PetscCUDAInitialize 29405035670SJunchao Zhang #define PetscCUPMInitialized PetscCUDAInitialized 29505035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscCUDAInitializeCheck 29605035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscCUDAInitializeAndView 29705035670SJunchao Zhang #define PetscCUPMSynchronize PetscCUDASynchronize 29805035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseCUDA 29905035670SJunchao Zhang #define cupmOptionsStr "CUDA options" 3004dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-cuda_device" 30105035670SJunchao Zhang #define cupmViewStr "-cuda_view" 30205035670SJunchao Zhang #define cupmSynchronizeStr "-cuda_synchronize" 30305035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscCUDAInitialize" 30405035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckCUDA 30505035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPICUDAAwarenessCheck 306a0e72f99SJunchao Zhang #define PetscDefaultCupmStream PetscDefaultCudaStream 3079ffd0706SHong Zhang #define cupmEventCreate(x) cudaEventCreate(x) 30805035670SJunchao Zhang #include "cupminit.inc" 30905035670SJunchao Zhang #endif 31005035670SJunchao Zhang 31105035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 31205035670SJunchao Zhang typedef hipError_t cupmError_t; 31305035670SJunchao Zhang typedef hipDeviceProp_t cupmDeviceProp; 314a0e72f99SJunchao Zhang typedef hipStream_t cupmStream_t; 3159ffd0706SHong Zhang typedef hipEvent_t cupmEvent_t; 31605035670SJunchao Zhang #define cupmGetDeviceCount(x) hipGetDeviceCount(x) 31705035670SJunchao Zhang #define cupmGetDevice(x) hipGetDevice(x) 31805035670SJunchao Zhang #define cupmSetDevice(x) hipSetDevice(x) 31905035670SJunchao Zhang #define cupmSetDeviceFlags(x) hipSetDeviceFlags(x) 32005035670SJunchao Zhang #define cupmGetDeviceProperties(x,y) hipGetDeviceProperties(x,y) 321a0e72f99SJunchao Zhang #define cupmStreamCreate(x) hipStreamCreate(x) 3229ffd0706SHong Zhang #define cupmEventCreate(x) hipEventCreate(x); 32305035670SJunchao Zhang #define cupmGetLastError() hipGetLastError() 32405035670SJunchao Zhang #define cupmDeviceMapHost hipDeviceMapHost 32505035670SJunchao Zhang #define cupmSuccess hipSuccess 326e57d7714SBarry Smith #define cupmErrorMemoryAllocation hipErrorMemoryAllocation 327e57d7714SBarry Smith #define cupmErrorLaunchOutOfResources hipErrorLaunchOutOfResources 32805035670SJunchao Zhang #define cupmErrorSetOnActiveProcess hipErrorSetOnActiveProcess 32905035670SJunchao Zhang #define CHKERRCUPM(x) CHKERRQ((x)==hipSuccess? 0:PETSC_ERR_LIB) 33005035670SJunchao Zhang #define PetscCUPMBLASInitializeHandle() 0 33105035670SJunchao Zhang #define PetscCUPMSOLVERDnInitializeHandle() 0 33205035670SJunchao Zhang #define PetscCUPMInitialize PetscHIPInitialize 33305035670SJunchao Zhang #define PetscCUPMInitialized PetscHIPInitialized 33405035670SJunchao Zhang #define PetscCUPMInitializeCheck PetscHIPInitializeCheck 33505035670SJunchao Zhang #define PetscCUPMInitializeAndView PetscHIPInitializeAndView 33605035670SJunchao Zhang #define PetscCUPMSynchronize PetscHIPSynchronize 33705035670SJunchao Zhang #define PetscNotUseCUPM PetscNotUseHIP 33805035670SJunchao Zhang #define cupmOptionsStr "HIP options" 3394dcd27cbSJunchao Zhang #define cupmSetDeviceStr "-hip_device" 34005035670SJunchao Zhang #define cupmViewStr "-hip_view" 34105035670SJunchao Zhang #define cupmSynchronizeStr "-hip_synchronize" 34205035670SJunchao Zhang #define PetscCUPMInitializeStr "PetscHIPInitialize" 34305035670SJunchao Zhang #define PetscOptionsCheckCUPM PetscOptionsCheckHIP 34405035670SJunchao Zhang #define PetscMPICUPMAwarenessCheck PetscMPIHIPAwarenessCheck 345a0e72f99SJunchao Zhang #define PetscDefaultCupmStream PetscDefaultHipStream 34605035670SJunchao Zhang #include "cupminit.inc" 34705035670SJunchao Zhang #endif 34805035670SJunchao Zhang 34957171095SVaclav Hapla PETSC_INTERN PetscErrorCode PetscOptionsCheckInitial_Private(const char help[]) 350e5c89e4eSSatish Balay { 351e5ed2c37SJose E. Roman char string[64]; 352e5c89e4eSSatish Balay MPI_Comm comm = PETSC_COMM_WORLD; 35305035670SJunchao Zhang PetscBool flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp,logView; 354e5c89e4eSSatish Balay PetscErrorCode ierr; 35567584ceeSBarry Smith PetscReal si; 35628559dc8SJed Brown PetscInt intensity; 357e5c89e4eSSatish Balay int i; 358e5c89e4eSSatish Balay PetscMPIInt rank; 359d314f959SVaclav Hapla char version[256]; 3602479a3a6SBarry Smith #if defined(PETSC_USE_LOG) 361e5ed2c37SJose E. Roman char mname[PETSC_MAX_PATH_LEN]; 3622479a3a6SBarry Smith PetscViewerFormat format; 36367584ceeSBarry Smith PetscBool flg4 = PETSC_FALSE; 36467584ceeSBarry Smith #endif 3657381773fSBarry Smith 366e5c89e4eSSatish Balay PetscFunctionBegin; 367ffc4695bSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRMPI(ierr); 368e5c89e4eSSatish Balay 36967584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY) 37092f119d6SBarry Smith if (!(PETSC_RUNNING_ON_VALGRIND)) { 371e5c89e4eSSatish Balay /* 372e5c89e4eSSatish Balay Setup the memory management; support for tracing malloc() usage 373e5c89e4eSSatish Balay */ 374244bdbccSBarry Smith PetscBool mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE; 37592f119d6SBarry Smith 37676bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 37792f119d6SBarry Smith mdebug = PETSC_TRUE; 37892f119d6SBarry Smith initializenan = PETSC_TRUE; 37992f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 38076bd3646SJed Brown } else { 38192f119d6SBarry Smith /* don't warn about unused option */ 38292f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 38392f119d6SBarry Smith flg1 = PETSC_FALSE; 38476bd3646SJed Brown } 38579dccf82SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr); 38692f119d6SBarry Smith if (flg1 || flg2) { 38792f119d6SBarry Smith mdebug = PETSC_TRUE; 38892f119d6SBarry Smith eachcall = PETSC_TRUE; 38992f119d6SBarry Smith initializenan = PETSC_TRUE; 39079dccf82SBarry Smith } else if (flg3 && !flg2) { 39179dccf82SBarry Smith mdebug = PETSC_FALSE; 39279dccf82SBarry Smith eachcall = PETSC_FALSE; 39379dccf82SBarry Smith initializenan = PETSC_FALSE; 394e5c89e4eSSatish Balay } 39592f119d6SBarry Smith 396608c71bfSMatthew G. Knepley ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_requested_size",&flg1,&flg2);CHKERRQ(ierr); 397608c71bfSMatthew G. Knepley if (flg2) {ierr = PetscMallocLogRequestedSizeSet(flg1);CHKERRQ(ierr);} 398608c71bfSMatthew G. Knepley 39992f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr); 40092f119d6SBarry Smith if (mlog) { 40192f119d6SBarry Smith mdebug = PETSC_TRUE; 40292f119d6SBarry Smith } 40379dccf82SBarry Smith /* the next line is deprecated */ 40492f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr); 40592f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr); 40692f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr); 40792f119d6SBarry Smith if (mdebug) { 40892f119d6SBarry Smith ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr); 40992f119d6SBarry Smith } 41092f119d6SBarry Smith if (mlog) { 41192f119d6SBarry Smith PetscReal logthreshold = 0; 41292f119d6SBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr); 41392f119d6SBarry Smith ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr); 41492f119d6SBarry Smith } 4158b254c29SBarry Smith #if defined(PETSC_USE_LOG) 4168b254c29SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr); 4178b254c29SBarry Smith #endif 41892f119d6SBarry Smith } 41992f119d6SBarry Smith 420ba282f50SJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr); 421ba282f50SJed Brown if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);} 42290d69ab7SBarry Smith flg1 = PETSC_FALSE; 4232f21b5c6SHong Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr); 424cf6f3811SHong Zhang /* ignore this option if malloc is already set */ 425cf6f3811SHong Zhang if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);} 426e5c89e4eSSatish Balay 42790d69ab7SBarry Smith flg1 = PETSC_FALSE; 428c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr); 4297783f70dSSatish Balay if (!flg1) { 43090d69ab7SBarry Smith flg1 = PETSC_FALSE; 431c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr); 4327783f70dSSatish Balay } 433e5c89e4eSSatish Balay if (flg1) { 434e5c89e4eSSatish Balay ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 435e5c89e4eSSatish Balay } 43667584ceeSBarry Smith #endif 437e5c89e4eSSatish Balay 438b4427426SBarry Smith #if defined(PETSC_USE_LOG) 439c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr); 440b4427426SBarry Smith #endif 44105df10baSBarry Smith 442e5c89e4eSSatish Balay /* 443e5c89e4eSSatish Balay Set the display variable for graphics 444e5c89e4eSSatish Balay */ 445e5c89e4eSSatish Balay ierr = PetscSetDisplay();CHKERRQ(ierr); 446e5c89e4eSSatish Balay 44751dcc849SKerry Stevens /* 44857171095SVaclav Hapla Print main application help message 44957171095SVaclav Hapla */ 45057171095SVaclav Hapla ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr); 45157171095SVaclav Hapla if (help && hasHelp) { 45257171095SVaclav Hapla ierr = PetscPrintf(comm,help);CHKERRQ(ierr); 45357171095SVaclav Hapla ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr); 45457171095SVaclav Hapla } 45557171095SVaclav Hapla 45657171095SVaclav Hapla /* 457e5c89e4eSSatish Balay Print the PETSc version information 458e5c89e4eSSatish Balay */ 459d314f959SVaclav Hapla ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr); 460d314f959SVaclav Hapla if (flg1 || hasHelp) { 461e5c89e4eSSatish Balay /* 462e5c89e4eSSatish Balay Print "higher-level" package version message 463e5c89e4eSSatish Balay */ 464e5c89e4eSSatish Balay if (PetscExternalVersionFunction) { 465e5c89e4eSSatish Balay ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 466e5c89e4eSSatish Balay } 467e5c89e4eSSatish Balay 468a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 469e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 470e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 471e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 47284e42920SBarry Smith ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr); 473e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 474e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 475c0bb3764SVaclav Hapla ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr); 4767ca660e7SBarry Smith } 4777ca660e7SBarry Smith 47894941ca7SBarry Smith /* 47994941ca7SBarry Smith Print "higher-level" package help message 48094941ca7SBarry Smith */ 48157171095SVaclav Hapla if (hasHelp) { 482d314f959SVaclav Hapla PetscBool hasHelpIntro; 483d314f959SVaclav Hapla 48494941ca7SBarry Smith if (PetscExternalHelpFunction) { 48594941ca7SBarry Smith ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 48694941ca7SBarry Smith } 487d314f959SVaclav Hapla ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr); 488d314f959SVaclav Hapla if (hasHelpIntro) { 489bdb346e9SBarry Smith ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr); 490008a6e76SBarry Smith ierr = PetscFreeMPIResources();CHKERRQ(ierr); 491ffc4695bSBarry Smith ierr = MPI_Finalize();CHKERRMPI(ierr); 4927ca660e7SBarry Smith exit(0); 4937ca660e7SBarry Smith } 494e5c89e4eSSatish Balay } 495e5c89e4eSSatish Balay 496e5c89e4eSSatish Balay /* 497e5c89e4eSSatish Balay Setup the error handling 498e5c89e4eSSatish Balay */ 49990d69ab7SBarry Smith flg1 = PETSC_FALSE; 500c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr); 501b59baad1SJed Brown if (flg1) { 502ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRMPI(ierr); 50302c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 504b59baad1SJed Brown } 50590d69ab7SBarry Smith flg1 = PETSC_FALSE; 506c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr); 50702c9f0b5SLisandro Dalcin if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);} 50890d69ab7SBarry Smith flg1 = PETSC_FALSE; 509c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr); 510e5c89e4eSSatish Balay if (flg1) { 511ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRMPI(ierr); 512e5c89e4eSSatish Balay } 51390d69ab7SBarry Smith flg1 = PETSC_FALSE; 514c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr); 5158d359177SBarry Smith if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);} 516e5c89e4eSSatish Balay 517e5c89e4eSSatish Balay /* 518e5c89e4eSSatish Balay Setup debugger information 519e5c89e4eSSatish Balay */ 520e5c89e4eSSatish Balay ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 521589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 522e5c89e4eSSatish Balay if (flg1) { 523e5c89e4eSSatish Balay MPI_Errhandler err_handler; 524e5c89e4eSSatish Balay 525e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 526ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRMPI(ierr); 527ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 52802c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr); 529e5c89e4eSSatish Balay } 530589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr); 5315e96ac45SJed Brown if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 532589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 533589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr); 534e5c89e4eSSatish Balay if (flg1 || flg2) { 535e5c89e4eSSatish Balay PetscMPIInt size; 536bf4d2887SBarry Smith PetscInt lsize,*ranks; 537e5c89e4eSSatish Balay MPI_Errhandler err_handler; 538e5c89e4eSSatish Balay /* 539e5c89e4eSSatish Balay we have to make sure that all processors have opened 540e5c89e4eSSatish Balay connections to all other processors, otherwise once the 541e5c89e4eSSatish Balay debugger has stated it is likely to receive a SIGUSR1 542e5c89e4eSSatish Balay and kill the program. 543e5c89e4eSSatish Balay */ 544ffc4695bSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr); 545e5c89e4eSSatish Balay if (size > 2) { 546533163c2SBarry Smith PetscMPIInt dummy = 0; 547e5c89e4eSSatish Balay MPI_Status status; 548e5c89e4eSSatish Balay for (i=0; i<size; i++) { 549e5c89e4eSSatish Balay if (rank != i) { 550ffc4695bSBarry Smith ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRMPI(ierr); 551e5c89e4eSSatish Balay } 552e5c89e4eSSatish Balay } 553e5c89e4eSSatish Balay for (i=0; i<size; i++) { 554e5c89e4eSSatish Balay if (rank != i) { 555ffc4695bSBarry Smith ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRMPI(ierr); 556e5c89e4eSSatish Balay } 557e5c89e4eSSatish Balay } 558e5c89e4eSSatish Balay } 559e5c89e4eSSatish Balay /* check if this processor node should be in debugger */ 560bf4d2887SBarry Smith ierr = PetscMalloc1(size,&ranks);CHKERRQ(ierr); 561e5c89e4eSSatish Balay lsize = size; 562bf4d2887SBarry Smith /* Deprecated in 3.14 */ 563bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",ranks,&lsize,&flag);CHKERRQ(ierr); 564bf4d2887SBarry Smith if (flag) { 565bf4d2887SBarry Smith const char * const quietopt="-options_suppress_deprecated_warnings"; 566bf4d2887SBarry Smith char msg[4096]; 567bf4d2887SBarry Smith PetscBool quiet = PETSC_FALSE; 568bf4d2887SBarry Smith 569bf4d2887SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,quietopt,&quiet,NULL);CHKERRQ(ierr); 570bf4d2887SBarry Smith if (!quiet) { 571bf4d2887SBarry Smith ierr = PetscStrcpy(msg,"** PETSc DEPRECATION WARNING ** : the option ");CHKERRQ(ierr); 572bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_nodes");CHKERRQ(ierr); 573bf4d2887SBarry Smith ierr = PetscStrcat(msg," is deprecated as of version ");CHKERRQ(ierr); 574bf4d2887SBarry Smith ierr = PetscStrcat(msg,"3.14");CHKERRQ(ierr); 575bf4d2887SBarry Smith ierr = PetscStrcat(msg," and will be removed in a future release.");CHKERRQ(ierr); 576bf4d2887SBarry Smith ierr = PetscStrcat(msg," Please use the option ");CHKERRQ(ierr); 577bf4d2887SBarry Smith ierr = PetscStrcat(msg,"-debugger_ranks");CHKERRQ(ierr); 578bf4d2887SBarry Smith ierr = PetscStrcat(msg," instead.");CHKERRQ(ierr); 579bf4d2887SBarry Smith ierr = PetscStrcat(msg," (Silence this warning with ");CHKERRQ(ierr); 580bf4d2887SBarry Smith ierr = PetscStrcat(msg,quietopt);CHKERRQ(ierr); 581bf4d2887SBarry Smith ierr = PetscStrcat(msg,")\n");CHKERRQ(ierr); 582bf4d2887SBarry Smith ierr = PetscPrintf(comm,msg);CHKERRQ(ierr); 583bf4d2887SBarry Smith } 584bf4d2887SBarry Smith } else { 585bf4d2887SBarry Smith lsize = size; 586bf4d2887SBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_ranks",ranks,&lsize,&flag);CHKERRQ(ierr); 587bf4d2887SBarry Smith } 588e5c89e4eSSatish Balay if (flag) { 589e5c89e4eSSatish Balay for (i=0; i<lsize; i++) { 590bf4d2887SBarry Smith if (ranks[i] == rank) { flag = PETSC_FALSE; break; } 591e5c89e4eSSatish Balay } 592e5c89e4eSSatish Balay } 593e5c89e4eSSatish Balay if (!flag) { 594e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 59502c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 596e5c89e4eSSatish Balay if (flg1) { 597e5c89e4eSSatish Balay ierr = PetscAttachDebugger();CHKERRQ(ierr); 598e5c89e4eSSatish Balay } else { 599e5c89e4eSSatish Balay ierr = PetscStopForDebugger();CHKERRQ(ierr); 600e5c89e4eSSatish Balay } 601ffc4695bSBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRMPI(ierr); 602ffc4695bSBarry Smith ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRMPI(ierr); 6032a2a2941SBarry Smith } else { 6042a2a2941SBarry Smith ierr = PetscWaitOnError();CHKERRQ(ierr); 605e5c89e4eSSatish Balay } 606bf4d2887SBarry Smith ierr = PetscFree(ranks);CHKERRQ(ierr); 607e5c89e4eSSatish Balay } 608e5c89e4eSSatish Balay 609589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr); 610cb9801acSJed Brown if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);} 611e5c89e4eSSatish Balay 612e5c89e4eSSatish Balay /* 613e5c89e4eSSatish Balay Setup profiling and logging 614e5c89e4eSSatish Balay */ 6156cf91177SBarry Smith #if defined(PETSC_USE_INFO) 6168bb29257SSatish Balay { 617e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr); 618e5c89e4eSSatish Balay } 619865f6aa8SSatish Balay #endif 620aba4c478SBarry Smith ierr = PetscDetermineInitialFPTrap(); 621cc9df77eSBarry Smith flg1 = PETSC_FALSE; 622cc9df77eSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr); 623cc9df77eSBarry Smith if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);} 624cc9df77eSBarry Smith ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr); 625cc9df77eSBarry Smith if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);} 626865f6aa8SSatish Balay #if defined(PETSC_USE_LOG) 627865f6aa8SSatish Balay mname[0] = 0; 628589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 629865f6aa8SSatish Balay if (flg1) { 630865f6aa8SSatish Balay if (mname[0]) { 631f3dea69dSBarry Smith ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 632865f6aa8SSatish Balay } else { 633706d7a88SBarry Smith ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr); 634865f6aa8SSatish Balay } 635865f6aa8SSatish Balay } 636217044c2SLisandro Dalcin 637217044c2SLisandro Dalcin ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr); 638217044c2SLisandro Dalcin 639e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 64090d69ab7SBarry Smith flg1 = PETSC_FALSE; 641c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 642495fc317SBarry Smith if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);} 643e5c89e4eSSatish Balay #endif 64490d69ab7SBarry Smith flg1 = PETSC_FALSE; 64590d69ab7SBarry Smith flg3 = PETSC_FALSE; 646c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr); 647c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 648e5c89e4eSSatish Balay if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 649bb1d7374SBarry Smith else if (flg3) { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);} 650e5c89e4eSSatish Balay 651589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 652e5c89e4eSSatish Balay if (flg1) { 653e5c89e4eSSatish Balay char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 654e5c89e4eSSatish Balay FILE *file; 655e5c89e4eSSatish Balay if (mname[0]) { 6562e924ca5SSatish Balay PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank); 657e5c89e4eSSatish Balay ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 658e5c89e4eSSatish Balay file = fopen(fname,"w"); 659f3dea69dSBarry Smith if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 660a297a907SKarl Rupp } else file = PETSC_STDOUT; 661e5c89e4eSSatish Balay ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 662e5c89e4eSSatish Balay } 663bb1d7374SBarry Smith 66416413a6aSBarry Smith ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr); 665bb1d7374SBarry Smith if (flg4) { 666d0a29bd7SConnor Ward if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) { 667bb1d7374SBarry Smith ierr = PetscLogNestedBegin();CHKERRQ(ierr); 668bb1d7374SBarry Smith } else { 669bb1d7374SBarry Smith ierr = PetscLogDefaultBegin();CHKERRQ(ierr); 670bb1d7374SBarry Smith } 671eccbb886SLisandro Dalcin } 672d0a29bd7SConnor Ward if (flg4 && (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH)) { 673eccbb886SLisandro Dalcin PetscReal threshold = PetscRealConstant(0.01); 674eccbb886SLisandro Dalcin ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr); 675eccbb886SLisandro Dalcin if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);} 676bb1d7374SBarry Smith } 677e5c89e4eSSatish Balay #endif 678e5c89e4eSSatish Balay 679c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr); 68005035670SJunchao Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-use_gpu_aware_mpi",&use_gpu_aware_mpi,NULL);CHKERRQ(ierr); 6818d4e85a7SStefano Zampini /* 68205035670SJunchao Zhang If collecting logging information, by default, wait for device to complete its operations 6838d4e85a7SStefano Zampini before returning to the CPU in order to get accurate timings of each event 6848d4e85a7SStefano Zampini */ 685cae85d06SJunchao Zhang ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr); 68605035670SJunchao Zhang if (!logView) {ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr);} 6878d4e85a7SStefano Zampini 68805035670SJunchao Zhang #if defined(PETSC_HAVE_CUDA) 68905035670SJunchao Zhang ierr = PetscOptionsCheckCUDA(logView);CHKERRQ(ierr); 69005035670SJunchao Zhang #endif 691cae85d06SJunchao Zhang 69205035670SJunchao Zhang #if defined(PETSC_HAVE_HIP) 69305035670SJunchao Zhang ierr = PetscOptionsCheckHIP(logView);CHKERRQ(ierr); 6944b0a73b2SBarry Smith #endif 6954b0a73b2SBarry Smith 696e5c89e4eSSatish Balay /* 697e5c89e4eSSatish Balay Print basic help message 698e5c89e4eSSatish Balay */ 69957171095SVaclav Hapla if (hasHelp) { 700e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 701d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr); 702d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr); 703d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr); 704301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr); 705301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," only when run in the debugger\n");CHKERRQ(ierr); 706e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 707e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 708e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 709e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 710e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 711e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 712e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 713bf4d2887SBarry Smith ierr = (*PetscHelpPrintf)(comm," -debugger_ranks [n1,n2,..] Ranks to start in debugger\n");CHKERRQ(ierr); 714e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 715e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 716e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 7171cda70a7SBarry Smith ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr); 718e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 719e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 720e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 721e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 722e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 72379dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr); 72479dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr); 7254161f2a3SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 72692f119d6SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr); 72779dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr); 72826a7e8d4SBarry Smith ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr); 729e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 730e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 731e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 732e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 733a8c7a070SBarry Smith ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 7340841954dSBarry Smith ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr); 735e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 736e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 737185ae32fSMatthew G. Knepley ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr); 738e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 73956071f75SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr); 740e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 741495fc317SBarry Smith ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr); 742e5c89e4eSSatish Balay #endif 743e94e781bSJacob Faibussowitsch #endif 744e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO) 745fe9b927eSVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr); 746e5c89e4eSSatish Balay #endif 747e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 748c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr); 749c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr); 750e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 751e5c89e4eSSatish Balay } 752e5c89e4eSSatish Balay 75374ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN) 75474ba8654SBarry Smith { 75574ba8654SBarry Smith char machine[128]; 756589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr); 75774ba8654SBarry Smith if (flg1) { 75874ba8654SBarry Smith ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr); 75974ba8654SBarry Smith } 76074ba8654SBarry Smith } 76174ba8654SBarry Smith #endif 76274ba8654SBarry Smith 763c5929fdfSBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 764e5c89e4eSSatish Balay if (flg1) { 765e5c89e4eSSatish Balay ierr = PetscSleep(si);CHKERRQ(ierr); 766e5c89e4eSSatish Balay } 767e5c89e4eSSatish Balay 768fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL) 769c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 770f14045dbSBarry Smith if (!flg3) { 771c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr); 772f14045dbSBarry Smith } 773c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr); 774f14045dbSBarry Smith PetscViennaCLSynchronize = flg3; 775fdc842d1SBarry Smith ierr = PetscViennaCLInit();CHKERRQ(ierr); 7764cf1874eSKarl Rupp #endif 77782f73ecaSAlejandro Lamas Daviña 778fdc842d1SBarry Smith /* 779fdc842d1SBarry Smith Creates the logging data structures; this is enabled even if logging is not turned on 780fdc842d1SBarry Smith This is the last thing we do before returning to the user code to prevent having the 781fdc842d1SBarry Smith logging numbers contaminated by any startup time associated with MPI and the GPUs 782fdc842d1SBarry Smith */ 783fdc842d1SBarry Smith #if defined(PETSC_USE_LOG) 784fdc842d1SBarry Smith ierr = PetscLogInitialize();CHKERRQ(ierr); 785f0a7718cSKarl Rupp #endif 786f0a7718cSKarl Rupp 787e5c89e4eSSatish Balay PetscFunctionReturn(0); 788e5c89e4eSSatish Balay } 789