2.6.5 Директива flush
flush директива, указывающее, точно ли или содержится в последовательности "между потоками" на котором требуется предоставляет реализацию, что все потоки в рабочей группе имеют согласованное представление некоторых объектов, указанных ниже) в памяти. Это означает, что предыдущие оценки выражений, ссылающихся на эти объекты, в свою очередь, полные и последующие оценки еще не начинали. Например, компиляторы должны получить значения объектов из регистров в памяти, и оборудование записать на диск буферов может записи в памяти и перезапустить значения объектов из памяти.
Синтаксис flush директива выглядит следующим образом:
#pragma omp flush [(variable-list)] new-line
Если объекты, требующие синхронизации могут быть обозначены переменными, то эти переменные могут быть указаны в необязательном список переменных. Если указатель присутствует в список переменныхуказатель, не очищается, сам указатель ссылается на объект.
A flush без а директива список переменных синхронизировать все общие объекты, за исключением труднопоступных объектов с автоматическим длительностью хранения. (Это, вероятно, чтобы иметь несколько служебных данных, чем a flush с список переменных.) A flush без а директива список переменных подразумевает для следующих рекомендаций:
barrier
Записи и выйти из Критические
Записи и выйти из ordered
Записи и выйти из Параллельно
На выйти из для
На выйти из Разделы
На выйти из Одинарный
Записи и выйти из параллель для
Записи и выйти из параллельные разделах
Если а не подразумевается директива nowait предложение отсутствует. Следует отметить, что он flush директива не подразумевается для любого поиска:
Для записи для
Для записи или выйти из Образец
Для записи Разделы
Для записи Одинарный
Ссылка, которая обращается к значению объекта с типом испаряющ-квалифицированным ведет себя так, как если бы было a flush директива указание, что объект на предыдущем шаге последовательности. Ссылка, которая изменяет значение объекта с типом испаряющ-квалифицированным ведет себя так, как если бы было a flush директива указание, что последующий этап последовательности на объект.
Обратите внимание, что поскольку flush директива не имеет выписку языка c, как часть своего синтаксиса, существуют некоторые ограничения на его месте в рамках программы. См. Приложение C# для формального грамматики. В приведенном ниже примере показаны эти ограничения.
/* ERROR - The flush directive cannot be the immediate
* substatement of an if statement.
*/
if (x!=0)
#pragma omp flush (x)
...
/* OK - The flush directive is enclosed in a
* compound statement
*/
if (x!=0) {
#pragma omp flush (x)
}
Ограничения flush директива выглядит следующим образом:
- Переменная, определенная в a flush директива не должна иметь ссылочный тип.