Совет пользователям: Весь материал в этом разделе является советом пользователю.
Существует проблема когерентности между переменными, содержащимися в
регистрах и значениями этих переменных в памяти. RMA вызов может
обратиться к переменной в памяти (или кэше), в то время как ``свежее''
значение этой переменой находится в регистре. В таком случае get
не вернет самое последнее значение переменной, а результат работы
put
может быть перезаписан в тот момент, когда регистр заносится
обратно в память.
Проблема проиллюстрирована следующим кодом:
Source of Process 1 | Source of Process 2 | Executed in Process 2 | |
bbbb = 777
|
buff=999
|
reg_A:=999
|
В этом примере, переменная buff
размещена в регистре REG_A
и
поэтому ccc
будет иметь старое значение buff
, а не новое
.
Эта проблема, которая также разрушает в некоторых случаях
send/receive
взаимодействие, обсуждается глубже в разделе 10.2.2.
MPI реализации не столкнутся с этой проблемой в отношении стандарта,
касающегося Си программ. Множество компиляторов ФОРТРАНa не
столкнутся с этой проблемой, даже без отключения оптимизации в компиляторе.
Однако, для того, чтобы избежать проблемы когерентности регистров полностью
переносимым образом, пользователи должны ограничить себя в использовании в
RMA окнах переменных, хранящихся в блоках COMMON
, или переменных,
которые были объявлены VOLATILE
(несмотря на то, что
VOLATILE
не является стандартной декларацией ФОРТРАНa, оно
поддерживается многими ФОРТРАН-компиляторами). Детали и дополнительное
решение обсуждаются в разделе 8.2.2, ``Проблемы регистровой оптимизации''.
Смотрите также ``Проблемы из-за копирования данных и
последовательности ассоциаций'', по поводу дополнительных проблем ФОРТРАНa.