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 23d9b72601SDominic Meiser #if defined(PETSC_HAVE_CUDA) 24d9b72601SDominic Meiser #include <cuda_runtime.h> 257fd2f626SJose E. Roman #include <petsccublas.h> 26c2a741eeSJunchao Zhang #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION) 27c2a741eeSJunchao Zhang #include "mpi-ext.h" /* Needed for OpenMPI CUDA-aware check */ 28c2a741eeSJunchao Zhang #endif 29d9b72601SDominic Meiser #endif 30555d055bSBarry Smith 31f0a7718cSKarl Rupp #if defined(PETSC_HAVE_VIENNACL) 32f0a7718cSKarl Rupp PETSC_EXTERN PetscErrorCode PetscViennaCLInit(); 33f0a7718cSKarl Rupp #endif 34f0a7718cSKarl Rupp 35e5c89e4eSSatish Balay /* ------------------------Nasty global variables -------------------------------*/ 36e5c89e4eSSatish Balay /* 37e5c89e4eSSatish Balay Indicates if PETSc started up MPI, or it was 38e5c89e4eSSatish Balay already started before PETSc was initialized. 39e5c89e4eSSatish Balay */ 400cbf60d0SJose E. Roman PetscBool PetscBeganMPI = PETSC_FALSE; 418ad20175SVaclav Hapla PetscBool PetscErrorHandlingInitialized = PETSC_FALSE; 420cbf60d0SJose E. Roman PetscBool PetscInitializeCalled = PETSC_FALSE; 430cbf60d0SJose E. Roman PetscBool PetscFinalizeCalled = PETSC_FALSE; 44bffec52eSKarl Rupp PetscBool PetscCUDAInitialized = PETSC_FALSE; 45d6f2c3cbSBarry Smith 467087cfbeSBarry Smith PetscMPIInt PetscGlobalRank = -1; 477087cfbeSBarry Smith PetscMPIInt PetscGlobalSize = -1; 48ba61063dSBarry Smith 49c2a741eeSJunchao Zhang PetscBool use_gpu_aware_mpi = PETSC_TRUE; 50c2a741eeSJunchao Zhang 5150f81f78SJed Brown #if defined(PETSC_HAVE_COMPLEX) 52e5c89e4eSSatish Balay #if defined(PETSC_COMPLEX_INSTANTIATE) 53e5c89e4eSSatish Balay template <> class std::complex<double>; /* instantiate complex template class */ 54e5c89e4eSSatish Balay #endif 552c876bd9SBarry Smith #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 56500d8756SSatish Balay MPI_Datatype MPIU_C_DOUBLE_COMPLEX; 57500d8756SSatish Balay MPI_Datatype MPIU_C_COMPLEX; 582c876bd9SBarry Smith #endif 598619c96cSJed Brown 608619c96cSJed Brown /*MC 618619c96cSJed Brown PETSC_i - the imaginary number i 628619c96cSJed Brown 638619c96cSJed Brown Synopsis: 648619c96cSJed Brown #include <petscsys.h> 658619c96cSJed Brown PetscComplex PETSC_i; 668619c96cSJed Brown 678619c96cSJed Brown Level: beginner 688619c96cSJed Brown 698619c96cSJed Brown Note: 708cd53115SBarry Smith Complex numbers are automatically available if PETSc located a working complex implementation 718619c96cSJed Brown 728619c96cSJed Brown .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex() 738619c96cSJed Brown M*/ 7450f81f78SJed Brown PetscComplex PETSC_i; 75e5c89e4eSSatish Balay #endif 76ce63c4c1SBarry Smith #if defined(PETSC_USE_REAL___FLOAT128) 77c90a1750SBarry Smith MPI_Datatype MPIU___FLOAT128 = 0; 787c2de775SJed Brown #if defined(PETSC_HAVE_COMPLEX) 798c764dc5SJose Roman MPI_Datatype MPIU___COMPLEX128 = 0; 808c764dc5SJose Roman #endif 81570b7f6dSBarry Smith #elif defined(PETSC_USE_REAL___FP16) 82570b7f6dSBarry Smith MPI_Datatype MPIU___FP16 = 0; 83c90a1750SBarry Smith #endif 847087cfbeSBarry Smith MPI_Datatype MPIU_2SCALAR = 0; 850354ff80SSatish Balay #if defined(PETSC_USE_64BIT_INDICES) 867087cfbeSBarry Smith MPI_Datatype MPIU_2INT = 0; 8744041f26SJed Brown #endif 888ad47952SJed Brown MPI_Datatype MPIU_BOOL; 898ad47952SJed Brown MPI_Datatype MPIU_ENUM; 907cdaf61dSJed Brown MPI_Datatype MPIU_FORTRANADDR; 91e316c87fSJed Brown MPI_Datatype MPIU_SIZE_T; 9275567043SBarry Smith 93e5c89e4eSSatish Balay /* 94e5c89e4eSSatish Balay Function that is called to display all error messages 95e5c89e4eSSatish Balay */ 967087cfbeSBarry Smith PetscErrorCode (*PetscErrorPrintf)(const char [],...) = PetscErrorPrintfDefault; 977087cfbeSBarry Smith PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...) = PetscHelpPrintfDefault; 987087cfbeSBarry Smith PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list) = PetscVFPrintfDefault; 99bab1f7e6SVictor Minden /* 1004cf1874eSKarl Rupp This is needed to turn on/off GPU synchronization 1018b5db460SBarry Smith */ 1024cf1874eSKarl Rupp PetscBool PetscViennaCLSynchronize = PETSC_FALSE; 10382f73ecaSAlejandro Lamas Daviña PetscBool PetscCUDASynchronize = PETSC_FALSE; 104bab1f7e6SVictor Minden 105e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 106e5c89e4eSSatish Balay /* 107e5c89e4eSSatish Balay Optional file where all PETSc output from various prints is saved 108e5c89e4eSSatish Balay */ 10995c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 1100298fd71SBarry Smith FILE *petsc_history = NULL; 111e5c89e4eSSatish Balay 1127087cfbeSBarry Smith PetscErrorCode PetscOpenHistoryFile(const char filename[],FILE **fd) 113e5c89e4eSSatish Balay { 114e5c89e4eSSatish Balay PetscErrorCode ierr; 115e5c89e4eSSatish Balay PetscMPIInt rank,size; 116e5c89e4eSSatish Balay char pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64]; 117e5c89e4eSSatish Balay char version[256]; 118e5c89e4eSSatish Balay 119e5c89e4eSSatish Balay PetscFunctionBegin; 120e5c89e4eSSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 121e5c89e4eSSatish Balay if (!rank) { 122e5c89e4eSSatish Balay char arch[10]; 123f56c2debSBarry Smith int err; 124f56c2debSBarry Smith 125e5c89e4eSSatish Balay ierr = PetscGetArchType(arch,10);CHKERRQ(ierr); 126e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 127a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 128e5c89e4eSSatish Balay ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 129e5c89e4eSSatish Balay if (filename) { 130e5c89e4eSSatish Balay ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr); 131e5c89e4eSSatish Balay } else { 132589a23caSBarry Smith ierr = PetscGetHomeDirectory(pfile,sizeof(pfile));CHKERRQ(ierr); 133589a23caSBarry Smith ierr = PetscStrlcat(pfile,"/.petschistory",sizeof(pfile));CHKERRQ(ierr); 134e5c89e4eSSatish Balay ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr); 135e5c89e4eSSatish Balay } 136e5c89e4eSSatish Balay 137a297a907SKarl Rupp *fd = fopen(fname,"a"); 138a297a907SKarl Rupp if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname); 139a297a907SKarl Rupp 140c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 141e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr); 142589a23caSBarry Smith ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr); 143e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr); 144c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 145a297a907SKarl Rupp 146f56c2debSBarry Smith err = fflush(*fd); 147e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 148e5c89e4eSSatish Balay } 149e5c89e4eSSatish Balay PetscFunctionReturn(0); 150e5c89e4eSSatish Balay } 151e5c89e4eSSatish Balay 15295c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd) 153e5c89e4eSSatish Balay { 154e5c89e4eSSatish Balay PetscErrorCode ierr; 155e5c89e4eSSatish Balay PetscMPIInt rank; 156e5c89e4eSSatish Balay char date[64]; 157f56c2debSBarry Smith int err; 158e5c89e4eSSatish Balay 159e5c89e4eSSatish Balay PetscFunctionBegin; 160e5c89e4eSSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 161e5c89e4eSSatish Balay if (!rank) { 162e5c89e4eSSatish Balay ierr = PetscGetDate(date,64);CHKERRQ(ierr); 163c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 164e5c89e4eSSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr); 165c0bb3764SVaclav Hapla ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"----------------------------------------\n");CHKERRQ(ierr); 166f56c2debSBarry Smith err = fflush(*fd); 167e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 168f56c2debSBarry Smith err = fclose(*fd); 169e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 170e5c89e4eSSatish Balay } 171e5c89e4eSSatish Balay PetscFunctionReturn(0); 172e5c89e4eSSatish Balay } 173e5c89e4eSSatish Balay 174e5c89e4eSSatish Balay /* ------------------------------------------------------------------------------*/ 175e5c89e4eSSatish Balay 176e5c89e4eSSatish Balay /* 177e5c89e4eSSatish Balay This is ugly and probably belongs somewhere else, but I want to 178e5c89e4eSSatish Balay be able to put a true MPI abort error handler with command line args. 179e5c89e4eSSatish Balay 180e5c89e4eSSatish Balay This is so MPI errors in the debugger will leave all the stack 1813c311c98SBarry Smith frames. The default MP_Abort() cleans up and exits thus providing no useful information 1823c311c98SBarry Smith in the debugger hence we call abort() instead of MPI_Abort(). 183e5c89e4eSSatish Balay */ 184e5c89e4eSSatish Balay 18533c7d699SBarry Smith void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 186e5c89e4eSSatish Balay { 187e5c89e4eSSatish Balay PetscFunctionBegin; 1883c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 189e5c89e4eSSatish Balay abort(); 190e5c89e4eSSatish Balay } 191e5c89e4eSSatish Balay 19233c7d699SBarry Smith void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 193e5c89e4eSSatish Balay { 194e5c89e4eSSatish Balay PetscErrorCode ierr; 195e5c89e4eSSatish Balay 196e5c89e4eSSatish Balay PetscFunctionBegin; 1973c311c98SBarry Smith (*PetscErrorPrintf)("MPI error %d\n",*flag); 198e5c89e4eSSatish Balay ierr = PetscAttachDebugger(); 19941e02c4dSJunchao Zhang if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */ 200e5c89e4eSSatish Balay } 201e5c89e4eSSatish Balay 2027381773fSBarry Smith #if defined(PETSC_HAVE_CUDA) 203*cae85d06SJunchao Zhang /* CUDA validation after it is lazily initialized */ 204*cae85d06SJunchao Zhang static PetscErrorCode PetscCUDAValidate(void) 205*cae85d06SJunchao Zhang { 206*cae85d06SJunchao Zhang PetscBool mpi_gpu_awareness; 207*cae85d06SJunchao Zhang 208*cae85d06SJunchao Zhang PetscFunctionBegin; 209*cae85d06SJunchao Zhang if (use_gpu_aware_mpi) { 210*cae85d06SJunchao Zhang #if defined(PETSC_HAVE_OMPI_MAJOR_VERSION) && defined(MPIX_CUDA_AWARE_SUPPORT) && MPIX_CUDA_AWARE_SUPPORT 211*cae85d06SJunchao Zhang /* Trust OpenMPI's compile time cuda query interface */ 212*cae85d06SJunchao Zhang mpi_gpu_awareness = PETSC_TRUE; 213*cae85d06SJunchao Zhang #else 214*cae85d06SJunchao Zhang /* For other MPI implementations without cuda query API, we do a GPU MPI call to see if it segfaults. 215*cae85d06SJunchao Zhang Note that Spectrum MPI sets OMPI_MAJOR_VERSION and is CUDA-aware, but does not have MPIX_CUDA_AWARE_SUPPORT. 216*cae85d06SJunchao Zhang */ 217*cae85d06SJunchao Zhang mpi_gpu_awareness = PetscCheckMpiGpuAwareness(); 218*cae85d06SJunchao Zhang #endif 219*cae85d06SJunchao Zhang if (!mpi_gpu_awareness) { 220*cae85d06SJunchao Zhang (*PetscErrorPrintf)("PETSc is configured with GPU support, but your MPI is not GPU-aware. For better performance, please use a GPU-aware MPI.\n"); 221*cae85d06SJunchao Zhang (*PetscErrorPrintf)("If you do not care, add option -use_gpu_aware_mpi 0. To not see the message again, add the option to your .petscrc, OR add it to the env var PETSC_OPTIONS.\n"); 222*cae85d06SJunchao Zhang (*PetscErrorPrintf)("If you do care, for IBM Spectrum MPI on OLCF Summit, you may need jsrun --smpiargs=-gpu.\n"); 223*cae85d06SJunchao Zhang (*PetscErrorPrintf)("For OpenMPI, you need to configure it --with-cuda (https://www.open-mpi.org/faq/?category=buildcuda)\n"); 224*cae85d06SJunchao Zhang (*PetscErrorPrintf)("For MVAPICH2-GDR, you need to set MV2_USE_CUDA=1 (http://mvapich.cse.ohio-state.edu/userguide/gdr/)\n"); 225*cae85d06SJunchao Zhang (*PetscErrorPrintf)("For Cray-MPICH, you need to set MPICH_RDMA_ENABLED_CUDA=1 (https://www.olcf.ornl.gov/tutorials/gpudirect-mpich-enabled-cuda/)\n"); 226*cae85d06SJunchao Zhang PETSCABORT(PETSC_COMM_SELF,PETSC_ERR_LIB); 227*cae85d06SJunchao Zhang } 228*cae85d06SJunchao Zhang } 229*cae85d06SJunchao Zhang PetscFunctionReturn(0); 230*cae85d06SJunchao Zhang } 231*cae85d06SJunchao Zhang 232*cae85d06SJunchao Zhang /* Initialize the CUDA device lazily just before creating the first CUDA object. */ 233*cae85d06SJunchao Zhang static PetscBool PetscNotUseGpu = PETSC_FALSE; /* Assert the code will not use GPUs */ 234*cae85d06SJunchao Zhang PetscErrorCode PetscCUDAInitializeLazily(void) 235*cae85d06SJunchao Zhang { 236*cae85d06SJunchao Zhang PetscErrorCode ierr; 237*cae85d06SJunchao Zhang cudaError_t cerr; 238*cae85d06SJunchao Zhang int devId,devCount; 239*cae85d06SJunchao Zhang PetscMPIInt rank; 240*cae85d06SJunchao Zhang static PetscBool cudaValdidateChecked = PETSC_FALSE; 241*cae85d06SJunchao Zhang 242*cae85d06SJunchao Zhang PetscFunctionBegin; 243*cae85d06SJunchao Zhang if (PetscNotUseGpu) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"You asserted the code won't use GPUs with -cuda_set_device none, but it is trying to create a cuda object. Remove this option or see manpage of PetscCUDAInitialize()."); 244*cae85d06SJunchao Zhang if (!PetscCUDAInitialized) { 245*cae85d06SJunchao Zhang cerr = cudaGetDeviceCount(&devCount);CHKERRCUDA(cerr); 246*cae85d06SJunchao Zhang if (devCount > 1) { 247*cae85d06SJunchao Zhang cerr = cudaSetDeviceFlags(cudaDeviceMapHost); 248*cae85d06SJunchao Zhang cudaGetLastError(); /* Reset the last error */ 249*cae85d06SJunchao Zhang if (cerr == cudaSuccess) { /* It implies cuda runtime has not been initialized? */ 250*cae85d06SJunchao Zhang ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 251*cae85d06SJunchao Zhang devId = rank % devCount; 252*cae85d06SJunchao Zhang cerr = cudaSetDevice(devId);CHKERRCUDA(cerr); 253*cae85d06SJunchao Zhang } else if (cerr == cudaErrorSetOnActiveProcess) { 254*cae85d06SJunchao Zhang /* It implies user has initialized cuda runtime outside of petsc. We do nothing to respect the device choice. */ 255*cae85d06SJunchao Zhang } 256*cae85d06SJunchao Zhang } 257*cae85d06SJunchao Zhang PetscCUDAInitialized = PETSC_TRUE; 258*cae85d06SJunchao Zhang } 259*cae85d06SJunchao Zhang if (!cudaValdidateChecked) { 260*cae85d06SJunchao Zhang ierr = PetscCUDAValidate();CHKERRQ(ierr); 261*cae85d06SJunchao Zhang cudaValdidateChecked = PETSC_TRUE; 262*cae85d06SJunchao Zhang } 263*cae85d06SJunchao Zhang PetscFunctionReturn(0); 264*cae85d06SJunchao Zhang } 265*cae85d06SJunchao Zhang 2667381773fSBarry Smith /*@C 267*cae85d06SJunchao Zhang PetscCUDAInitialize - Initializes the CUDA device (eagerly in PetscInitialize()) and cuBLAS/cuSPARSE on the device 2687381773fSBarry Smith 2697381773fSBarry Smith Logically collective 2707381773fSBarry Smith 2717381773fSBarry Smith Input Parameter: 2727381773fSBarry Smith comm - the MPI communicator that will utilize the CUDA devices 273*cae85d06SJunchao Zhang device - the device assigned to current MPI process. Special values like PETSC_DECIDE/DEFAULT have special meanings (see details below) 2747381773fSBarry Smith 2757381773fSBarry Smith Options Database: 276*cae85d06SJunchao Zhang + -cuda_set_device <device> - the device assigned to current MPI rank. <device> is case-insensitive and can be: 277*cae85d06SJunchao Zhang NONE (or none, or -3) : the code will not use GPUs, otherwise it will error out; 278*cae85d06SJunchao Zhang PETSC_DEFAULT(or DEFAULT, or -2) : do not explicitly set device, i.e., use whatever device already set by user (probably before PetscInitialize()). Init cuda runtime etc; 279*cae85d06SJunchao Zhang PETSC_DECIDE (or DECIDE, or -1) : assign MPI ranks in comm to available devices in round-robin, and init cuda runtime etc on the selected device; 280*cae85d06SJunchao Zhang >= 0 integer : assign the device with this id to current MPI process. Error out if <device> is invalid. Init cuda runtime etc on this device; 281*cae85d06SJunchao Zhang With PETSC_{DECIDE, DEFAULT}, if there are actually no GPUs, the code can still run, but it will error out when trying to create cuda objects. 282*cae85d06SJunchao Zhang . -cuda_view - view information about the CUDA devices. 283*cae85d06SJunchao Zhang . -cuda_synchronize - wait at the end of asynchronize CUDA calls so that their time gets credited to the current event; default with -log_view. 284*cae85d06SJunchao Zhang . -log_view - logging, however if alone or combined with `-cuda_set_device DEFAULT | DECIDE | >=0 int`, will int cuda; if combined with `-cuda_set_device none`, won't init cuda. 285*cae85d06SJunchao Zhang - -use_gpu_aware_mpi - assume the MPI is GPU-aware when communicating data on GPUs. 2867381773fSBarry Smith 28790ea27d8SSatish Balay Level: beginner 28890ea27d8SSatish Balay 2897381773fSBarry Smith Notes: 290*cae85d06SJunchao Zhang Initializing cuBLAS takes about 1/2 second therefore it is done by default in PetscCUDAInitialize() before logging begins. 2917381773fSBarry Smith 2927381773fSBarry Smith @*/ 293*cae85d06SJunchao Zhang PetscErrorCode PetscCUDAInitialize(MPI_Comm comm,PetscInt device) 2947381773fSBarry Smith { 2957381773fSBarry Smith PetscErrorCode ierr; 296*cae85d06SJunchao Zhang cudaError_t cerr; 297*cae85d06SJunchao Zhang int devId,devCount=0; 298*cae85d06SJunchao Zhang const PetscInt PETSC_NONE=-3; /* Unlike PETSC_DECIDE, we don't have a macro PETSC_NONE in petsc headers */ 299*cae85d06SJunchao Zhang PetscMPIInt rank; 3007381773fSBarry Smith 3017381773fSBarry Smith PetscFunctionBegin; 3027381773fSBarry Smith if (!PetscCUDAInitialized) { 303*cae85d06SJunchao Zhang cerr = cudaGetDeviceCount(&devCount); 304*cae85d06SJunchao Zhang cudaGetLastError(); /* Reset the last error */ 305*cae85d06SJunchao Zhang if (cerr != cudaSuccess) devCount = 0; 306*cae85d06SJunchao Zhang if (device >= 0) { /* User wants to use this specific device */ 307*cae85d06SJunchao Zhang cerr = cudaSetDeviceFlags(cudaDeviceMapHost); /* Allow it to fail since user might have already initialized the device. */ 308*cae85d06SJunchao Zhang cudaGetLastError(); /* Reset the last error */ 309*cae85d06SJunchao Zhang cerr = cudaSetDevice((int)device);CHKERRCUDA(cerr); 310*cae85d06SJunchao Zhang } else if (device == PETSC_DECIDE) { /* Assign MPI ranks to available devices in round-robin */ 311*cae85d06SJunchao Zhang if (devCount > 0) { /* Allow no-GPU as long as user does not use GPUs */ 312*cae85d06SJunchao Zhang /* Set the device flags so that it can map host memory */ 313*cae85d06SJunchao Zhang cerr = cudaSetDeviceFlags(cudaDeviceMapHost);CHKERRCUDA(cerr); 3147381773fSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 315*cae85d06SJunchao Zhang devId = rank % devCount; 316*cae85d06SJunchao Zhang cerr = cudaSetDevice(devId);CHKERRCUDA(cerr); 3177381773fSBarry Smith } 318*cae85d06SJunchao Zhang } else if (device == PETSC_DEFAULT) { 319*cae85d06SJunchao Zhang /* Do nothing, i.e., use whatever device set by user before PetscInitialize() */ 320*cae85d06SJunchao Zhang } else if (device == PETSC_NONE) { 321*cae85d06SJunchao Zhang PetscNotUseGpu = PETSC_TRUE; /* Assert the code won't use GPUs even there are */ 322*cae85d06SJunchao Zhang } else SETERRQ1(comm,PETSC_ERR_ARG_OUTOFRANGE,"Wrong device (%D) passed to -cuda_set_device <dev>. Must be NONE(-3),PETSC_DEFAULT(-2),PETSC_DECIDE(-1) or a non-negative integer.",device); 3237381773fSBarry Smith 324*cae85d06SJunchao Zhang if (devCount > 0 && device != PETSC_NONE) { 325*cae85d06SJunchao Zhang /* Do costly CUDA handles initialization here to not to distort petsc logging later */ 3267381773fSBarry Smith ierr = PetscCUBLASInitializeHandle();CHKERRQ(ierr); 3273bbda9c2SStefano Zampini ierr = PetscCUSOLVERDnInitializeHandle();CHKERRQ(ierr); 3287381773fSBarry Smith PetscCUDAInitialized = PETSC_TRUE; 3297381773fSBarry Smith } 3307381773fSBarry Smith } 3317381773fSBarry Smith PetscFunctionReturn(0); 3327381773fSBarry Smith } 3337381773fSBarry Smith #endif 3347381773fSBarry Smith 335e5c89e4eSSatish Balay /*@C 336e5c89e4eSSatish Balay PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one 337e5c89e4eSSatish Balay wishes a clean exit somewhere deep in the program. 338e5c89e4eSSatish Balay 339e5c89e4eSSatish Balay Collective on PETSC_COMM_WORLD 340e5c89e4eSSatish Balay 341e5c89e4eSSatish Balay Options Database Keys are the same as for PetscFinalize() 342e5c89e4eSSatish Balay 343e5c89e4eSSatish Balay Level: advanced 344e5c89e4eSSatish Balay 345e5c89e4eSSatish Balay Note: 346e5c89e4eSSatish Balay See PetscInitialize() for more general runtime options. 347e5c89e4eSSatish Balay 34888c29154SBarry Smith .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize() 349e5c89e4eSSatish Balay @*/ 3507087cfbeSBarry Smith PetscErrorCode PetscEnd(void) 351e5c89e4eSSatish Balay { 352e5c89e4eSSatish Balay PetscFunctionBegin; 353e5c89e4eSSatish Balay PetscFinalize(); 354e5c89e4eSSatish Balay exit(0); 355e5c89e4eSSatish Balay return 0; 356e5c89e4eSSatish Balay } 357e5c89e4eSSatish Balay 358ace3abfcSBarry Smith PetscBool PetscOptionsPublish = PETSC_FALSE; 35995c0884eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void); 36095c0884eSLisandro Dalcin PETSC_INTERN PetscBool petscsetmallocvisited; 361e5c89e4eSSatish Balay static char emacsmachinename[256]; 362e5c89e4eSSatish Balay 36302c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = NULL; 36402c9f0b5SLisandro Dalcin PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm) = NULL; 365e5c89e4eSSatish Balay 366e5c89e4eSSatish Balay /*@C 367e5c89e4eSSatish Balay PetscSetHelpVersionFunctions - Sets functions that print help and version information 368e5c89e4eSSatish Balay before the PETSc help and version information is printed. Must call BEFORE PetscInitialize(). 369e5c89e4eSSatish Balay This routine enables a "higher-level" package that uses PETSc to print its messages first. 370e5c89e4eSSatish Balay 371e5c89e4eSSatish Balay Input Parameter: 3720298fd71SBarry Smith + help - the help function (may be NULL) 3730298fd71SBarry Smith - version - the version function (may be NULL) 374e5c89e4eSSatish Balay 375e5c89e4eSSatish Balay Level: developer 376e5c89e4eSSatish Balay 377e5c89e4eSSatish Balay @*/ 3787087cfbeSBarry Smith PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm)) 379e5c89e4eSSatish Balay { 380e5c89e4eSSatish Balay PetscFunctionBegin; 381e5c89e4eSSatish Balay PetscExternalHelpFunction = help; 382e5c89e4eSSatish Balay PetscExternalVersionFunction = version; 383e5c89e4eSSatish Balay PetscFunctionReturn(0); 384e5c89e4eSSatish Balay } 385e5c89e4eSSatish Balay 38605df10baSBarry Smith #if defined(PETSC_USE_LOG) 38795c0884eSLisandro Dalcin PETSC_INTERN PetscBool PetscObjectsLog; 38805df10baSBarry Smith #endif 38905df10baSBarry Smith 390e781f417SStefano Zampini void PetscMPI_Comm_eh(MPI_Comm *comm, PetscMPIInt *err, ...) 391e781f417SStefano Zampini { 392e781f417SStefano Zampini if (PetscUnlikely(*err)) { 393e781f417SStefano Zampini PetscMPIInt len; 394e781f417SStefano Zampini char errstring[MPI_MAX_ERROR_STRING]; 395e781f417SStefano Zampini 396e781f417SStefano Zampini MPI_Error_string(*err,errstring,&len); 397e781f417SStefano Zampini PetscError(MPI_COMM_SELF,__LINE__,PETSC_FUNCTION_NAME,__FILE__,PETSC_MPI_ERROR_CODE,PETSC_ERROR_INITIAL,"Internal error in MPI: %s",errstring); 398e781f417SStefano Zampini } 399e781f417SStefano Zampini return; 400e781f417SStefano Zampini } 401e781f417SStefano Zampini 40257171095SVaclav Hapla PETSC_INTERN PetscErrorCode PetscOptionsCheckInitial_Private(const char help[]) 403e5c89e4eSSatish Balay { 404e5ed2c37SJose E. Roman char string[64]; 405e5c89e4eSSatish Balay MPI_Comm comm = PETSC_COMM_WORLD; 40657171095SVaclav Hapla PetscBool flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag,hasHelp; 407e5c89e4eSSatish Balay PetscErrorCode ierr; 40867584ceeSBarry Smith PetscReal si; 40928559dc8SJed Brown PetscInt intensity; 410e5c89e4eSSatish Balay int i; 411e5c89e4eSSatish Balay PetscMPIInt rank; 412d314f959SVaclav Hapla char version[256]; 4132479a3a6SBarry Smith #if defined(PETSC_USE_LOG) 414e5ed2c37SJose E. Roman char mname[PETSC_MAX_PATH_LEN]; 4152479a3a6SBarry Smith PetscViewerFormat format; 41667584ceeSBarry Smith PetscBool flg4 = PETSC_FALSE; 41767584ceeSBarry Smith #endif 4187381773fSBarry Smith 419e5c89e4eSSatish Balay PetscFunctionBegin; 42042218b76SBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 421e5c89e4eSSatish Balay 42267584ceeSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY) 42392f119d6SBarry Smith if (!(PETSC_RUNNING_ON_VALGRIND)) { 424e5c89e4eSSatish Balay /* 425e5c89e4eSSatish Balay Setup the memory management; support for tracing malloc() usage 426e5c89e4eSSatish Balay */ 427244bdbccSBarry Smith PetscBool mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE; 42892f119d6SBarry Smith 42976bd3646SJed Brown if (PetscDefined(USE_DEBUG)) { 43092f119d6SBarry Smith mdebug = PETSC_TRUE; 43192f119d6SBarry Smith initializenan = PETSC_TRUE; 43292f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 43376bd3646SJed Brown } else { 43492f119d6SBarry Smith /* don't warn about unused option */ 43592f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 43692f119d6SBarry Smith flg1 = PETSC_FALSE; 43776bd3646SJed Brown } 43879dccf82SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr); 43992f119d6SBarry Smith if (flg1 || flg2) { 44092f119d6SBarry Smith mdebug = PETSC_TRUE; 44192f119d6SBarry Smith eachcall = PETSC_TRUE; 44292f119d6SBarry Smith initializenan = PETSC_TRUE; 44379dccf82SBarry Smith } else if (flg3 && !flg2) { 44479dccf82SBarry Smith mdebug = PETSC_FALSE; 44579dccf82SBarry Smith eachcall = PETSC_FALSE; 44679dccf82SBarry Smith initializenan = PETSC_FALSE; 447e5c89e4eSSatish Balay } 44892f119d6SBarry Smith 44992f119d6SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr); 45092f119d6SBarry Smith if (mlog) { 45192f119d6SBarry Smith mdebug = PETSC_TRUE; 45292f119d6SBarry Smith } 45379dccf82SBarry Smith /* the next line is deprecated */ 45492f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr); 45592f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr); 45692f119d6SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr); 45792f119d6SBarry Smith if (mdebug) { 45892f119d6SBarry Smith ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr); 45992f119d6SBarry Smith } 46092f119d6SBarry Smith if (mlog) { 46192f119d6SBarry Smith PetscReal logthreshold = 0; 46292f119d6SBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr); 46392f119d6SBarry Smith ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr); 46492f119d6SBarry Smith } 4658b254c29SBarry Smith #if defined(PETSC_USE_LOG) 4668b254c29SBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&PetscLogMemory,NULL);CHKERRQ(ierr); 4678b254c29SBarry Smith #endif 46892f119d6SBarry Smith } 46992f119d6SBarry Smith 470ba282f50SJed Brown ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr); 471ba282f50SJed Brown if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);} 47290d69ab7SBarry Smith flg1 = PETSC_FALSE; 4732f21b5c6SHong Zhang ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr); 474cf6f3811SHong Zhang /* ignore this option if malloc is already set */ 475cf6f3811SHong Zhang if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);} 476e5c89e4eSSatish Balay 47790d69ab7SBarry Smith flg1 = PETSC_FALSE; 478c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr); 4797783f70dSSatish Balay if (!flg1) { 48090d69ab7SBarry Smith flg1 = PETSC_FALSE; 481c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr); 4827783f70dSSatish Balay } 483e5c89e4eSSatish Balay if (flg1) { 484e5c89e4eSSatish Balay ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 485e5c89e4eSSatish Balay } 48667584ceeSBarry Smith #endif 487e5c89e4eSSatish Balay 488b4427426SBarry Smith #if defined(PETSC_USE_LOG) 489c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr); 490b4427426SBarry Smith #endif 49105df10baSBarry Smith 492e5c89e4eSSatish Balay /* 493e5c89e4eSSatish Balay Set the display variable for graphics 494e5c89e4eSSatish Balay */ 495e5c89e4eSSatish Balay ierr = PetscSetDisplay();CHKERRQ(ierr); 496e5c89e4eSSatish Balay 49751dcc849SKerry Stevens /* 49857171095SVaclav Hapla Print main application help message 49957171095SVaclav Hapla */ 50057171095SVaclav Hapla ierr = PetscOptionsHasHelp(NULL,&hasHelp);CHKERRQ(ierr); 50157171095SVaclav Hapla if (help && hasHelp) { 50257171095SVaclav Hapla ierr = PetscPrintf(comm,help);CHKERRQ(ierr); 50357171095SVaclav Hapla ierr = PetscPrintf(comm,"----------------------------------------\n");CHKERRQ(ierr); 50457171095SVaclav Hapla } 50557171095SVaclav Hapla 50657171095SVaclav Hapla /* 507e5c89e4eSSatish Balay Print the PETSc version information 508e5c89e4eSSatish Balay */ 509d314f959SVaclav Hapla ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg1);CHKERRQ(ierr); 510d314f959SVaclav Hapla if (flg1 || hasHelp) { 511e5c89e4eSSatish Balay /* 512e5c89e4eSSatish Balay Print "higher-level" package version message 513e5c89e4eSSatish Balay */ 514e5c89e4eSSatish Balay if (PetscExternalVersionFunction) { 515e5c89e4eSSatish Balay ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 516e5c89e4eSSatish Balay } 517e5c89e4eSSatish Balay 518a523d312SBarry Smith ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 519e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 520e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 521e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 52284e42920SBarry Smith ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr); 523e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 524e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 525c0bb3764SVaclav Hapla ierr = (*PetscHelpPrintf)(comm,"----------------------------------------\n");CHKERRQ(ierr); 5267ca660e7SBarry Smith } 5277ca660e7SBarry Smith 52894941ca7SBarry Smith /* 52994941ca7SBarry Smith Print "higher-level" package help message 53094941ca7SBarry Smith */ 53157171095SVaclav Hapla if (hasHelp) { 532d314f959SVaclav Hapla PetscBool hasHelpIntro; 533d314f959SVaclav Hapla 53494941ca7SBarry Smith if (PetscExternalHelpFunction) { 53594941ca7SBarry Smith ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 53694941ca7SBarry Smith } 537d314f959SVaclav Hapla ierr = PetscOptionsHasHelpIntro_Internal(NULL,&hasHelpIntro);CHKERRQ(ierr); 538d314f959SVaclav Hapla if (hasHelpIntro) { 539bdb346e9SBarry Smith ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr); 540008a6e76SBarry Smith ierr = PetscFreeMPIResources();CHKERRQ(ierr); 5417ca660e7SBarry Smith ierr = MPI_Finalize();CHKERRQ(ierr); 5427ca660e7SBarry Smith exit(0); 5437ca660e7SBarry Smith } 544e5c89e4eSSatish Balay } 545e5c89e4eSSatish Balay 546e5c89e4eSSatish Balay /* 547e5c89e4eSSatish Balay Setup the error handling 548e5c89e4eSSatish Balay */ 54990d69ab7SBarry Smith flg1 = PETSC_FALSE; 550c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr); 551b59baad1SJed Brown if (flg1) { 55242218b76SBarry Smith ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRQ(ierr); 55302c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 554b59baad1SJed Brown } 55590d69ab7SBarry Smith flg1 = PETSC_FALSE; 556c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr); 55702c9f0b5SLisandro Dalcin if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,NULL);CHKERRQ(ierr);} 55890d69ab7SBarry Smith flg1 = PETSC_FALSE; 559c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr); 560e5c89e4eSSatish Balay if (flg1) { 561d54338ecSKarl Rupp ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr); 562e5c89e4eSSatish Balay } 563e781f417SStefano Zampini /* experimental */ 564e781f417SStefano Zampini flg1 = PETSC_FALSE; 565e781f417SStefano Zampini ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_error_string",&flg1,NULL);CHKERRQ(ierr); 566e781f417SStefano Zampini if (flg1) { 567e781f417SStefano Zampini MPI_Errhandler eh; 568e781f417SStefano Zampini 569e781f417SStefano Zampini ierr = MPI_Comm_create_errhandler(PetscMPI_Comm_eh,&eh);CHKERRQ(ierr); 570e781f417SStefano Zampini ierr = MPI_Comm_set_errhandler(comm,eh);CHKERRQ(ierr); 571e781f417SStefano Zampini ierr = MPI_Errhandler_free(&eh);CHKERRQ(ierr); 572e781f417SStefano Zampini } 57390d69ab7SBarry Smith flg1 = PETSC_FALSE; 574c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr); 5758d359177SBarry Smith if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);} 576e5c89e4eSSatish Balay 577e5c89e4eSSatish Balay /* 578e5c89e4eSSatish Balay Setup debugger information 579e5c89e4eSSatish Balay */ 580e5c89e4eSSatish Balay ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 581589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 582e5c89e4eSSatish Balay if (flg1) { 583e5c89e4eSSatish Balay MPI_Errhandler err_handler; 584e5c89e4eSSatish Balay 585e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 58633c7d699SBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr); 587d54338ecSKarl Rupp ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRQ(ierr); 58802c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,NULL);CHKERRQ(ierr); 589e5c89e4eSSatish Balay } 590589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,sizeof(string),&flg1);CHKERRQ(ierr); 5915e96ac45SJed Brown if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 592589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,sizeof(string),&flg1);CHKERRQ(ierr); 593589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,sizeof(string),&flg2);CHKERRQ(ierr); 594e5c89e4eSSatish Balay if (flg1 || flg2) { 595e5c89e4eSSatish Balay PetscMPIInt size; 596e5c89e4eSSatish Balay PetscInt lsize,*nodes; 597e5c89e4eSSatish Balay MPI_Errhandler err_handler; 598e5c89e4eSSatish Balay /* 599e5c89e4eSSatish Balay we have to make sure that all processors have opened 600e5c89e4eSSatish Balay connections to all other processors, otherwise once the 601e5c89e4eSSatish Balay debugger has stated it is likely to receive a SIGUSR1 602e5c89e4eSSatish Balay and kill the program. 603e5c89e4eSSatish Balay */ 60442218b76SBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 605e5c89e4eSSatish Balay if (size > 2) { 606533163c2SBarry Smith PetscMPIInt dummy = 0; 607e5c89e4eSSatish Balay MPI_Status status; 608e5c89e4eSSatish Balay for (i=0; i<size; i++) { 609e5c89e4eSSatish Balay if (rank != i) { 61042218b76SBarry Smith ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRQ(ierr); 611e5c89e4eSSatish Balay } 612e5c89e4eSSatish Balay } 613e5c89e4eSSatish Balay for (i=0; i<size; i++) { 614e5c89e4eSSatish Balay if (rank != i) { 61542218b76SBarry Smith ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRQ(ierr); 616e5c89e4eSSatish Balay } 617e5c89e4eSSatish Balay } 618e5c89e4eSSatish Balay } 619e5c89e4eSSatish Balay /* check if this processor node should be in debugger */ 620785e854fSJed Brown ierr = PetscMalloc1(size,&nodes);CHKERRQ(ierr); 621e5c89e4eSSatish Balay lsize = size; 622c5929fdfSBarry Smith ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr); 623e5c89e4eSSatish Balay if (flag) { 624e5c89e4eSSatish Balay for (i=0; i<lsize; i++) { 625e5c89e4eSSatish Balay if (nodes[i] == rank) { flag = PETSC_FALSE; break; } 626e5c89e4eSSatish Balay } 627e5c89e4eSSatish Balay } 628e5c89e4eSSatish Balay if (!flag) { 629e5c89e4eSSatish Balay ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 63002c9f0b5SLisandro Dalcin ierr = PetscPushErrorHandler(PetscAbortErrorHandler,NULL);CHKERRQ(ierr); 631e5c89e4eSSatish Balay if (flg1) { 632e5c89e4eSSatish Balay ierr = PetscAttachDebugger();CHKERRQ(ierr); 633e5c89e4eSSatish Balay } else { 634e5c89e4eSSatish Balay ierr = PetscStopForDebugger();CHKERRQ(ierr); 635e5c89e4eSSatish Balay } 63633c7d699SBarry Smith ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr); 637d54338ecSKarl Rupp ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRQ(ierr); 638e5c89e4eSSatish Balay } 639e5c89e4eSSatish Balay ierr = PetscFree(nodes);CHKERRQ(ierr); 640e5c89e4eSSatish Balay } 641e5c89e4eSSatish Balay 642589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,sizeof(emacsmachinename),&flg1);CHKERRQ(ierr); 643cb9801acSJed Brown if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);} 644e5c89e4eSSatish Balay 645e5c89e4eSSatish Balay /* 646e5c89e4eSSatish Balay Setup profiling and logging 647e5c89e4eSSatish Balay */ 6486cf91177SBarry Smith #if defined(PETSC_USE_INFO) 6498bb29257SSatish Balay { 650e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFromOptions(NULL);CHKERRQ(ierr); 651e5c89e4eSSatish Balay } 652865f6aa8SSatish Balay #endif 653aba4c478SBarry Smith ierr = PetscDetermineInitialFPTrap(); 654cc9df77eSBarry Smith flg1 = PETSC_FALSE; 655cc9df77eSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr); 656cc9df77eSBarry Smith if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);} 657cc9df77eSBarry Smith ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr); 658cc9df77eSBarry Smith if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);} 659865f6aa8SSatish Balay #if defined(PETSC_USE_LOG) 660865f6aa8SSatish Balay mname[0] = 0; 661589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 662865f6aa8SSatish Balay if (flg1) { 663865f6aa8SSatish Balay if (mname[0]) { 664f3dea69dSBarry Smith ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 665865f6aa8SSatish Balay } else { 666706d7a88SBarry Smith ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr); 667865f6aa8SSatish Balay } 668865f6aa8SSatish Balay } 669217044c2SLisandro Dalcin 670217044c2SLisandro Dalcin ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr); 671217044c2SLisandro Dalcin 672e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 67390d69ab7SBarry Smith flg1 = PETSC_FALSE; 674c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 675495fc317SBarry Smith if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);} 676e5c89e4eSSatish Balay #endif 67790d69ab7SBarry Smith flg1 = PETSC_FALSE; 67890d69ab7SBarry Smith flg3 = PETSC_FALSE; 679c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr); 680c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 681e5c89e4eSSatish Balay if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 682bb1d7374SBarry Smith else if (flg3) { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);} 683e5c89e4eSSatish Balay 684589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,sizeof(mname),&flg1);CHKERRQ(ierr); 685e5c89e4eSSatish Balay if (flg1) { 686e5c89e4eSSatish Balay char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 687e5c89e4eSSatish Balay FILE *file; 688e5c89e4eSSatish Balay if (mname[0]) { 6892e924ca5SSatish Balay PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank); 690e5c89e4eSSatish Balay ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 691e5c89e4eSSatish Balay file = fopen(fname,"w"); 692f3dea69dSBarry Smith if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 693a297a907SKarl Rupp } else file = PETSC_STDOUT; 694e5c89e4eSSatish Balay ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 695e5c89e4eSSatish Balay } 696bb1d7374SBarry Smith 69716413a6aSBarry Smith ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr); 698bb1d7374SBarry Smith if (flg4) { 699bb1d7374SBarry Smith if (format == PETSC_VIEWER_ASCII_XML) { 700bb1d7374SBarry Smith ierr = PetscLogNestedBegin();CHKERRQ(ierr); 701bb1d7374SBarry Smith } else { 702bb1d7374SBarry Smith ierr = PetscLogDefaultBegin();CHKERRQ(ierr); 703bb1d7374SBarry Smith } 704eccbb886SLisandro Dalcin } 705eccbb886SLisandro Dalcin if (flg4 && format == PETSC_VIEWER_ASCII_XML) { 706eccbb886SLisandro Dalcin PetscReal threshold = PetscRealConstant(0.01); 707eccbb886SLisandro Dalcin ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr); 708eccbb886SLisandro Dalcin if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);} 709bb1d7374SBarry Smith } 710e5c89e4eSSatish Balay #endif 711e5c89e4eSSatish Balay 712c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr); 713e5c89e4eSSatish Balay 7144b0a73b2SBarry Smith #if defined(PETSC_HAVE_CUDA) 715*cae85d06SJunchao Zhang { 716*cae85d06SJunchao Zhang cudaError_t cerr; 717*cae85d06SJunchao Zhang PetscBool initCUDA = PETSC_FALSE,cudaView = PETSC_FALSE,logView = PETSC_FALSE,devNone = PETSC_FALSE; 718*cae85d06SJunchao Zhang struct cudaDeviceProp prop; 719*cae85d06SJunchao Zhang PetscInt device; 720*cae85d06SJunchao Zhang char devStr[16]={0}; 721*cae85d06SJunchao Zhang int devId,devCount; 7228d4e85a7SStefano Zampini /* 7238d4e85a7SStefano Zampini If collecting logging information, by default, wait for GPU to complete its operations 7248d4e85a7SStefano Zampini before returning to the CPU in order to get accurate timings of each event 7258d4e85a7SStefano Zampini */ 726*cae85d06SJunchao Zhang ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&logView);CHKERRQ(ierr); 727*cae85d06SJunchao Zhang if (!logView) { 728*cae85d06SJunchao Zhang ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&logView);CHKERRQ(ierr); 7298d4e85a7SStefano Zampini } 730*cae85d06SJunchao Zhang PetscCUDASynchronize = logView; 7318d4e85a7SStefano Zampini 732*cae85d06SJunchao Zhang ierr = PetscOptionsBegin(PETSC_COMM_WORLD,NULL,"CUDA options","Sys");CHKERRQ(ierr); 733*cae85d06SJunchao Zhang ierr = PetscOptionsString("-cuda_set_device","Set which MPI ranks to use which CUDA devices","PetscCUDAInitialize",devStr,devStr,sizeof(devStr),&initCUDA);CHKERRQ(ierr); 734*cae85d06SJunchao Zhang ierr = PetscStrcasecmp("none",devStr,&devNone);CHKERRQ(ierr); 735*cae85d06SJunchao Zhang if (devNone) device = -3; /* -3 is the locally used PETSC_NONE in PetscCUDAInitialize() */ 736*cae85d06SJunchao Zhang else {ierr = PetscOptionsInt("-cuda_set_device","Set which MPI ranks to use which CUDA devices","PetscCUDAInitialize",device,&device,&initCUDA);CHKERRQ(ierr);} 7378d4e85a7SStefano Zampini ierr = PetscOptionsBool("-cuda_synchronize","Wait for the GPU to complete operations before returning to the CPU (on by default with -log_summary or -log_view)",NULL,PetscCUDASynchronize,&PetscCUDASynchronize,NULL);CHKERRQ(ierr); 738*cae85d06SJunchao Zhang ierr = PetscOptionsDeprecated("-cuda_show_devices","-cuda_view","3.12",NULL);CHKERRQ(ierr); 739*cae85d06SJunchao Zhang ierr = PetscOptionsName("-cuda_view","Display CUDA device information and assignments",NULL,&cudaView);CHKERRQ(ierr); 740*cae85d06SJunchao Zhang /* Get use_gpu_aware_mpi ASAP since it might be accessed even before lazy CUDA initialization */ 741c2a741eeSJunchao Zhang ierr = PetscOptionsBool("-use_gpu_aware_mpi","Use GPU-aware MPI",NULL,use_gpu_aware_mpi,&use_gpu_aware_mpi,NULL);CHKERRQ(ierr); 742012f15ecSRichard Tran Mills ierr = PetscOptionsEnd();CHKERRQ(ierr); 743*cae85d06SJunchao Zhang 744*cae85d06SJunchao Zhang if (initCUDA) {ierr = PetscCUDAInitialize(PETSC_COMM_WORLD,device);CHKERRQ(ierr);} 745*cae85d06SJunchao Zhang else if (logView) { /* With -log_view, we want to do costly cuda runtime initialization early so that not to distort the timing later. */ 746*cae85d06SJunchao Zhang devCount = 0; 747*cae85d06SJunchao Zhang cerr = cudaGetDeviceCount(&devCount); 748*cae85d06SJunchao Zhang cudaGetLastError(); /* Reset the last error */ 749*cae85d06SJunchao Zhang if (cerr == cudaSuccess && devCount >= 1) { /* There are GPU(s) */ 750*cae85d06SJunchao Zhang devId = 0; 751*cae85d06SJunchao Zhang if (devCount > 1) { /* Decide which GPU to init when there are multiple GPUs */ 752*cae85d06SJunchao Zhang cerr = cudaSetDeviceFlags(cudaDeviceMapHost); 753*cae85d06SJunchao Zhang cudaGetLastError(); /* Reset the last error */ 754*cae85d06SJunchao Zhang if (cerr == cudaSuccess) { /* It implies cuda runtime has not been initialized */ 755*cae85d06SJunchao Zhang ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 756*cae85d06SJunchao Zhang devId = rank % devCount; 757*cae85d06SJunchao Zhang cerr = cudaSetDevice(devId);CHKERRCUDA(cerr); 758*cae85d06SJunchao Zhang } else if (cerr == cudaErrorSetOnActiveProcess) { 759*cae85d06SJunchao Zhang /* It means user initialized cuda runtime outside of petsc. We respect the device choice. */ 760*cae85d06SJunchao Zhang cerr = cudaGetDevice(&devId);CHKERRCUDA(cerr); 761fe2aebe2SStefano Zampini } 762*cae85d06SJunchao Zhang } 763*cae85d06SJunchao Zhang ierr = PetscCUDAInitialize(PETSC_COMM_WORLD,(PetscInt)devId);CHKERRQ(ierr); 764*cae85d06SJunchao Zhang } 765*cae85d06SJunchao Zhang } 766*cae85d06SJunchao Zhang 767*cae85d06SJunchao Zhang if (cudaView) { 768*cae85d06SJunchao Zhang ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 769*cae85d06SJunchao Zhang cerr = cudaGetDeviceCount(&devCount);CHKERRCUDA(cerr); 770*cae85d06SJunchao Zhang for (devId = 0; devId < devCount; ++devId) { 771*cae85d06SJunchao Zhang cerr = cudaGetDeviceProperties(&prop,devId);CHKERRCUDA(cerr); 772*cae85d06SJunchao Zhang ierr = PetscPrintf(PETSC_COMM_WORLD, "CUDA device %d: %s\n", devId, prop.name);CHKERRQ(ierr); 773*cae85d06SJunchao Zhang } 774*cae85d06SJunchao Zhang cerr = cudaGetDevice(&devId);CHKERRCUDA(cerr); 775*cae85d06SJunchao Zhang ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] Using CUDA device %d.\n",rank,devId);CHKERRQ(ierr); 776*cae85d06SJunchao Zhang ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT);CHKERRQ(ierr); 777c2a741eeSJunchao Zhang } 778c2a741eeSJunchao Zhang } 7794b0a73b2SBarry Smith #endif 7804b0a73b2SBarry Smith 781e5c89e4eSSatish Balay /* 782e5c89e4eSSatish Balay Print basic help message 783e5c89e4eSSatish Balay */ 78457171095SVaclav Hapla if (hasHelp) { 785e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 786d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -version: prints PETSc version\n");CHKERRQ(ierr); 787d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help intro: prints example description and PETSc version, and exits\n");CHKERRQ(ierr); 788d314f959SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -help: prints example description, PETSc version, and available options for used routines\n");CHKERRQ(ierr); 789301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr); 790301d30feSBarry Smith ierr = (*PetscHelpPrintf)(comm," only when run in the debugger\n");CHKERRQ(ierr); 791e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 792e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 793e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 794e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 795e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 796e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 797e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 798e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr); 799e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 800e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 801e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 8021cda70a7SBarry Smith ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr); 803e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 804e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 805e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 806e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 807e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 80879dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr); 80979dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr); 8104161f2a3SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 81192f119d6SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr); 81279dccf82SBarry Smith ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr); 81326a7e8d4SBarry Smith ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr); 814e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 815e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 816e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 817e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 818a8c7a070SBarry Smith ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 8190841954dSBarry Smith ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr); 820e5c89e4eSSatish Balay #if defined(PETSC_USE_LOG) 821e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 822185ae32fSMatthew G. Knepley ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr); 823e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 82456071f75SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -log_exclude <list,of,classnames>: exclude given classes from logging\n");CHKERRQ(ierr); 825e5c89e4eSSatish Balay #if defined(PETSC_HAVE_MPE) 826495fc317SBarry Smith ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr); 827e5c89e4eSSatish Balay #endif 828e94e781bSJacob Faibussowitsch #endif 829e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_INFO) 830fe9b927eSVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -info [filename][:[~]<list,of,classnames>[:[~]self]]: print verbose information\n");CHKERRQ(ierr); 831e5c89e4eSSatish Balay #endif 832e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 833c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor: monitor options to standard output, including that set previously e.g. in option files\n");CHKERRQ(ierr); 834c5b5d8d5SVaclav Hapla ierr = (*PetscHelpPrintf)(comm," -options_monitor_cancel: cancels all hardwired option monitors\n");CHKERRQ(ierr); 835e5c89e4eSSatish Balay ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 836e5c89e4eSSatish Balay } 837e5c89e4eSSatish Balay 83874ba8654SBarry Smith #if defined(PETSC_HAVE_POPEN) 83974ba8654SBarry Smith { 84074ba8654SBarry Smith char machine[128]; 841589a23caSBarry Smith ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,sizeof(machine),&flg1);CHKERRQ(ierr); 84274ba8654SBarry Smith if (flg1) { 84374ba8654SBarry Smith ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr); 84474ba8654SBarry Smith } 84574ba8654SBarry Smith } 84674ba8654SBarry Smith #endif 84774ba8654SBarry Smith 848c5929fdfSBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 849e5c89e4eSSatish Balay if (flg1) { 850e5c89e4eSSatish Balay ierr = PetscSleep(si);CHKERRQ(ierr); 851e5c89e4eSSatish Balay } 852e5c89e4eSSatish Balay 853fdc842d1SBarry Smith #if defined(PETSC_HAVE_VIENNACL) 854c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 855f14045dbSBarry Smith if (!flg3) { 856c5929fdfSBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr); 857f14045dbSBarry Smith } 858c5929fdfSBarry Smith ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr); 859f14045dbSBarry Smith PetscViennaCLSynchronize = flg3; 860fdc842d1SBarry Smith ierr = PetscViennaCLInit();CHKERRQ(ierr); 8614cf1874eSKarl Rupp #endif 86282f73ecaSAlejandro Lamas Daviña 863fdc842d1SBarry Smith /* 864fdc842d1SBarry Smith Creates the logging data structures; this is enabled even if logging is not turned on 865fdc842d1SBarry Smith This is the last thing we do before returning to the user code to prevent having the 866fdc842d1SBarry Smith logging numbers contaminated by any startup time associated with MPI and the GPUs 867fdc842d1SBarry Smith */ 868fdc842d1SBarry Smith #if defined(PETSC_USE_LOG) 869fdc842d1SBarry Smith ierr = PetscLogInitialize();CHKERRQ(ierr); 870f0a7718cSKarl Rupp #endif 871f0a7718cSKarl Rupp 872e5c89e4eSSatish Balay PetscFunctionReturn(0); 873e5c89e4eSSatish Balay } 874