3.5.5 Директива flush
Синхронизация типа flush используется для обновления значений
локальных переменных, перечисленных в качестве аргументов этой
команды, в оперативной памяти. После выполнения этой директивы все
переменные, перечисленные в этой директиве, имеют одно и то же
значение для всех параллельных потоков.
#pragma omp flush [(список)]
Выполнение данной директивы предполагает, что значения всех
переменных (или переменных из списка, если он задан), временно
хранящиеся в регистрах и кэш-памяти текущей нити, будут занесены в
основную память; все изменения переменных, сделанные нитью во время
работы, станут видимы остальным нитям; если какая-то информация
хранится в буферах вывода, то буферы будут сброшены и т.п. При этом
операция производится только с данными вызвавшей нити, данные,
изменявшиеся другими нитями, не затрагиваются. Поскольку выполнение
данной директивы в полном объёме может повлечь значительных
накладных расходов, а в данный момент нужна гарантия согласованного
представления не всех, а лишь отдельных переменных, то эти переменные
можно явно перечислить в директиве списком. До полного завершения
операции никакие действия с перечисленными в ней переменными не
могут начаться.
Неявно flush без параметров присутствует в директиве barrier, на
входе и выходе областей действия директив parallel, critical, ordered, на
выходе областей распределения работ, если не используется опция nowait,
в вызовах функций omp_set_lock(), omp_unset_lock(), omp_test_lock(),
omp_set_nest_lock(), omp_unset_nest_lock(), omp_test_nest_lock(), если при
этом замок устанавливается или снимается, а также перед порождением и
после завершения любой задачи (task). Кроме того, flush вызывается для
переменной, участвующей в операции, ассоциированной с директивой
Достарыңызбен бөлісу: |