《OpenACC并行编程实战》—— 3.2 导语格式

简介: OpenACC的绝大部分功能都是以导语的形式实现,导语有一个基本格式,这个格式简单易学。本书中关于OpenACC语法的描述,都会引用官方标准《The OpenACC Application Programming Interface Version 2.5》,不易懂的地方会追加解释。

本节书摘来自华章出版社《OpenACC并行编程实战》一 书中的第3章,第3.2节,作者何沧平,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

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导语作用于紧接着的语句、结构块和循环。子语列表是一串用逗号分隔的子语。这里的“换行”意为每个导语要独占一行,不要在一行上写多个导语。

3cdfab57632740ef0a845d00302a43e4ca277364

例3.3给出了几个格式正确的导语例子,里面的导语、子语的具体含义先不必理会,后文会详述。符号代表空白字符(强调说明可以使用空白字符)。在这几行导语中,private(i)和independent这两个子语既可以使用空白字符分隔,又可以使用逗号分隔。最后两行组成一个导语,续行符“”将长导语分写在多行,便于阅读。去掉所有的续行符和换行符,其他不做任何改变,多行导语就成为仅占一行的长导语。
Fortran自由格式源文件中,用下列格式指定OpenACC导语:
!$acc 导语名字 [子语列表]
第一个注释字符(!)可以放在任意列,但它前面只能是空白字符(空格和跳格的统称)。前导符!$acc必须以一个整体出现,中间不能有空白字符。Fortran语言的每行长度、空白字符、续行符规则同样适用于导语行。导语起始行的前导符后面必须接有空白字符。待续行中导语部分的最后一个非空白字符必须是连字符(&),连字符后面仍然可以写注释;接续行中导语必须以前导符开始(前面允许有空白字符),前导符后面的第一个非空白字符可以是续行符。导语行上也可以放注释,注释以感叹号开始,直至行尾。如果前导符后面的第一个非空白字符是一个感叹号,那么该行被忽略。子语列表是一串用逗号分隔的子语。
ede9f1950dc8716a5030ff813408388dd4506521 cf93e1c30aa09dca1c0b4db90c1eb09c6bf7d072

例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代码。
每个导语中只能有一个导语名字,一个例外是组合导语,它被视为单个导语名字。如无特别规定,多个子语出现的顺序无关紧要,子语可以重复出现多次。有些子语的参数会包含一个列表。列表是用逗号分隔的一串子语或参数。
相关文章
|
设计模式 前端开发 网络协议
软件体系结构 - 软件架构复用
软件体系结构 - 软件架构复用
528 0
|
9月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
418 34
|
12月前
|
存储 监控 供应链
区块链如何防止欺诈性交易
区块链如何防止欺诈性交易
|
负载均衡 调度 Android开发
有关big.LITTLE,你需要知道的十件事情
有关big.LITTLE,你需要知道的十件事情
340 0
|
编解码 算法 前端开发
聊聊我从底层算法到业务算法转型的这一年
聊聊我从底层算法到业务算法转型的这一年
624 0
|
存储 缓存 弹性计算
重新审视 CXL 时代下的分布式内存
从以太网到 RDMA 再到 CXL,标志着互连技术的重大突破。
|
JavaScript 前端开发 测试技术
动态组件化的优缺点是什么
【9月更文挑战第2天】动态组件化的优缺点是什么
244 5
|
存储 关系型数据库 MySQL
带你读《2022龙蜥社区全景白皮书》——5.3.4 跨处理器节点内存访问优化
带你读《2022龙蜥社区全景白皮书》——5.3.4 跨处理器节点内存访问优化
807 96
|
设计模式 API 数据库
【C/C++ 设计思路】C++中解耦策略的艺术:有效管理复杂依赖关系
【C/C++ 设计思路】C++中解耦策略的艺术:有效管理复杂依赖关系
805 3
|
存储 传感器 缓存
轻量级的嵌入式模块化软件架构
轻量级的嵌入式模块化软件架构
382 1