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程序条件编译语句以!$开头,这里不再详细描述。为了讨论方便,本文中采用自由形式的指导语句。
|