Source
#!/usr/bin/env python
import socket
import traceback # To pretty-print tracebacks
import os
class MPIEnvironment:
def is_mpi_disabled_or_client(cls):
"""
:returns: is this the only process (serial mode - MPI disabled) or the client
process if MPI is enabled?
"""
# MPIEnvironment.is_mpi_client alone would be enough, as when MPI is disabled,
# mpi_processor_rank==0, and is_mpi_client is set to True. This function is
# added to be more explicit, and for future maintainability.
return not cls.is_mpi_enabled or (cls.is_mpi_enabled and cls.is_mpi_client)
# Static variables #################################################################################################
# Set hostname
hostname = socket.gethostname()
# Initialization
mpi_initialized = False
try:
# don't load mpi unless we are already running under mpi
# trying to load a broken mpi installation will abort the process not
# giving us a chance to run in the serial mode
# testing mpi via a forked import causes deadlock on process end when
# running test_mpi4casa[test_server_not_responsive]
if 'OMPI_COMM_WORLD_RANK' not in os.environ:
raise ValueError('MPI disabled')
# Set mpi4py runtime configuration
from mpi4py import rc as __mpi_runtime_config
# Automatic MPI initialization at import time
__mpi_runtime_config.initialize = True
# Request for thread support at MPI initialization
__mpi_runtime_config.threaded = True
# Level of thread support to request at MPI initialization
# "single" : use MPI_THREAD_SINGLE
# "funneled" : use MPI_THREAD_FUNNELED
# "serialized" : use MPI_THREAD_SERIALIZED
# "multiple" : use MPI_THREAD_MULTIPLE
__mpi_runtime_config.thread_level = 'multiple'
# Automatic MPI finalization at exit time
__mpi_runtime_config.finalize = False
# Import mpi4py and thus initialize MPI
from mpi4py import MPI as __mpi_factory # NOTE: This is a private variable to avoid uncontrolled access to MPI
# Get world size and processor rank
mpi_world_size = __mpi_factory.COMM_WORLD.Get_size()
mpi_processor_rank = __mpi_factory.COMM_WORLD.Get_rank()
# Get pid
mpi_pid = os.getpid()
# Get version and vendor info
mpi_version_info = __mpi_factory.Get_version()
mpi_vendor_info = __mpi_factory.get_vendor()