3.2 导语格式
OpenACC的绝大部分功能都是以导语的形式实现,导语有一个基本格式,这个格式简单易学。本书中关于OpenACC语法的描述,都会引用官方标准《The OpenACC Application Programming Interface Version 2.5》,不易懂的地方会追加解释。
在C/C++中,使用#pragma预处理机制指定OpenACC导语,语法是:#pragma acc 导语名字 [子语列表] 换行
每个导语都以#pragma acc开始。导语的其他部分都遵守C/C++中pragma的使用规范。空格和跳格统称为空白字符。#的前后都可以使用空白字符;导语中使用空白字符来分隔各字段。#pragma后面的预处理标记使用宏替换。导语区分大小写。一个OpenACC导语作用于紧接着的语句、结构块和循环。子语列表是一串用逗号分隔的子语。这里的“换行”意为每个导语要独占一行,不要在一行上写多个导语。
例3.3给出了几个格式正确的导语例子,里面的导语、子语的具体含义先不必理会,后文会详述。符号代表空白字符(强调说明可以使用空白字符)。在这几行导语中,private(i)和independent这两个子语既可以使用空白字符分隔,又可以使用逗号分隔。最后两行组成一个导语,续行符“”将长导语分写在多行,便于阅读。去掉所有的续行符和换行符,其他不做任何改变,多行导语就成为仅占一行的长导语。
Fortran自由格式源文件中,用下列格式指定OpenACC导语:!$acc 导语名字 [子语列表]
第一个注释字符(!)可以放在任意列,但它前面只能是空白字符(空格和跳格的统称)。前导符!$acc必须以一个整体出现,中间不能有空白字符。Fortran语言的每行长度、空白字符、续行符规则同样适用于导语行。导语起始行的前导符后面必须接有空白字符。待续行中导语部分的最后一个非空白字符必须是连字符(&),连字符后面仍然可以写注释;接续行中导语必须以前导符开始(前面允许有空白字符),前导符后面的第一个非空白字符可以是续行符。导语行上也可以放注释,注释以感叹号开始,直至行尾。如果前导符后面的第一个非空白字符是一个感叹号,那么该行被忽略。子语列表是一串用逗号分隔的子语。
例3.4中给出几个Fortran版本的导语示范。空白字符的使用规则与C版本相同,不同的是续行规则。第3~5行是分写成3行的一个导语,每行都需要以前导符!$acc开始,而C版则不需要以#pragma开始。
在固定格式Fortran源代码文件中,OpenACC导语可以采取下列形式中的一个:
!$acc 导语名字 [ 子语列表 ]
c$acc 导语名字 [ 子语列表 ]
*$acc 导语名字 [ 子语列表 ]
前导符(!$acc、c$acc或*$acc)必须写在1~5列。固定格式的每行长度、空白字符、续行、列的规则同样适用于导语行。导语起始行第6列必须是空格或0,接续行导语在第6列不能是空格或零。导语行也可以添加注释,注释可以从第7列(包含)之后的任意列以感叹号开始,至行尾结束。
在Fortran中,导语不区分大小写。分写在多行的单个程序语句中间不能混入导语,同样,分写在多行的单个导语中间也不能混入程序语句。本文档中所有Fortran版导语例子都采用自由格式,建议读者也尽量避免新开发Fortran 77代码。
每个导语中只能有一个导语名字,一个例外是组合导语,它被视为单个导语名字。如无特别规定,多个子语出现的顺序无关紧要,子语可以重复出现多次。有些子语的参数会包含一个列表。列表是用逗号分隔的一串子语或参数。