# HISTORY: MPI for Python

Author: | Lisandro Dalcin
Contact: | dalcinl@gmail.com
Web Site: | http://mpi4py.googlecode.com/
Organization: | CIMEC <http://www.cimec.org.ar>

Address:

    CCT CONICET, 3000 Santa Fe, Argentina

# Release 1.3 [2012-01-20]

- Now `Comm.recv()` accept a buffer to receive the message.

- Add `Comm.irecv()` and `Request.{wait|test}[any|all]()`.

- Add `Intracomm.Spawn_multiple()`.

- Better buffer handling for PEP 3118 and legacy buffer interfaces.

- Add support for attribute attribute caching on communicators, datatypes and windows.

- Install MPI-enabled Python interpreter as `<path>/mpi4py/bin/python-mpi`.

- Windows: Support for building with Open MPI.

# Release 1.2.2 [2010-09-13]

- Add `mpi4py.get_config()` to retrieve information (compiler wrappers, includes, libraries, etc) about the MPI implementation employed to build mpi4py.

- Workaround Python libraries with missing GILState-related API calls in case of non-threaded Python builds.

- Windows: look for MPICH2, DeinoMPI, Microsoft HPC Pack at their default install locations under %ProgramFiles.

- MPE: fix hacks related to old API's, these hacks are broken when MPE is built with a MPI implementations other than MPICH2.

- HP-MPI: fix for missing Fortran datatypes, use dlopen() to load the MPI shared library before MPI_Init()

- Many distutils-related fixes, cleanup, and enhancements, better logics to find MPI compiler wrappers.

- Support for `pip install mpi4py`.

# Release 1.2.1 [2010-02-26]

- Fix declaration in Cython include file. This declaration, while valid for Cython, broke the simple-minded parsing used in conf/mpidistutils.py to implement configure-tests for availability of MPI symbols.

- Update SWIG support and make it compatible with Python 3. Also generate an warning for SWIG < 1.3.28.

- Fix distutils-related issues in Mac OS X. Now ARCHFLAGS environment variable is honored of all Python's `config/Makefile` variables.

- Fix issues with Open MPI < 1.4.2 releated to error checking and `MPI_XXX_NULL` handles.

# Release 1.2 [2009-12-29]

- Automatic MPI datatype discovery for NumPy arrays and PEP-3118 buffers. Now buffer-like objects can be messaged directly, it is no longer required to explicitly pass a 2/3-list/tuple like `[data, MPI.DOUBLE]`, or `[data, count, MPI.DOUBLE]`. Only basic types are supported, i.e., all C/C99-native signed/unsigned integral types and single/double precision real/complex floating types. Many thanks to Eilif Muller for the initial feedback.

- Nonblocking send of pickled Python objects. Many thanks to Andreas Kloeckner for the initial patch and enlightening discussion about this enhancement.

- `Request` instances now hold a reference to the Python object exposing the buffer involved in point-to-point communication or parallel I/O. Many thanks to Andreas Kloeckner for the initial feedback.

- Support for logging of user-defined states and events using MPE. Runtime (i.e., without requiring a recompile!) activation of logging of all MPI calls is supported in POSIX platforms implementing `dlopen()`.

- Support for all the new features in MPI-2.2 (new C99 and F90 datatypes, distributed graph topology, local reduction operation, and other minor enhancements).

- Fix the annoying issues related to Open MPI and Python dynamic loading of extension modules in platforms supporting `dlopen()`.

- Fix SLURM dynamic loading issues on SiCortex. Many thanks to Ian Langmore for providing me shell access.

# Release 1.1.0 [2009-06-06]

- Fix bug in `Comm.Iprobe()` that caused segfaults as Python C-API calls were issued with the GIL released (issue #2).

- Add `Comm.bsend()` and `Comm.ssend()` for buffered and synchronous send semantics when communicating general Python objects.

- Now the call `Info.Get(key)` return a single value (i.e, instead of a 2-tuple); this value is `None` if `key` is not in the `Info` object, or a string otherwise. Previously, the call redundantly returned `(None, False)` for missing key-value pairs; `None` is enough to signal a missing entry.

- Add support for parametrized Fortran datatypes.

- Add support for decoding user-defined datatypes.

- Add support for user-defined reduction operations on memory buffers. However, at most 16 user-defined reduction operations can be created. Ask the author for more room if you need it.

# Release 1.0.0 [2009-03-20]

This is the fist release of the all-new, Cython-based, implementation of MPI for Python. Unfortunately, this implementation is not backward-compatible with the previous one. The list below summarizes the more important changes that can impact user codes.

- Some communication calls had overloaded functionality. Now there is a clear distinction between communication of general Python object with pickle, and (fast, near C-speed) communication of buffer-like objects (e.g., NumPy arrays).

  - for communicating general Python objects, you have to use all-lowercase methods, like `send()`, `recv()`, `bcast()`, etc.

  - for communicating array data, you have to use `Send()`, `Recv()`, `Bcast()`, etc. methods. Buffer arguments to these calls must be explicitly specified by using a 2/3-list/tuple like `[data, MPI.DOUBLE]`, or `[data, count, MPI.DOUBLE]` (the former one uses the byte-size of `data` and the extent of the MPI datatype to define the `count`).

- Indexing a communicator with an integer returned a special object associating the communication with a target rank, alleviating you from specifying source/destination/root arguments in point-to-point and collective communications. This functionality is no longer available, expressions like:

      MPI.COMM_WORLD[0].Send(...)
      MPI.COMM_WORLD[0].Recv(...)
      MPI.COMM_WORLD[0].Bcast(...)

  have to be replaced by:

      MPI.COMM_WORLD.Send(..., dest=0)
      MPI.COMM_WORLD.Recv(..., source=0)
      MPI.COMM_WORLD.Bcast(..., root=0)

- Automatic MPI initialization (i.e., at import time) requests the maximum level of MPI thread support (i.e., it is done by calling `MPI_Init_thread()` and passing `MPI_THREAD_MULTIPLE`). In case you need to change this behavior, you can tweak the contents of the `mpi4py.rc` module.

- In order to obtain the values of predefined attributes attached to the world communicator, now you have to use the `Get_attr()` method on the `MPI.COMM_WORLD` instance:

      tag_ub = MPI.COMM_WORLD.Get_attr(MPI.TAG_UB)

- In the previous implementation, `MPI.COMM_WORLD` and `MPI.COMM_SELF` were associated to duplicates of the (C-level) `MPI_COMM_WORLD` and `MPI_COMM_SELF` predefined communicator handles. Now this is no longer the case, `MPI.COMM_WORLD` and `MPI.COMM_SELF` proxies the actual `MPI_COMM_WORLD` and `MPI_COMM_SELF` handles.

- Convenience aliases `MPI.WORLD` and `MPI.SELF` were removed. Use instead `MPI.COMM_WORLD` and `MPI.COMM_SELF`.

- Convenience constants `MPI.WORLD_SIZE` and `MPI.WORLD_RANK` were removed. Use instead `MPI.COMM_WORLD.Get_size()` and `MPI.COMM_WORLD.Get_rank()`.