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