2.6.5 flush dyrektywy
Opróżnić dyrektywy, czy wyraźnej lub dorozumianej, określa punkt sekwencji "cross wątku", przy której wykonania ma obowiązek zapewnić, że wszystkie wątki w zespole mają jednolity widok niektóre obiekty (patrz niżej) w pamięci.Oznacza to, że poprzednich ocen wyrażenia odwołujące się do tych obiektów są kompletne, a kolejne oceny nie rozpoczęły jeszcze.Na przykład kompilatory należy przywrócić wartości obiektów z rejestrów do pamięci i sprzęt może być konieczne opróżnienia buforów zapisu do pamięci i ponowne załadowanie wartości obiektów z pamięci.
Składnia opróżnić dyrektywy jest następująca:
#pragma omp flush [(variable-list)] new-line
Jeśli obiekty, które wymagają synchronizacji można wszystkie oznaczone zmiennych, a następnie te zmienne można określić w opcjonalnej listy zmiennej.Jeśli kursor znajduje się w listy zmiennej, sam wskaźnik jest opróżniany, nie obiekt wskaźnik odnosi się do.
A opróżnić dyrektywa, bez listy zmiennej synchronizuje wszystkich udostępnionych obiektów z wyjątkiem obiektów niedostępne z czasem trwania składowania automatyczne.(Jest to prawdopodobnie mają większe obciążenie niż z opróżnić z listy zmiennej.) A opróżnić dyrektywa, bez listy zmiennej jest implikowana w następujących dyrektywach:
barrier
U wejścia do i wyjścia z krytyczny
U wejścia do i wyjścia zordered
U wejścia do i wyjścia z równoległe
Na wyjściu z dla
Na wyjściu z sekcji
Na wyjściu z pojedynczy
U wejścia do i wyjścia z równolegle do
U wejścia do i wyjścia z sekcje równoległe
Niniejszej dyrektywy nie jest wprost, jeśli nowait klauzuli jest obecny.Należy zauważyć, że opróżnić dyrektywy nie jest implikowana dla dowolnego z następujących czynności:
U wejścia do dla
U wejścia do lub wyjścia z wzorca
U wejścia do sekcji
U wejścia do pojedynczy
Odwołanie, który uzyskuje dostęp do wartości obiektu typu kwalifikowana lotnych zachowuje się tak, jakby były opróżnić dyrektywy, określając tego obiektu w poprzednim punkcie sekwencji.Odniesienia, która modyfikuje wartość obiektu typu kwalifikowana lotnych zachowuje się tak, jakby były opróżnić dyrektywy, określając ten obiekt w punkcie kolejnych sekwencji.
Należy zauważyć, że ponieważ opróżnić dyrektywa nie ma instrukcji języka C, jako część jego składni, istnieją pewne ograniczenia dotyczące jego położenie w programie.Zobacz Dodatku C formalne gramatyki.Poniższy przykład ilustruje te ograniczenia.
/* 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)
}
Ograniczenia do opróżnić dyrektywy są w następujący sposób:
- Zmienna, określona w opróżnić dyrektywa nie musi mieć typ odwołania.