C. C- und C++-Grammatik in OpenMP

Erfahren Sie mehr über die Grammatikregeln und Syntaxerweiterungen in C und C++ für OpenMP, ein paralleles Programmierframework.

C.1-Schreibweise

Die Grammatikregeln bestehen aus dem Namen für ein Nicht-Terminal, gefolgt von einem Doppelpunkt, gefolgt von Ersetzungsalternativen in separaten Zeilen.

Der syntaktische Ausdruck opt gibt an, dass der Ausdruck innerhalb der Ersetzung optional ist.

Der syntaktische Ausdruck termoptseq entspricht term-seqopt mit den folgenden zusätzlichen Regeln:

term-seq:
  Begriff
  Begriff-SequenzBegriff
  term-seq,Ausdruck

C.2-Regeln

Die Notation wird in Abschnitt 6.1 des C-Standards beschrieben. In diesem Grammatikanhang sind die Erweiterungen für die Grammatik der Basissprache für die OpenMP C- und C++-Direktiven aufgeführt.

/* in C++ (ISO/IEC 14882:1998) */

statement-seq:
  Anweisung
  openmp-direktive
  Statement-seq-Anweisung
  statement-seq openmp-directive

/* in C90 (ISO/IEC 9899:1990) */

Anweisungsliste:
  Anweisung
  openmp-direktive
  statement-list-Anweisung
  Anweisungsliste OpenMP-Direktive

/* in C99 (ISO/IEC 9899:1999) */

Blockelement:
  Erklärung
  Anweisung
  openmp-direktive

/* Standardanweisungen */

Aussage:
  openmp-construct

openmp-construct:
  Parallelkonstruktion
  for-construct
  Sections-Construct
  Einzelkonstrukt
  Parallel-für-Konstrukt
  Parallelabschnittskonstrukt
  Hauptkonstrukt
  kritisches Konstrukt
  Atomarer Konstrukt
  geordnetes Konstrukt

openmp-direktive:
  Barrieredirektive
  Flush-Direktive

strukturierter Block:
  Anweisung

Parallelkonstrukt:
  Parallele Direktive-Blockstruktur

Paralleldirektive:
  # pragma omp parallel Parallel-Klauseloptseqneue-Zeile

Parallel-Klausel:
  einzigartige-parallele-Klausel
  data-clause

unique-parallel-clause:
  if ( Ausdruck)
  num_threads ( Ausdruck)

for-construct:
  Iterationsanweisung für direktive

for-directive:
  # pragma omp for for-clauseoptseqnew-line

for-clause:
  unique-for-clause
  data-clause
  nowait

unique-for-clause:
  ordered
  schedule ( Zeitplanart)
  schedule ( Zeitplanart,Ausdruck)

Zeitplanart:
  static
  dynamic
  guided
  runtime

sections-construct:
  "sections-directive" Abschnittsumfang

sections-directive:
  # pragma omp sections Abschnitts-Klauseloptseqneue-Zeile

sections-clause:
  data-clause
  nowait

Abschnittsbereich:
  { section-sequence }

Abschnittssequenz:
  Abschnitts-Direktiveoptstrukturierter Block
  Abschnitte-Sequenz Abschnitt-Direktive Strukturierter-Block

Abschnittsdirektive:
  # pragma omp section Neue Zeile

Einzelkonstrukt:
  Eindirektiver strukturierter Block

Einzeldirektive:
  # pragma omp single Einzelsatzoptseqneue Zeile

Einzelklausel:
  data-clause
  nowait

parallel-for-construct:
  Parallel-für-Direktive-Iterationsanweisung

Parallel-für-Direktive:
  # pragma omp parallel for Parallel-for-Clauseoptseqnew-line

Parallele-für-Klausel:
  einzigartige-parallele-Klausel
  unique-for-clause
  data-clause

Parallelabschnittskonstrukt:
  Parallelabschnitts-Direktive Abschnittsbereich

Parallelabschnittsdirektive:
  # pragma omp parallel sections parallel-sections-clauseoptseqnew-line

Parallelabschnittsklausel:
  einzigartige-parallele-Klausel
  data-clause

Master-Konstrukt:
  strukturierter Master-Direktive-Block

Hauptdirektive:
  # pragma omp master Neue Zeile

kritisches Konstrukt:
  Strukturierter Block mit kritischer Direktive

kritische Direktive:
  # pragma omp critical region-phraseoptnew-line

Regionsausdruck:
  (Bezeichner)

Barrieredirektive:
  # pragma omp barrier Neue Zeile

Atomkonstrukt:
  Ausdrucksanweisung für die Atomdirektive

Atomdirektive:
  # pragma omp atomic Neue Zeile

Flush-Direktive:
  # pragma omp flush flush-varsoptnew-line

Flush-Vars:
  (Variablenliste)

geordnetes Konstrukt:
  geordneter strukturierter Direktivenblock

ordered-directive:
  # pragma omp ordered Neue Zeile

/* Standarddeklarationen */

Deklaration:
  threadprivate-direktive

threadprivate-direktive:
  # pragma omp threadprivate ( Variable-Liste)Neue Zeile

data-clause:
  private ( Variable-Liste)
  copyprivate ( Variable-Liste)
  firstprivate ( Variable-Liste)
  lastprivate ( Variable-Liste)
  shared ( Variable-Liste)
  default ( shared )
  default ( none )
  reduction ( Reduktionsoperator:Variable-Liste)
  copyin ( Variable-Liste)

Reduktionsoperator:
 Eine der folgenden Optionen: + \* - & ^ | && ||

/* in C */

Variable-Liste:
  Bezeichner
  Variable-Liste,Bezeichner

/* in C++ */

Variable-Liste:
  ID-Ausdruck
  Variable-Liste,ID-Ausdruck