OpenMP指导语句在程序中以特殊格式的程序注释出现。它的格式如下:

    sentinel directive_name [clause[[,]clause]...]

  它包含三个部分。sentinel是OpenMP指导语句的辨识符。directive_name给出指导语句的名称,clause是该指导语句的附加子句,子句之间用空格分隔。

  Sentinel以程序的注释标记符开头(思考:这有什么好处?答案:可以使一般的编译器也可以顺利编译OpenMP程序,只不过生成的是普通的串行程序)。

  对固定程序格式的Fortran,sentinel可以是如下的三种形式:
    !$OMP
    C$OMP
    *$OMP
  
  它从程序的第一列开始,中间不能有空格。其他的固定程序格式的Fortran中的格式规则,比如程序行长度,大小写规则,空格,续行等等都适用于指导语句。这种形式下,指导语句的第六行必须是空格或0,续行符也必须出现在第六行。指导语句的关键字之间可以不用有空格。

  比如下面的例子:

  C23456789(程序列标志:前九列)
  !$OMP PARALLEL DO SHARED(A,B,C)

  C$OMP PARALLEL DO
  C$OMP+SHARED(A,B,C)

  C$OMP PARALLELDOSHARED(A,B,C)

  上面的三种形式在固定格式下具有相同的含义

  对自由格式的Fortran程序,sentinel只能是下面的形式
  !$OMP
  它可以从程序中的任意列开始(只要它前面的列都是空白字符--空格和Tab字符就可以),它中间不能插入空格。其它的自由程序格式的Fortran程序的格式规则也同样适用于OpenMP指导语句。指导语句的续行符为&,可以出现在指导语句整行的末尾,也可以出现在下一行的sentinel的后边。

  比如下面的例子:

  !23456789
   !$OMP PARALLEL DO &
    !$OMP SHARED(A,B,C)

  !$OMP PARALLEL &
  !$OMP&DO SHARED(A,B,C)

  !$OMP PARALLEL DO SHARED(A,B,C)

  上面三种形式等价。
  指导语句的关键字之间用空白字符分隔。但下面的关键字之间可以没有(也可以有)空白字符:

  END CRITICAL
  END DO
  END MASTER
  END ORDERED
  END PARALLEL
  END SECTIONS
  END SINGLE
  END WORKSHARE
  PARALLEL DO
  PARALLEL SECTIONS
  PARALLEL BLOCK

  OpenMP标准支持的条件编译
  条件编译语句在程序中也以注释的形式出现,他们只对OpenMP编译器有意义,其他不支持OpenMP的编译器会将它忽略。这是为解决非指导语句(比如OpenMP运行时函数调用和其他相关的语句)的可移植性而提出来的。

  对固定格式的Fortran程序,条件编译语句以
   !$
   C$
   *$
  开头。其它的规则请详细阅读标准。下面是一个例子。

   C23456789
   !$ 10 IAM = OMP_GET_THREAD_NUM +
   !$ & INDEX

   #ifdef _OPENMP
   10 IAM = OMP_GET_THREAD_NUM +
   & INDEX
   #endif

  这两种形式等价。自由形式的Fortran程序条件编译语句以!$开头,这里不再详细描述。为了讨论方便,本文中采用自由形式的指导语句。