2.6.5 vyprázdnění směrnice
Flush směrnice, výslovné nebo mlčky určuje posloupnost "mezi podprocesy" bod používá provádění všechny podprocesy v týmu zajistit konzistentní zobrazení některých objektů (níže), v paměti.To znamená, že předchozí hodnocení výrazy, které odkazují na tyto objekty jsou kompletní a následné hodnocení ještě nezačaly.Kompilátory musí obnovit hodnoty objektů z registrů do paměti a hardware může potřebovat vyprázdnění vyrovnávací paměti pro zápis do paměti a znovu načíst hodnoty objektů z paměti.
Syntaxe flush směrnice je následující:
#pragma omp flush [(variable-list)] new-line
Pokud objekty, které vyžadují synchronizaci můžete všechny označí proměnné, pak tyto proměnné lze zadat v nepovinné seznamu proměnné.Pokud je ukazatel v seznamu proměnné, ukazatel sám vyprázdněn, není objekt odkazuje ukazatel.
A flush směrnice bez seznamu proměnné synchronizuje všechny sdílené objekty, s výjimkou nepřístupné objekty s dobou trvání automatického ukládání.(Toto je pravděpodobně další režii než flush s seznamu proměnné.) A flush směrnice bez seznamu proměnné je zahrnuto následujících směrnic:
barrier
Na vstupu a výstupu z kritický
Na vstupu a výstupu zordered
Na vstupu a výstupu z paralelní
Opuštění at pro
Opuštění at oddíly
Opuštění at jeden
Na vstupu a výstupu z pro paralelní
Na vstupu a výstupu z paralelní sekce
Pokud není implikován směrnice nowait je přítomna klauzule.Je třeba poznamenat, že flush směrnice není implikován pro následující:
Vstup pro
Položka nebo výstupu z předlohy
Vstup oddíly
Vstup jeden
Odkaz na hodnotu objekt typu volatile kvalifikované přistupuje chová, jako kdyby vyprázdnění směrnice určující předchozí sekvence bodu objektu.Odkaz na hodnotu objekt typu volatile kvalifikované chová, jako kdyby flush směrnice zadání následující sekvence bodu objektu.
Všimněte si, že protože flush směrnice nemá prohlášení jako součást jeho syntaxi jazyka C, existují určitá omezení na jeho umístění v programu.Viz Dodatku C pro formální gramatiky.Následující příklad ilustruje těchto omezení.
/* 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)
}
Omezení flush směrnice jsou následující:
- Proměnné uvedené v flush směrnice nesmí mít typ odkazu.