@@ -411,25 +411,22 @@ def updateFromDefaults(params, defaults):
411
411
updateFromDefaults (params [key ], defaults [key ])
412
412
413
413
414
- KEY_VAL_FORMAT = '{:<54}{}'
415
-
416
-
417
- def getMPIinfo ():
414
+ def getMPIinfo (grp ):
418
415
from sys import modules
419
416
if 'mpi4py.MPI' in modules :
420
417
import mpi4py
421
418
mpi4py .initialize = False
422
419
from mpi4py import MPI
423
420
if not MPI .Is_initialized ():
424
- return ''
421
+ return
425
422
t = {MPI .THREAD_SINGLE : 'single' ,
426
423
MPI .THREAD_FUNNELED : 'funneled' ,
427
424
MPI .THREAD_SERIALIZED : 'serialized' ,
428
425
MPI .THREAD_MULTIPLE : 'multiple' }
429
426
hosts = MPI .COMM_WORLD .gather (MPI .Get_processor_name ())
430
427
if MPI .COMM_WORLD .rank == 0 :
431
428
hosts = ',' .join (set (hosts ))
432
- s = [ '{}' .format (MPI .Get_library_version ()[:- 1 ])]
429
+ grp . add ( 'MPI library' , '{}' .format (MPI .Get_library_version ()[:- 1 ]))
433
430
for label , value in [('MPI standard supported:' , MPI .Get_version ()),
434
431
('Vendor:' , MPI .get_vendor ()),
435
432
('Level of thread support:' , t [MPI .Query_thread ()]),
@@ -438,13 +435,10 @@ def getMPIinfo():
438
435
('Thread level requested:' , mpi4py .rc .thread_level ),
439
436
('Hosts:' , hosts ),
440
437
('Communicator size:' , MPI .COMM_WORLD .size )]:
441
- s .append (KEY_VAL_FORMAT .format (label , value ))
442
- return '\n ' .join (s )
443
- else :
444
- return ''
438
+ grp .add (label , value )
445
439
446
440
447
- def getEnvVariables (envVars = [('OMP_NUM_THREADS' , True )]):
441
+ def getEnvVariables (grp , envVars = [('OMP_NUM_THREADS' , True )]):
448
442
from os import environ
449
443
s = []
450
444
for var , printNotSet in envVars :
@@ -454,23 +448,22 @@ def getEnvVariables(envVars=[('OMP_NUM_THREADS', True)]):
454
448
varVal = 'not set'
455
449
else :
456
450
continue
457
- s . append ( KEY_VAL_FORMAT . format ( var + ':' , varVal ) )
451
+ grp . add ( var , varVal )
458
452
return '\n ' .join (s )
459
453
460
454
461
- def getSystemInfo (argv = None , envVars = [('OMP_NUM_THREADS' , True )]):
455
+ def getSystemInfo (grp , argv = None , envVars = [('OMP_NUM_THREADS' , True )]):
462
456
from sys import executable
463
- s = '\n '
464
457
if argv is not None :
465
- s += KEY_VAL_FORMAT . format ('Running: ' , executable + ' ' + ' ' .join (argv )) + ' \n '
458
+ grp . add ('Running' , executable + ' ' + ' ' .join (argv ))
466
459
else :
467
- s += KEY_VAL_FORMAT . format ('Running: ' , executable ) + ' \n '
460
+ grp . add ('Running' , executable )
468
461
import mpi4py
469
462
mpi4py .initialize = False
470
463
from mpi4py import MPI
471
464
if MPI .Is_initialized ():
472
- s += getMPIinfo () + ' \n '
473
- s += getEnvVariables (envVars )+ ' \n '
465
+ getMPIinfo (grp )
466
+ getEnvVariables (grp , envVars )
474
467
import pkg_resources
475
468
from PyNucleus import subpackages
476
469
versions = {}
@@ -481,17 +474,21 @@ def getSystemInfo(argv=None, envVars=[('OMP_NUM_THREADS', True)]):
481
474
except KeyError :
482
475
versions [version ] = [pkg ]
483
476
for version in versions :
484
- s += KEY_VAL_FORMAT .format (',' .join (versions [version ])+ ':' , version )+ '\n '
477
+ grp .add (',' .join (versions [version ]), version )
478
+
479
+ import importlib
480
+
485
481
versions = {}
486
482
for pkg in sorted (subpackages .keys ()):
487
483
version = pkg_resources .get_distribution ('PyNucleus_' + pkg ).version
484
+ module = importlib .import_module ('PyNucleus_' + pkg + '.config' )
485
+ sha = module .gitSHA
488
486
try :
489
- versions [version ].append (pkg )
487
+ versions [( version , sha ) ].append (pkg )
490
488
except KeyError :
491
- versions [version ] = [pkg ]
489
+ versions [( version , sha ) ] = [pkg ]
492
490
for version in versions :
493
- s += KEY_VAL_FORMAT .format ('PyNucleus_' + (',' .join (versions [version ]))+ ':' , version )+ '\n '
494
- return s
491
+ grp .add ('PyNucleus_' + (',' .join (versions [version ])), version )
495
492
496
493
497
494
class MPIFileHandler (logging .Handler ):
@@ -504,6 +501,7 @@ def __init__(self, filename, comm, mode=MPI.MODE_WRONLY | MPI.MODE_CREATE):
504
501
# keep the absolute path, otherwise derived classes which use this
505
502
# may come a cropper when the current directory changes
506
503
self .baseFilename = os .path .abspath (filename )
504
+ assert len (self .baseFilename ) <= 245 , 'The length of the log file path \" {}\" is too long and will probably crash MPI. Try running with \" --disableFileLog\" ' .format (self .baseFilename )
507
505
if Path (self .baseFilename ).exists () and comm .rank == 0 :
508
506
from os import remove
509
507
remove (self .baseFilename )
@@ -1095,11 +1093,12 @@ def process(self, override={}):
1095
1093
if params ['displayConfig' ]:
1096
1094
from pprint import pformat
1097
1095
self .logger .info ('\n ' + pformat (params ))
1096
+
1097
+ from sys import argv
1098
+ sysInfo = self .addOutputGroup ('sysInfo' )
1099
+ getSystemInfo (argv = argv , grp = sysInfo )
1098
1100
if not params ['disableHeader' ]:
1099
- from sys import argv
1100
- sysInfo = getSystemInfo (argv )
1101
- if self .isMaster :
1102
- self .logger .info (sysInfo )
1101
+ self .logger .info ('\n ' + str (sysInfo ))
1103
1102
if params ['logDependencies' ]:
1104
1103
dependencyLogger .setLevel (logging .DEBUG )
1105
1104
else :
0 commit comments