C. Grammatica OpenMP C e C++

Informazioni sulle regole grammaticali e sulle estensioni della sintassi in C e C++ per OpenMP, un framework di programmazione parallela.

Notazione C.1

Le regole grammaticali sono costituite dal nome di un non terminale, seguito da due punti, seguito da alternative di sostituzione su righe separate.

Il terminedi espressione sintattica opt indica che il termine è facoltativo all'interno della sostituzione.

L'espressione sintattica termoptseq equivale a termine-seqopt con le seguenti regole aggiuntive:

term-seq:
  termine
  termine-seqtermine
  termine-seq,termine

Regole C.2

La notazione è descritta nella sezione 6.1 dello standard C. Questa appendice grammaticale mostra le estensioni della grammatica del linguaggio di base per le direttive OpenMP C e C++.

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

statement-seq:
  affermazione
  direttiva openmp
  istruzione statement-seq
  statement-seq openmp-directive

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

elenco di dichiarazioni:
  affermazione
  direttiva openmp
  istruzione di statement-list
  statement-list openmp-directive

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

block-item:
  dichiarazione
  affermazione
  direttiva openmp

Istruzioni standard /* */

dichiarazione:
  openmp-construct

openmp-construct:
  costrutto parallelo
  for-construct
  costrutto di sezioni
  costrutto unico
  parallel-for-construct
  costrutto di sezioni parallele
  master-construct
  costrutto critico
  atomic-construct
  costrutto ordinato

openmp-directive:
  direttiva barriera
  flush-directive

structured-block:
  affermazione

costrutto-parallelo:
  blocco strutturato di direttiva parallela

direttiva-parallela
  # pragma omp parallel clausola parallelaoptseqnuova-linea

clausola parallela:
  clausola-unica-parallela
  clausola dei dati

clausola-unica-parallela:
  if ( espressione)
  num_threads ( espressione)

for-construct:
  istruzione di iterazione for

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

for-clause:
  unique-for-clause
  clausola dei dati
  nowait

unique-for-clause:
  ordered
  schedule ( tipo di pianificazione)
  schedule ( tipo di pianificazione,espressione)

tipo di pianificazione:
  static
  dynamic
  guided
  runtime

sections-construct:
  direttiva-sezione ambito-sezione

direttiva-sezioni:
  # pragma omp sections sections-clauseoptseqnew-line

clausola-di-sezioni:
  clausola data
  nowait

ambito sezione:
  { section-sequence }

sequenza di sezioni:
  section-directiveoptstructured-block
  sequenza-sezione direttiva-sezione blocco-strutturato

sezione-direttiva:
  # pragma omp section nuova riga

costrutto singolo:
  blocco strutturato a direttiva singola

direttiva singola:
  # pragma omp single clausola-singola optseqnuova-linea

single-clause:
  clausola data
  nowait

parallel-for-construct:
  istruzione iterazione parallel-for-directive

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

parallel-for-clause:
  clausola-unica-parallela
  unique-for-clause
  clausola data

costrutto sezioni-parallele:
  direttiva-sezioni-parallele ambito-sezione

direttiva sezioni-parallele:
  # pragma omp parallel sections clausola-sezioni-paralleleoptseqnuova-linea

parallel-sections-clause:
  clausola-unica-parallela
  clausola data

master-construct:
  master-directive blocco strutturato

direttiva principale:
  # pragma omp master nuova riga

critical-construct:
  blocco strutturato direttiva-critica

direttiva-critica:
  # pragma omp critical region-phraseoptnew-line

region-phrase:
  (identificatore)

direttiva di barriera:
  # pragma omp barrier nuova riga

atomic-construct:
  espressione-istruzione di direttiva atomica

direttiva-atomica
  # pragma omp atomic nuova riga

flush-directive:
  # pragma omp flush flush-varsoptnew-line

flush-vars:
  (variable-list)

ordered-construct:
  blocco strutturato con direttive ordinate

direttiva ordinata
  # pragma omp ordered nuova riga

Dichiarazioni standard /* */

dichiarazione:
  threadprivate-directive

threadprivate-directive:
  # pragma omp threadprivate ( variable-list)nuova riga

clausola dati:
  private ( variable-list)
  copyprivate ( variable-list)
  firstprivate ( variable-list)
  lastprivate ( variable-list)
  shared ( variable-list)
  default ( shared )
  default ( none )
  reduction ( Operatore: di riduzionelista-variabili)
  copyin ( variable-list)

Operatore di riduzione
 Uno dei seguenti: + \* - & ^ | && ||

/* in C */

variable-list:
  identificatore
  variable-list,identificatore

/* in C++ */

variable-list:
  id-expression
  variable-list,id-expression