b10a60a5a9
In order to work around an issue with flang based compilers, avoid declaring bind(C) constants and use plain Fortran parameter instead. For example, type(MPI_Comm), bind(C, name="ompi_f08_mpi_comm_world") OMPI_PROTECTED :: MPI_COMM_WORLD is changed to type(MPI_Comm), parameter :: MPI_COMM_WORLD = MPI_Comm(OMPI_MPI_COMM_WORLD) Note that in order to preserve ABI compatibility, ompi/mpi/fortran/use-mpi-f08/constants.{c,h} have been kept even if its symbols are no more referenced by Open MPI. Refs. open-mpi/ompi#7091 Signed-off-by: Gilles Gouaillardet <gilles@rist.or.jp> |
||
---|---|---|
.. | ||
affinity | ||
cuda | ||
example | ||
pcollreq | ||
shortfloat | ||
Makefile.am | ||
mpiext.c | ||
mpiext.h | ||
README.txt |
Symbol conventions for Open MPI extensions Last updated: January 2015 This README provides some rule-of-thumb guidance for how to name symbols in Open MPI extensions. Every case is different; we've had long discussions about what to name various functions, constants, etc. This document is an attempt to capture a few common rules-of-thumb that we've agreed upon for how to name symbols in new MPI extensions. Generally speaking, there are usually three kinds of extensions: 1. Functionality that is solely intended for Open MPI. 2. Functionality which may spread to both other MPI implementations and/or, ultimately, the MPI standard. 3. Functionality that is strongly expected to be in an upcoming version of the MPI specification. ---------------------------------------------------------------------- Case 1 The OMPI_Paffinity_str() extension is a good example of this type: it is solely intended to be for Open MPI. It will likely never be pushed to other MPI implementations, and it will likely never be pushed to the MPI Forum. It's Open MPI-specific functionality, through and through. Public symbols of this type of functionality should be named with an "OMPI_" prefix to emphasize its Open MPI-specific nature. To be clear: the "OMPI_" prefix clearly identifies parts of user code that are relying on Open MPI (and likely need to be surrounded with #if OPEN_MPI blocks, etc.). ---------------------------------------------------------------------- Case 2 The MPI extensions mechanism in Open MPI was designed to help MPI Forum members prototype new functionality that is intended for the MPI specification itself. As such, the goal for this kind of functionality is not only to be included in the MPI spec, but possibly also be included in another MPI implementation. As such, it seems reasonable to prefix public symbols in this type of functionality with "MPIX_". This commonly-used prefix allows the same symbols to be available in multiple MPI implementations, and therefore allows user code to easily check for it. E.g., user apps can check for the presence of MPIX_Foo to know if both Open MPI and Other MPI support the proposed MPIX_Foo functionality. Of course, when using the MPIX_ namespace, there is the possibility of symbol name collisions. E.g., what if Open MPI has an MPIX_Foo and Other MPI has a *different* MPIX_Foo? While we technically can't prevent such collisions from happening, we encourage extension authors to avoid such symbol clashes whenever possible. ---------------------------------------------------------------------- Case 3 It is well-known that the MPI specification (intentionally) takes a long time to publish. MPI implementers can typically know, with a high degree of confidence, about new functionality that almost certainly *will* be included in an upcoming MPI specification long before it is actually published. For a variety of reasons, Open MPI has tried to implement such functionality early (i.e., before the actual publication of the corresponding MPI specification document). Case in point: the non-blocking collective operations that were included in MPI-3.0 (e.g., MPI_Ibarrier). It was known for a year or two before MPI-3.0 was published that these functions would be included in MPI-3.0. There is a continual debate among the developer community: when implementing such functionality, should the symbols be in the MPIX_ namespace or in the MPI_ namespace? On one hand, the symbols are not yet officially standardized -- *they could change* before publication. On the other hand, developers who participate in the Forum typically have a good sense for whether symbols are going to change before publication or not. On the other hand (yes, we all have three hands), no one can predict the future -- things could unexpectedly change before the MPI specification is published. ...and so on. After much debate: for functionality that has a high degree of confidence that it will be included in an upcoming spec (e.g., it has passed at least one vote in the MPI Forum), our conclusion is that it is OK to use the MPI_ namespace. Case in point: Open MPI released non-blocking collectives with the MPI_ prefix (not the MPIX_ prefix) before the MPI-3.0 specification officially standardized these functions. The rationale was threefold: 1. Let users use the functionality as soon as possible. 2. If OMPI initially creates MPIX_Foo, but eventually renames it to MPI_Foo when the MPI specification is published, then users will have to modify their codes to match. This is an artificial change inserted just to be "pure" to the MPI spec (i.e., it's a "lawyer's answer"). But since the MPIX_Foo -> MPI_Foo change is inevitable, it just ends up annoying users. 3. Once OMPI introduces MPIX_ symbols, if we want to *not* annoy users, we'll likely have weak symbols / aliased versions of both MPIX_Foo and MPI_Foo once the Foo functionality is included in a published MPI specification. However, when can we delete the MPIX_Foo symbol? It becomes a continuing annoyance of backwards compatibility that we have to keep carrying forward. For all these reasons, we believe that it's better to put expected-upcoming official MPI functionality in the MPI_ namespace, not the MPIX_ namespace. ---------------------------------------------------------------------- All that being said, these are rules of thumb. They are not an official mandate. There may well be cases where there are reasons to do something different than what is outlined above.