Source code for pykern.mpi
# -*- coding: utf-8 -*-
u"""MPI support routines
:copyright: Copyright (c) 2017 RadiaSoft LLC. All Rights Reserved.
:license: http://www.apache.org/licenses/LICENSE-2.0.html
"""
from __future__ import absolute_import, division, print_function
[docs]def checked_call(op):
"""Abort MPI if op raises an exception.
If ``op`` doesn't handle an exception, then MPI needs
to abort. This will terminate the MPI process, not just the
one task.
If MPI is not running or mpi4py is not installed,
then passes through the exception.
Args:
op (func): function to call
"""
try:
op()
except BaseException as e:
code = 86
if isinstance(e, SystemExit) and hasattr(e, 'code'):
if not e.code:
raise
code = e.code
try:
from mpi4py import MPI
if MPI.COMM_WORLD and MPI.COMM_WORLD.Get_size() > 1:
MPI.COMM_WORLD.Abort(code)
except BaseException as e2:
pass
raise