Advice to users.
All the material in this section is an advice to users.
( End of advice to users.)
A coherence problem exists between variables kept in registers and the memory values of these variables. An RMA call may access a variable in memory (or cache), while the up-to-date value of this variable is in register. A get will not return the latest variable value, and a put may be overwritten when the register is stored back in memory. Note that these issues are unrelated to the RMA memory model; that is, these issues apply even if the memory model is MPI_WIN_UNIFIED.
The problem is illustrated by the following code:
In this example, variable buff is allocated in the register reg_A and therefore ccc will have the old value of buff and not the new value 777.
This problem, which also afflicts in some cases send/receive communication, is discussed more at length in Section Optimization Problems, an Overview .
Programs written in C avoid this problem, because of the semantics of C. Many Fortran compilers will avoid this problem, without disabling compiler optimizations. However, in order to avoid register coherence problems in a completely portable manner, users should restrict their use of RMA windows to variables stored in modules or COMMON blocks. To prevent problems with the argument copying and register optimization done by Fortran compilers, please note the hints in Sections Problems With Fortran Bindings for MPI --Comparison with C . Sections Solutions to The (Poorly Performing) Fortran VOLATILE Attribute discuss several solutions for the problem in this example.