Chapitre C. Grammaire OpenMP C et C++

Découvrez les règles de grammaire et les extensions de syntaxe en C et C++ pour OpenMP, une infrastructure de programmation parallèle.

Notation C.1

Les règles de grammaire se composent du nom pour un non-terminal, suivi d’un signe deux-points, suivi d’alternatives de remplacement sur des lignes distinctes.

L’expression syntaxique termopt indique que le terme est facultatif pour le remplacement.

L’expression syntaxique termoptseq équivaut à term-seqopt avec les règles supplémentaires suivantes :

term-seq :
  terme
  term-seqterm
  term-seq,terme

Règles C.2

La notation est décrite dans la section 6.1 de la norme C. Cette annexe de la grammaire montre les extensions de la grammaire du langage de base pour les directives OpenMP C et C++.

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

séquence d'instructions :
  déclaration
  openmp-directive
  séquence d'instructions instruction
  séquence-instructions directive-openmp

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

statement-list :
  déclaration
  directive-openmp
  declaration de liste d'instructions
  liste-instructions directive-openmp

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

élément-bloc :
  déclaration
  déclaration
  directive-openmp

/* déclarations standard */

déclaration :
  constructeur OpenMP

openmp-construct:
  construction-parallèle
  structure for
  sections-construction
  constructeur unique
  constructeur parallel-for
  construction-sections-parallèles
  master-construct
  construction-critique
  construction-atomique
  structure ordonnée

directive OpenMP :
  directive-barrière
  directive-de-rinçage

bloc-structuré :
  déclaration

construction-parallèle :
  parallèle-directive bloc-structuré

directive-parallèle :
  # pragma omp parallel clause-parallèleoptseqnouvelle-ligne

clause-parallèle :
  clause-parallèle-unique
  clause-données

clause-unique-parallèle :
  if ( expression)
  num_threads ( expression)

construction-for :
  directive for instruction d'itération

for-directive :
  # pragma omp for for-clauseoptseqnouvelle-ligne

for-clause :
  clause-unique-pour
  clause-données
  nowait

unique-pour-clause :
  ordered
  schedule ( type-planification)
  schedule ( type-planification,expression)

type de programme :
  static
  dynamic
  guided
  runtime

sections de construction :
  directive-sections périmètre-section

sections-directive :
  # pragma omp sections sections-clauseoptseqnouvelle-ligne

sections-clause :
  clause-données
  nowait

section d'étendue :
  { section-séquence }

section-séquence :
  directive-sectionoptbloc-structuré
  section-séquence directive-section bloc-structuré

section-directive :
  # pragma omp section nouvelle-ligne

construction-unique :
  bloc structuré à directive unique

directive-unique :
  # pragma omp single clause simpleoptseqnouvelle-ligne

clause-unique :
  clause-données
  nowait

construction-parallèle-for :
  directive pour parallèle instruction de boucle

directive-parallèle-for :
  # pragma omp parallel for parallèle-pour-clauseoptseqnouvelle-ligne

clause-for-parallèle :
  clause-parallèle-unique
  unique-pour-clause
  clause-données

construction-sections-parallèles :
  directive-sections-parallèles portée de la section

directive-sections-parallèles :
  # pragma omp parallel sections parallel-sections-clauseoptseqnouvelle-ligne

clause-sections-parallèles :
  clause-parallèle-unique
  clause-données

constructeur principal :
  bloc structuré de directives principales

directive principale :
  # pragma omp master nouvelle-ligne

construction-critique :
  directive critique bloc structuré

directive critique :
  # pragma omp critical expression-régionoptnouvelle-ligne

expression régionale :
  (identificateur)

directive de barrière :
  # pragma omp barrier nouvelle-ligne

construction-atomique :
  directive atomique instruction d'expression

directive-atomique :
  # pragma omp atomic nouvelle-ligne

directive de purge :
  # pragma omp flush vider-variablesoptionnouvelle-ligne

variables-vidage :
  (liste-variables)

construction-ordonnée :
  directive ordonnée de bloc structuré

directive-ordonnée :
  # pragma omp ordered nouvelle-ligne

/* déclarations standard */

declaration :
  directive-threadprivate

directive privée au niveau du thread
  # pragma omp threadprivate ( liste-variables)nouvelle-ligne

clause-données :
  private ( liste-variables)
  copyprivate ( liste-variables)
  firstprivate ( liste-variables)
  lastprivate ( liste-variables)
  shared ( liste-variables)
  default ( shared )
  default ( none )
  reduction ( opérateur-réduction:liste-variables)
  copyin ( liste-variables)

opérateur de réduction :
 Un des éléments suivants : + \* - & ^ | && ||

/* en C */

liste-variables :
  identificateur
  liste-variables,identificateur

/* en C++ */

liste-variables :
  id-expression
  liste-variables,expression-id