1 /* 2 3 This file defines part of the initialization of PETSc 4 5 This file uses regular malloc and free because it cannot known 6 what malloc is being used until it has already processed the input. 7 */ 8 9 #include <petscsys.h> /*I "petscsys.h" I*/ 10 #include <petsc/private/petscimpl.h> 11 #include <petscvalgrind.h> 12 #include <petscviewer.h> 13 #if defined(PETSC_USE_LOG) 14 PETSC_INTERN PetscErrorCode PetscLogInitialize(void); 15 #endif 16 17 #if defined(PETSC_HAVE_SYS_SYSINFO_H) 18 #include <sys/sysinfo.h> 19 #endif 20 #if defined(PETSC_HAVE_UNISTD_H) 21 #include <unistd.h> 22 #endif 23 #if defined(PETSC_HAVE_CUDA) 24 #include <cuda_runtime.h> 25 #include <petsccublas.h> 26 #endif 27 28 #if defined(PETSC_HAVE_VIENNACL) 29 PETSC_EXTERN PetscErrorCode PetscViennaCLInit(); 30 #endif 31 32 /* ------------------------Nasty global variables -------------------------------*/ 33 /* 34 Indicates if PETSc started up MPI, or it was 35 already started before PETSc was initialized. 36 */ 37 PetscBool PetscBeganMPI = PETSC_FALSE; 38 PetscBool PetscInitializeCalled = PETSC_FALSE; 39 PetscBool PetscFinalizeCalled = PETSC_FALSE; 40 PetscBool PetscCUDAInitialized = PETSC_FALSE; 41 42 PetscMPIInt PetscGlobalRank = -1; 43 PetscMPIInt PetscGlobalSize = -1; 44 45 #if defined(PETSC_HAVE_COMPLEX) 46 #if defined(PETSC_COMPLEX_INSTANTIATE) 47 template <> class std::complex<double>; /* instantiate complex template class */ 48 #endif 49 #if !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX) 50 MPI_Datatype MPIU_C_DOUBLE_COMPLEX; 51 MPI_Datatype MPIU_C_COMPLEX; 52 #endif 53 54 /*MC 55 PETSC_i - the imaginary number i 56 57 Synopsis: 58 #include <petscsys.h> 59 PetscComplex PETSC_i; 60 61 Level: beginner 62 63 Note: 64 Complex numbers are automatically available if PETSc located a working complex implementation 65 66 .seealso: PetscRealPart(), PetscImaginaryPart(), PetscRealPartComplex(), PetscImaginaryPartComplex() 67 M*/ 68 PetscComplex PETSC_i; 69 #endif 70 #if defined(PETSC_USE_REAL___FLOAT128) 71 MPI_Datatype MPIU___FLOAT128 = 0; 72 #if defined(PETSC_HAVE_COMPLEX) 73 MPI_Datatype MPIU___COMPLEX128 = 0; 74 #endif 75 #elif defined(PETSC_USE_REAL___FP16) 76 MPI_Datatype MPIU___FP16 = 0; 77 #endif 78 MPI_Datatype MPIU_2SCALAR = 0; 79 #if defined(PETSC_USE_64BIT_INDICES) 80 MPI_Datatype MPIU_2INT = 0; 81 #endif 82 MPI_Datatype MPIU_BOOL; 83 MPI_Datatype MPIU_ENUM; 84 MPI_Datatype MPIU_FORTRANADDR; 85 MPI_Datatype MPIU_SIZE_T; 86 87 /* 88 Function that is called to display all error messages 89 */ 90 PetscErrorCode (*PetscErrorPrintf)(const char [],...) = PetscErrorPrintfDefault; 91 PetscErrorCode (*PetscHelpPrintf)(MPI_Comm,const char [],...) = PetscHelpPrintfDefault; 92 PetscErrorCode (*PetscVFPrintf)(FILE*,const char[],va_list) = PetscVFPrintfDefault; 93 /* 94 This is needed to turn on/off GPU synchronization 95 */ 96 PetscBool PetscViennaCLSynchronize = PETSC_FALSE; 97 PetscBool PetscCUDASynchronize = PETSC_FALSE; 98 99 /* ------------------------------------------------------------------------------*/ 100 /* 101 Optional file where all PETSc output from various prints is saved 102 */ 103 PETSC_INTERN FILE *petsc_history; 104 FILE *petsc_history = NULL; 105 106 PetscErrorCode PetscOpenHistoryFile(const char filename[],FILE **fd) 107 { 108 PetscErrorCode ierr; 109 PetscMPIInt rank,size; 110 char pfile[PETSC_MAX_PATH_LEN],pname[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN],date[64]; 111 char version[256]; 112 113 PetscFunctionBegin; 114 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 115 if (!rank) { 116 char arch[10]; 117 int err; 118 119 ierr = PetscGetArchType(arch,10);CHKERRQ(ierr); 120 ierr = PetscGetDate(date,64);CHKERRQ(ierr); 121 ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 122 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 123 if (filename) { 124 ierr = PetscFixFilename(filename,fname);CHKERRQ(ierr); 125 } else { 126 ierr = PetscGetHomeDirectory(pfile,240);CHKERRQ(ierr); 127 ierr = PetscStrcat(pfile,"/.petschistory");CHKERRQ(ierr); 128 ierr = PetscFixFilename(pfile,fname);CHKERRQ(ierr); 129 } 130 131 *fd = fopen(fname,"a"); 132 if (!fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open file: %s",fname); 133 134 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 135 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s %s\n",version,date);CHKERRQ(ierr); 136 ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 137 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"%s on a %s, %d proc. with options:\n",pname,arch,size);CHKERRQ(ierr); 138 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 139 140 err = fflush(*fd); 141 if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 142 } 143 PetscFunctionReturn(0); 144 } 145 146 PETSC_INTERN PetscErrorCode PetscCloseHistoryFile(FILE **fd) 147 { 148 PetscErrorCode ierr; 149 PetscMPIInt rank; 150 char date[64]; 151 int err; 152 153 PetscFunctionBegin; 154 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 155 if (!rank) { 156 ierr = PetscGetDate(date,64);CHKERRQ(ierr); 157 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 158 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"Finished at %s\n",date);CHKERRQ(ierr); 159 ierr = PetscFPrintf(PETSC_COMM_SELF,*fd,"---------------------------------------------------------\n");CHKERRQ(ierr); 160 err = fflush(*fd); 161 if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 162 err = fclose(*fd); 163 if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 164 } 165 PetscFunctionReturn(0); 166 } 167 168 /* ------------------------------------------------------------------------------*/ 169 170 /* 171 This is ugly and probably belongs somewhere else, but I want to 172 be able to put a true MPI abort error handler with command line args. 173 174 This is so MPI errors in the debugger will leave all the stack 175 frames. The default MP_Abort() cleans up and exits thus providing no useful information 176 in the debugger hence we call abort() instead of MPI_Abort(). 177 */ 178 179 void Petsc_MPI_AbortOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 180 { 181 PetscFunctionBegin; 182 (*PetscErrorPrintf)("MPI error %d\n",*flag); 183 abort(); 184 } 185 186 void Petsc_MPI_DebuggerOnError(MPI_Comm *comm,PetscMPIInt *flag,...) 187 { 188 PetscErrorCode ierr; 189 190 PetscFunctionBegin; 191 (*PetscErrorPrintf)("MPI error %d\n",*flag); 192 ierr = PetscAttachDebugger(); 193 if (ierr) PETSCABORT(*comm,*flag); /* hopeless so get out */ 194 } 195 196 #if defined(PETSC_HAVE_CUDA) 197 /*@C 198 PetscCUDAInitialize - Initializes the CUDA device and cuBLAS on the device 199 200 Logically collective 201 202 Input Parameter: 203 comm - the MPI communicator that will utilize the CUDA devices 204 205 Options Database: 206 + -cuda_initialize <default yes,no> - do the initialization in PetscInitialize(). If -cuda_initialize no is used then the default initialization is done automatically 207 when the first CUDA call is made unless you call PetscCUDAInitialize() before any CUDA operations are performed 208 . -cuda_view - view information about the CUDA devices 209 . -cuda_synchronize - wait at the end of asynchronize CUDA calls so that their time gets credited to the current event; default with -log_view 210 - -cuda_set_device <gpu> - integer number of the device 211 212 Level: beginner 213 214 Notes: 215 Initializing cuBLAS takes about 1/2 second there it is done by default in PetscInitialize() before logging begins 216 217 @*/ 218 PetscErrorCode PetscCUDAInitialize(MPI_Comm comm) 219 { 220 PetscErrorCode ierr; 221 PetscInt deviceOpt = 0; 222 PetscBool cuda_view_flag = PETSC_FALSE,flg; 223 struct cudaDeviceProp prop; 224 int devCount,device,devicecnt; 225 cudaError_t err = cudaSuccess; 226 PetscMPIInt rank,size; 227 228 PetscFunctionBegin; 229 /* 230 If collecting logging information, by default, wait for GPU to complete its operations 231 before returning to the CPU in order to get accurate timings of each event 232 */ 233 ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&PetscCUDASynchronize);CHKERRQ(ierr); 234 if (!PetscCUDASynchronize) { 235 ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&PetscCUDASynchronize);CHKERRQ(ierr); 236 } 237 238 ierr = PetscOptionsBegin(comm,NULL,"CUDA options","Sys");CHKERRQ(ierr); 239 ierr = PetscOptionsInt("-cuda_set_device","Set all MPI ranks to use the specified CUDA device",NULL,deviceOpt,&deviceOpt,&flg);CHKERRQ(ierr); 240 device = (int)deviceOpt; 241 ierr = PetscOptionsBool("-cuda_synchronize","Wait for the GPU to complete operations before returning to the CPU",NULL,PetscCUDASynchronize,&PetscCUDASynchronize,NULL);CHKERRQ(ierr); 242 ierr = PetscOptionsDeprecated("-cuda_show_devices","-cuda_view","3.12",NULL);CHKERRQ(ierr); 243 ierr = PetscOptionsName("-cuda_view","Display CUDA device information and assignments",NULL,&cuda_view_flag);CHKERRQ(ierr); 244 ierr = PetscOptionsEnd();CHKERRQ(ierr); 245 if (!PetscCUDAInitialized) { 246 ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 247 248 if (size>1 && !flg) { 249 /* check to see if we force multiple ranks to hit the same GPU */ 250 /* we're not using the same GPU on multiple MPI threads. So try to allocated different GPUs to different processes */ 251 252 /* First get the device count */ 253 err = cudaGetDeviceCount(&devCount); 254 if (err != cudaSuccess) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SYS,"error in cudaGetDeviceCount %s",cudaGetErrorString(err)); 255 256 /* next determine the rank and then set the device via a mod */ 257 ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 258 device = rank % devCount; 259 } 260 err = cudaSetDevice(device); 261 if (err != cudaSuccess) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SYS,"error in cudaSetDevice %s",cudaGetErrorString(err)); 262 263 /* set the device flags so that it can map host memory */ 264 err = cudaSetDeviceFlags(cudaDeviceMapHost); 265 if (err != cudaSuccess) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SYS,"error in cudaSetDeviceFlags %s",cudaGetErrorString(err)); 266 267 ierr = PetscCUBLASInitializeHandle();CHKERRQ(ierr); 268 ierr = PetscCUSOLVERDnInitializeHandle();CHKERRQ(ierr); 269 PetscCUDAInitialized = PETSC_TRUE; 270 } 271 if (cuda_view_flag) { 272 ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 273 err = cudaGetDeviceCount(&devCount); 274 if (err != cudaSuccess) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SYS,"error in cudaGetDeviceCount %s",cudaGetErrorString(err)); 275 for (devicecnt = 0; devicecnt < devCount; ++devicecnt) { 276 err = cudaGetDeviceProperties(&prop,devicecnt); 277 if (err != cudaSuccess) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SYS,"error in cudaGetDeviceProperties %s",cudaGetErrorString(err)); 278 ierr = PetscPrintf(comm, "CUDA device %d: %s\n", devicecnt, prop.name);CHKERRQ(ierr); 279 } 280 ierr = PetscSynchronizedPrintf(comm,"[%d] Using CUDA device %d.\n",rank,device);CHKERRQ(ierr); 281 ierr = PetscSynchronizedFlush(comm,PETSC_STDOUT);CHKERRQ(ierr); 282 } 283 PetscFunctionReturn(0); 284 } 285 #endif 286 287 /*@C 288 PetscEnd - Calls PetscFinalize() and then ends the program. This is useful if one 289 wishes a clean exit somewhere deep in the program. 290 291 Collective on PETSC_COMM_WORLD 292 293 Options Database Keys are the same as for PetscFinalize() 294 295 Level: advanced 296 297 Note: 298 See PetscInitialize() for more general runtime options. 299 300 .seealso: PetscInitialize(), PetscOptionsView(), PetscMallocDump(), PetscMPIDump(), PetscFinalize() 301 @*/ 302 PetscErrorCode PetscEnd(void) 303 { 304 PetscFunctionBegin; 305 PetscFinalize(); 306 exit(0); 307 return 0; 308 } 309 310 PetscBool PetscOptionsPublish = PETSC_FALSE; 311 PETSC_INTERN PetscErrorCode PetscSetUseHBWMalloc_Private(void); 312 PETSC_INTERN PetscBool petscsetmallocvisited; 313 static char emacsmachinename[256]; 314 315 PetscErrorCode (*PetscExternalVersionFunction)(MPI_Comm) = 0; 316 PetscErrorCode (*PetscExternalHelpFunction)(MPI_Comm) = 0; 317 318 /*@C 319 PetscSetHelpVersionFunctions - Sets functions that print help and version information 320 before the PETSc help and version information is printed. Must call BEFORE PetscInitialize(). 321 This routine enables a "higher-level" package that uses PETSc to print its messages first. 322 323 Input Parameter: 324 + help - the help function (may be NULL) 325 - version - the version function (may be NULL) 326 327 Level: developer 328 329 @*/ 330 PetscErrorCode PetscSetHelpVersionFunctions(PetscErrorCode (*help)(MPI_Comm),PetscErrorCode (*version)(MPI_Comm)) 331 { 332 PetscFunctionBegin; 333 PetscExternalHelpFunction = help; 334 PetscExternalVersionFunction = version; 335 PetscFunctionReturn(0); 336 } 337 338 #if defined(PETSC_USE_LOG) 339 PETSC_INTERN PetscBool PetscObjectsLog; 340 #endif 341 342 PETSC_INTERN PetscErrorCode PetscOptionsCheckInitial_Private(void) 343 { 344 char string[64],mname[PETSC_MAX_PATH_LEN],*f; 345 MPI_Comm comm = PETSC_COMM_WORLD; 346 PetscBool flg1 = PETSC_FALSE,flg2 = PETSC_FALSE,flg3 = PETSC_FALSE,flag; 347 PetscErrorCode ierr; 348 PetscReal si; 349 PetscInt intensity; 350 int i; 351 PetscMPIInt rank; 352 char version[256],helpoptions[256]; 353 #if defined(PETSC_USE_LOG) 354 PetscViewerFormat format; 355 PetscBool flg4 = PETSC_FALSE; 356 #endif 357 #if defined(PETSC_HAVE_CUDA) 358 PetscBool initCuda = PETSC_TRUE; 359 #endif 360 361 PetscFunctionBegin; 362 ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 363 364 #if !defined(PETSC_HAVE_THREADSAFETY) 365 if (!(PETSC_RUNNING_ON_VALGRIND)) { 366 /* 367 Setup the memory management; support for tracing malloc() usage 368 */ 369 PetscBool mdebug = PETSC_FALSE, eachcall = PETSC_FALSE, initializenan = PETSC_FALSE, mlog = PETSC_FALSE; 370 371 #if defined(PETSC_USE_DEBUG) 372 mdebug = PETSC_TRUE; 373 initializenan = PETSC_TRUE; 374 ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 375 #else 376 /* don't warn about unused option */ 377 ierr = PetscOptionsHasName(NULL,NULL,"-malloc_test",&flg1);CHKERRQ(ierr); 378 flg1 = PETSC_FALSE; 379 #endif 380 ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_debug",&flg2,&flg3);CHKERRQ(ierr); 381 if (flg1 || flg2) { 382 mdebug = PETSC_TRUE; 383 eachcall = PETSC_TRUE; 384 initializenan = PETSC_TRUE; 385 } else if (flg3 && !flg2) { 386 mdebug = PETSC_FALSE; 387 eachcall = PETSC_FALSE; 388 initializenan = PETSC_FALSE; 389 } 390 391 ierr = PetscOptionsHasName(NULL,NULL,"-malloc_view",&mlog);CHKERRQ(ierr); 392 if (mlog) { 393 mdebug = PETSC_TRUE; 394 } 395 /* the next line is deprecated */ 396 ierr = PetscOptionsGetBool(NULL,NULL,"-malloc",&mdebug,NULL);CHKERRQ(ierr); 397 ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_dump",&mdebug,NULL);CHKERRQ(ierr); 398 ierr = PetscOptionsGetBool(NULL,NULL,"-log_view_memory",&mdebug,NULL);CHKERRQ(ierr); 399 if (mdebug) { 400 ierr = PetscMallocSetDebug(eachcall,initializenan);CHKERRQ(ierr); 401 } 402 if (mlog) { 403 PetscReal logthreshold = 0; 404 ierr = PetscOptionsGetReal(NULL,NULL,"-malloc_view_threshold",&logthreshold,NULL);CHKERRQ(ierr); 405 ierr = PetscMallocViewSet(logthreshold);CHKERRQ(ierr); 406 } 407 } 408 409 ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_coalesce",&flg1,&flg2);CHKERRQ(ierr); 410 if (flg2) {ierr = PetscMallocSetCoalesce(flg1);CHKERRQ(ierr);} 411 flg1 = PETSC_FALSE; 412 ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_hbw",&flg1,NULL);CHKERRQ(ierr); 413 /* ignore this option if malloc is already set */ 414 if (flg1 && !petscsetmallocvisited) {ierr = PetscSetUseHBWMalloc_Private();CHKERRQ(ierr);} 415 416 flg1 = PETSC_FALSE; 417 ierr = PetscOptionsGetBool(NULL,NULL,"-malloc_info",&flg1,NULL);CHKERRQ(ierr); 418 if (!flg1) { 419 flg1 = PETSC_FALSE; 420 ierr = PetscOptionsGetBool(NULL,NULL,"-memory_view",&flg1,NULL);CHKERRQ(ierr); 421 } 422 if (flg1) { 423 ierr = PetscMemorySetGetMaximumUsage();CHKERRQ(ierr); 424 } 425 #endif 426 427 #if defined(PETSC_USE_LOG) 428 ierr = PetscOptionsHasName(NULL,NULL,"-objects_dump",&PetscObjectsLog);CHKERRQ(ierr); 429 #endif 430 431 /* 432 Set the display variable for graphics 433 */ 434 ierr = PetscSetDisplay();CHKERRQ(ierr); 435 436 /* 437 Print the PETSc version information 438 */ 439 ierr = PetscOptionsHasName(NULL,NULL,"-v",&flg1);CHKERRQ(ierr); 440 ierr = PetscOptionsHasName(NULL,NULL,"-version",&flg2);CHKERRQ(ierr); 441 ierr = PetscOptionsHasHelp(NULL,&flg3);CHKERRQ(ierr); 442 if (flg1 || flg2 || flg3) { 443 444 /* 445 Print "higher-level" package version message 446 */ 447 if (PetscExternalVersionFunction) { 448 ierr = (*PetscExternalVersionFunction)(comm);CHKERRQ(ierr); 449 } 450 451 ierr = PetscGetVersion(version,256);CHKERRQ(ierr); 452 ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------------------------------------\n");CHKERRQ(ierr); 453 ierr = (*PetscHelpPrintf)(comm,"%s\n",version);CHKERRQ(ierr); 454 ierr = (*PetscHelpPrintf)(comm,"%s",PETSC_AUTHOR_INFO);CHKERRQ(ierr); 455 ierr = (*PetscHelpPrintf)(comm,"See docs/changes/index.html for recent updates.\n");CHKERRQ(ierr); 456 ierr = (*PetscHelpPrintf)(comm,"See docs/faq.html for problems.\n");CHKERRQ(ierr); 457 ierr = (*PetscHelpPrintf)(comm,"See docs/manualpages/index.html for help. \n");CHKERRQ(ierr); 458 ierr = (*PetscHelpPrintf)(comm,"Libraries linked from %s\n",PETSC_LIB_DIR);CHKERRQ(ierr); 459 ierr = (*PetscHelpPrintf)(comm,"--------------------------------------------------------------------------\n");CHKERRQ(ierr); 460 } 461 462 /* 463 Print "higher-level" package help message 464 */ 465 if (flg3) { 466 if (PetscExternalHelpFunction) { 467 ierr = (*PetscExternalHelpFunction)(comm);CHKERRQ(ierr); 468 } 469 } 470 471 ierr = PetscOptionsGetString(NULL,NULL,"-help",helpoptions,sizeof(helpoptions),&flg1);CHKERRQ(ierr); 472 if (flg1) { 473 ierr = PetscStrcmp(helpoptions,"intro",&flg2);CHKERRQ(ierr); 474 if (flg2) { 475 ierr = PetscOptionsDestroyDefault();CHKERRQ(ierr); 476 ierr = PetscFreeMPIResources();CHKERRQ(ierr); 477 ierr = MPI_Finalize();CHKERRQ(ierr); 478 exit(0); 479 } 480 } 481 482 /* 483 Setup the error handling 484 */ 485 flg1 = PETSC_FALSE; 486 ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_abort",&flg1,NULL);CHKERRQ(ierr); 487 if (flg1) { 488 ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_ARE_FATAL);CHKERRQ(ierr); 489 ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr); 490 } 491 flg1 = PETSC_FALSE; 492 ierr = PetscOptionsGetBool(NULL,NULL,"-on_error_mpiabort",&flg1,NULL);CHKERRQ(ierr); 493 if (flg1) { ierr = PetscPushErrorHandler(PetscMPIAbortErrorHandler,0);CHKERRQ(ierr);} 494 flg1 = PETSC_FALSE; 495 ierr = PetscOptionsGetBool(NULL,NULL,"-mpi_return_on_error",&flg1,NULL);CHKERRQ(ierr); 496 if (flg1) { 497 ierr = MPI_Comm_set_errhandler(comm,MPI_ERRORS_RETURN);CHKERRQ(ierr); 498 } 499 flg1 = PETSC_FALSE; 500 ierr = PetscOptionsGetBool(NULL,NULL,"-no_signal_handler",&flg1,NULL);CHKERRQ(ierr); 501 if (!flg1) {ierr = PetscPushSignalHandler(PetscSignalHandlerDefault,(void*)0);CHKERRQ(ierr);} 502 flg1 = PETSC_FALSE; 503 ierr = PetscOptionsGetBool(NULL,NULL,"-fp_trap",&flg1,&flag);CHKERRQ(ierr); 504 if (flag) {ierr = PetscSetFPTrap((PetscFPTrap)flg1);CHKERRQ(ierr);} 505 ierr = PetscOptionsGetInt(NULL,NULL,"-check_pointer_intensity",&intensity,&flag);CHKERRQ(ierr); 506 if (flag) {ierr = PetscCheckPointerSetIntensity(intensity);CHKERRQ(ierr);} 507 508 /* 509 Setup debugger information 510 */ 511 ierr = PetscSetDefaultDebugger();CHKERRQ(ierr); 512 ierr = PetscOptionsGetString(NULL,NULL,"-on_error_attach_debugger",string,64,&flg1);CHKERRQ(ierr); 513 if (flg1) { 514 MPI_Errhandler err_handler; 515 516 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 517 ierr = MPI_Comm_create_errhandler(Petsc_MPI_DebuggerOnError,&err_handler);CHKERRQ(ierr); 518 ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRQ(ierr); 519 ierr = PetscPushErrorHandler(PetscAttachDebuggerErrorHandler,0);CHKERRQ(ierr); 520 } 521 ierr = PetscOptionsGetString(NULL,NULL,"-debug_terminal",string,64,&flg1);CHKERRQ(ierr); 522 if (flg1) { ierr = PetscSetDebugTerminal(string);CHKERRQ(ierr); } 523 ierr = PetscOptionsGetString(NULL,NULL,"-start_in_debugger",string,64,&flg1);CHKERRQ(ierr); 524 ierr = PetscOptionsGetString(NULL,NULL,"-stop_for_debugger",string,64,&flg2);CHKERRQ(ierr); 525 if (flg1 || flg2) { 526 PetscMPIInt size; 527 PetscInt lsize,*nodes; 528 MPI_Errhandler err_handler; 529 /* 530 we have to make sure that all processors have opened 531 connections to all other processors, otherwise once the 532 debugger has stated it is likely to receive a SIGUSR1 533 and kill the program. 534 */ 535 ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 536 if (size > 2) { 537 PetscMPIInt dummy = 0; 538 MPI_Status status; 539 for (i=0; i<size; i++) { 540 if (rank != i) { 541 ierr = MPI_Send(&dummy,1,MPI_INT,i,109,comm);CHKERRQ(ierr); 542 } 543 } 544 for (i=0; i<size; i++) { 545 if (rank != i) { 546 ierr = MPI_Recv(&dummy,1,MPI_INT,i,109,comm,&status);CHKERRQ(ierr); 547 } 548 } 549 } 550 /* check if this processor node should be in debugger */ 551 ierr = PetscMalloc1(size,&nodes);CHKERRQ(ierr); 552 lsize = size; 553 ierr = PetscOptionsGetIntArray(NULL,NULL,"-debugger_nodes",nodes,&lsize,&flag);CHKERRQ(ierr); 554 if (flag) { 555 for (i=0; i<lsize; i++) { 556 if (nodes[i] == rank) { flag = PETSC_FALSE; break; } 557 } 558 } 559 if (!flag) { 560 ierr = PetscSetDebuggerFromString(string);CHKERRQ(ierr); 561 ierr = PetscPushErrorHandler(PetscAbortErrorHandler,0);CHKERRQ(ierr); 562 if (flg1) { 563 ierr = PetscAttachDebugger();CHKERRQ(ierr); 564 } else { 565 ierr = PetscStopForDebugger();CHKERRQ(ierr); 566 } 567 ierr = MPI_Comm_create_errhandler(Petsc_MPI_AbortOnError,&err_handler);CHKERRQ(ierr); 568 ierr = MPI_Comm_set_errhandler(comm,err_handler);CHKERRQ(ierr); 569 } 570 ierr = PetscFree(nodes);CHKERRQ(ierr); 571 } 572 573 ierr = PetscOptionsGetString(NULL,NULL,"-on_error_emacs",emacsmachinename,128,&flg1);CHKERRQ(ierr); 574 if (flg1 && !rank) {ierr = PetscPushErrorHandler(PetscEmacsClientErrorHandler,emacsmachinename);CHKERRQ(ierr);} 575 576 /* 577 Setup profiling and logging 578 */ 579 #if defined(PETSC_USE_INFO) 580 { 581 char logname[PETSC_MAX_PATH_LEN]; logname[0] = 0; 582 ierr = PetscOptionsGetString(NULL,NULL,"-info",logname,250,&flg1);CHKERRQ(ierr); 583 if (flg1 && logname[0]) { 584 ierr = PetscInfoAllow(PETSC_TRUE,logname);CHKERRQ(ierr); 585 } else if (flg1) { 586 ierr = PetscInfoAllow(PETSC_TRUE,NULL);CHKERRQ(ierr); 587 } 588 } 589 #endif 590 #if defined(PETSC_USE_LOG) 591 mname[0] = 0; 592 ierr = PetscOptionsGetString(NULL,NULL,"-history",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 593 if (flg1) { 594 if (mname[0]) { 595 ierr = PetscOpenHistoryFile(mname,&petsc_history);CHKERRQ(ierr); 596 } else { 597 ierr = PetscOpenHistoryFile(NULL,&petsc_history);CHKERRQ(ierr); 598 } 599 } 600 601 ierr = PetscOptionsGetBool(NULL,NULL,"-log_sync",&PetscLogSyncOn,NULL);CHKERRQ(ierr); 602 603 #if defined(PETSC_HAVE_MPE) 604 flg1 = PETSC_FALSE; 605 ierr = PetscOptionsHasName(NULL,NULL,"-log_mpe",&flg1);CHKERRQ(ierr); 606 if (flg1) {ierr = PetscLogMPEBegin();CHKERRQ(ierr);} 607 #endif 608 flg1 = PETSC_FALSE; 609 flg3 = PETSC_FALSE; 610 ierr = PetscOptionsGetBool(NULL,NULL,"-log_all",&flg1,NULL);CHKERRQ(ierr); 611 ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 612 if (flg1) { ierr = PetscLogAllBegin();CHKERRQ(ierr); } 613 else if (flg3) { ierr = PetscLogDefaultBegin();CHKERRQ(ierr);} 614 615 ierr = PetscOptionsGetString(NULL,NULL,"-log_trace",mname,250,&flg1);CHKERRQ(ierr); 616 if (flg1) { 617 char name[PETSC_MAX_PATH_LEN],fname[PETSC_MAX_PATH_LEN]; 618 FILE *file; 619 if (mname[0]) { 620 PetscSNPrintf(name,PETSC_MAX_PATH_LEN,"%s.%d",mname,rank); 621 ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 622 file = fopen(fname,"w"); 623 if (!file) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Unable to open trace file: %s",fname); 624 } else file = PETSC_STDOUT; 625 ierr = PetscLogTraceBegin(file);CHKERRQ(ierr); 626 } 627 628 ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-log_view",NULL,&format,&flg4);CHKERRQ(ierr); 629 if (flg4) { 630 if (format == PETSC_VIEWER_ASCII_XML) { 631 ierr = PetscLogNestedBegin();CHKERRQ(ierr); 632 } else { 633 ierr = PetscLogDefaultBegin();CHKERRQ(ierr); 634 } 635 } 636 if (flg4 && format == PETSC_VIEWER_ASCII_XML) { 637 PetscReal threshold = PetscRealConstant(0.01); 638 ierr = PetscOptionsGetReal(NULL,NULL,"-log_threshold",&threshold,&flg1);CHKERRQ(ierr); 639 if (flg1) {ierr = PetscLogSetThreshold((PetscLogDouble)threshold,NULL);CHKERRQ(ierr);} 640 } 641 #endif 642 643 ierr = PetscOptionsGetBool(NULL,NULL,"-saws_options",&PetscOptionsPublish,NULL);CHKERRQ(ierr); 644 645 #if defined(PETSC_HAVE_CUDA) 646 ierr = PetscOptionsBegin(comm,NULL,"CUDA initialize","Sys");CHKERRQ(ierr); 647 ierr = PetscOptionsBool("-cuda_initialize","Initialize the CUDA devices and cuBLAS during PetscInitialize()",NULL,initCuda,&initCuda,NULL);CHKERRQ(ierr); 648 ierr = PetscOptionsEnd();CHKERRQ(ierr); 649 if (initCuda) {ierr = PetscCUDAInitialize(PETSC_COMM_WORLD);CHKERRQ(ierr);} 650 #endif 651 652 /* 653 Print basic help message 654 */ 655 ierr = PetscOptionsHasHelp(NULL,&flg1);CHKERRQ(ierr); 656 if (flg1) { 657 ierr = (*PetscHelpPrintf)(comm,"Options for all PETSc programs:\n");CHKERRQ(ierr); 658 ierr = (*PetscHelpPrintf)(comm," -help: prints help method for each option\n");CHKERRQ(ierr); 659 ierr = (*PetscHelpPrintf)(comm," -on_error_abort: cause an abort when an error is detected. Useful \n ");CHKERRQ(ierr); 660 ierr = (*PetscHelpPrintf)(comm," only when run in the debugger\n");CHKERRQ(ierr); 661 ierr = (*PetscHelpPrintf)(comm," -on_error_attach_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 662 ierr = (*PetscHelpPrintf)(comm," start the debugger in new xterm\n");CHKERRQ(ierr); 663 ierr = (*PetscHelpPrintf)(comm," unless noxterm is given\n");CHKERRQ(ierr); 664 ierr = (*PetscHelpPrintf)(comm," -start_in_debugger [gdb,dbx,xxgdb,ups,noxterm]\n");CHKERRQ(ierr); 665 ierr = (*PetscHelpPrintf)(comm," start all processes in the debugger\n");CHKERRQ(ierr); 666 ierr = (*PetscHelpPrintf)(comm," -on_error_emacs <machinename>\n");CHKERRQ(ierr); 667 ierr = (*PetscHelpPrintf)(comm," emacs jumps to error file\n");CHKERRQ(ierr); 668 ierr = (*PetscHelpPrintf)(comm," -debugger_nodes [n1,n2,..] Nodes to start in debugger\n");CHKERRQ(ierr); 669 ierr = (*PetscHelpPrintf)(comm," -debugger_pause [m] : delay (in seconds) to attach debugger\n");CHKERRQ(ierr); 670 ierr = (*PetscHelpPrintf)(comm," -stop_for_debugger : prints message on how to attach debugger manually\n");CHKERRQ(ierr); 671 ierr = (*PetscHelpPrintf)(comm," waits the delay for you to attach\n");CHKERRQ(ierr); 672 ierr = (*PetscHelpPrintf)(comm," -display display: Location where X window graphics and debuggers are displayed\n");CHKERRQ(ierr); 673 ierr = (*PetscHelpPrintf)(comm," -no_signal_handler: do not trap error signals\n");CHKERRQ(ierr); 674 ierr = (*PetscHelpPrintf)(comm," -mpi_return_on_error: MPI returns error code, rather than abort on internal error\n");CHKERRQ(ierr); 675 ierr = (*PetscHelpPrintf)(comm," -fp_trap: stop on floating point exceptions\n");CHKERRQ(ierr); 676 ierr = (*PetscHelpPrintf)(comm," note on IBM RS6000 this slows run greatly\n");CHKERRQ(ierr); 677 ierr = (*PetscHelpPrintf)(comm," -malloc_dump <optional filename>: dump list of unfreed memory at conclusion\n");CHKERRQ(ierr); 678 ierr = (*PetscHelpPrintf)(comm," -malloc: use PETSc error checking malloc (deprecated, use -malloc_debug)\n");CHKERRQ(ierr); 679 ierr = (*PetscHelpPrintf)(comm," -malloc no: don't use PETSc error checking malloc (deprecated, use -malloc_debug no)\n");CHKERRQ(ierr); 680 ierr = (*PetscHelpPrintf)(comm," -malloc_info: prints total memory usage\n");CHKERRQ(ierr); 681 ierr = (*PetscHelpPrintf)(comm," -malloc_view <optional filename>: keeps log of all memory allocations, displays in PetscFinalize()\n");CHKERRQ(ierr); 682 ierr = (*PetscHelpPrintf)(comm," -malloc_debug <true or false>: enables or disables extended checking for memory corruption\n");CHKERRQ(ierr); 683 ierr = (*PetscHelpPrintf)(comm," -options_view: dump list of options inputted\n");CHKERRQ(ierr); 684 ierr = (*PetscHelpPrintf)(comm," -options_left: dump list of unused options\n");CHKERRQ(ierr); 685 ierr = (*PetscHelpPrintf)(comm," -options_left no: don't dump list of unused options\n");CHKERRQ(ierr); 686 ierr = (*PetscHelpPrintf)(comm," -tmp tmpdir: alternative /tmp directory\n");CHKERRQ(ierr); 687 ierr = (*PetscHelpPrintf)(comm," -shared_tmp: tmp directory is shared by all processors\n");CHKERRQ(ierr); 688 ierr = (*PetscHelpPrintf)(comm," -not_shared_tmp: each processor has separate tmp directory\n");CHKERRQ(ierr); 689 ierr = (*PetscHelpPrintf)(comm," -memory_view: print memory usage at end of run\n");CHKERRQ(ierr); 690 #if defined(PETSC_USE_LOG) 691 ierr = (*PetscHelpPrintf)(comm," -get_total_flops: total flops over all processors\n");CHKERRQ(ierr); 692 ierr = (*PetscHelpPrintf)(comm," -log_view [:filename:[format]]: logging objects and events\n");CHKERRQ(ierr); 693 ierr = (*PetscHelpPrintf)(comm," -log_trace [filename]: prints trace of all PETSc calls\n");CHKERRQ(ierr); 694 #if defined(PETSC_HAVE_MPE) 695 ierr = (*PetscHelpPrintf)(comm," -log_mpe: Also create logfile viewable through Jumpshot\n");CHKERRQ(ierr); 696 #endif 697 ierr = (*PetscHelpPrintf)(comm," -info <optional filename>: print informative messages about the calculations\n");CHKERRQ(ierr); 698 #endif 699 ierr = (*PetscHelpPrintf)(comm," -v: prints PETSc version number and release date\n");CHKERRQ(ierr); 700 ierr = (*PetscHelpPrintf)(comm," -options_file <file>: reads options from file\n");CHKERRQ(ierr); 701 ierr = (*PetscHelpPrintf)(comm," -petsc_sleep n: sleeps n seconds before running program\n");CHKERRQ(ierr); 702 ierr = (*PetscHelpPrintf)(comm,"-----------------------------------------------\n");CHKERRQ(ierr); 703 } 704 705 #if defined(PETSC_HAVE_POPEN) 706 { 707 char machine[128]; 708 ierr = PetscOptionsGetString(NULL,NULL,"-popen_machine",machine,128,&flg1);CHKERRQ(ierr); 709 if (flg1) { 710 ierr = PetscPOpenSetMachine(machine);CHKERRQ(ierr); 711 } 712 } 713 #endif 714 715 ierr = PetscOptionsGetReal(NULL,NULL,"-petsc_sleep",&si,&flg1);CHKERRQ(ierr); 716 if (flg1) { 717 ierr = PetscSleep(si);CHKERRQ(ierr); 718 } 719 720 ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",mname,PETSC_MAX_PATH_LEN,&flg1);CHKERRQ(ierr); 721 if (flg1) { 722 ierr = PetscStrstr(mname,"null",&f);CHKERRQ(ierr); 723 if (f) { 724 ierr = PetscInfoDeactivateClass(0);CHKERRQ(ierr); 725 } 726 } 727 728 #if defined(PETSC_HAVE_VIENNACL) 729 ierr = PetscOptionsHasName(NULL,NULL,"-log_summary",&flg3);CHKERRQ(ierr); 730 if (!flg3) { 731 ierr = PetscOptionsHasName(NULL,NULL,"-log_view",&flg3);CHKERRQ(ierr); 732 } 733 ierr = PetscOptionsGetBool(NULL,NULL,"-viennacl_synchronize",&flg3,NULL);CHKERRQ(ierr); 734 PetscViennaCLSynchronize = flg3; 735 ierr = PetscViennaCLInit();CHKERRQ(ierr); 736 #endif 737 738 /* 739 Creates the logging data structures; this is enabled even if logging is not turned on 740 This is the last thing we do before returning to the user code to prevent having the 741 logging numbers contaminated by any startup time associated with MPI and the GPUs 742 */ 743 #if defined(PETSC_USE_LOG) 744 ierr = PetscLogInitialize();CHKERRQ(ierr); 745 #endif 746 747 PetscFunctionReturn(0); 748 } 749