当前位置: 首页 > news >正文

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

本节书摘来自华章出版社《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代码。
每个导语中只能有一个导语名字,一个例外是组合导语,它被视为单个导语名字。如无特别规定,多个子语出现的顺序无关紧要,子语可以重复出现多次。有些子语的参数会包含一个列表。列表是用逗号分隔的一串子语或参数。

相关文章:

  • Mysql查询缓存研究
  • 如何使用Monit部署服务器监控系统
  • 《途客圈创业记:不疯魔,不成活》一一2.8 正式上线
  • 《OSPF网络设计解决方案(第2版)》一1.2 理解OSI参考模型的7层
  • 《Android开发进阶:从小工到专家》——导读
  • Nginx+Keepalived实现站点高可用
  • 三张图看遍Linux 性能监控、测试、优化工具
  • 《jQuery、jQuery UI及jQuery Mobile技巧与示例》——9.12 技巧:跨页面时固定footer...
  • 《软件功能测试自动化实战教程》—第6章6.1节什么时候使用数据驱动测试方法...
  • 《淘宝店铺设计装修一册通》一1.3 店铺装修必须注意的问题
  • Linux有问必答:nginx网络服务器上如何阻止特定用户代理(UA)
  • 《Photoshop修色圣典(第5版)》—第1章1.13节你将是裁判
  • 浅谈JAVA中字符串常量的储存位置
  • 容器 What, Why, How - 每天5分钟玩转容器技术(6)
  • postman参数为Json数据结构
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 30天自制操作系统-2
  • bootstrap创建登录注册页面
  • Centos6.8 使用rpm安装mysql5.7
  • JavaScript对象详解
  • java多线程
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Laravel Telescope:优雅的应用调试工具
  • Linux快速复制或删除大量小文件
  • MySQL用户中的%到底包不包括localhost?
  • ng6--错误信息小结(持续更新)
  • spring-boot List转Page
  • Vue2 SSR 的优化之旅
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 百度地图API标注+时间轴组件
  • 力扣(LeetCode)965
  • 日剧·日综资源集合(建议收藏)
  • 移动端解决方案学习记录
  • 原生Ajax
  • 走向全栈之MongoDB的使用
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $.ajax()方法详解
  • (c语言)strcpy函数用法
  • (Note)C++中的继承方式
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (排序详解之 堆排序)
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)Sql Server 保留几位小数的两种做法
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (轉貼) UML中文FAQ (OO) (UML)
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .Net MVC4 上传大文件,并保存表单
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET6实现破解Modbus poll点表配置文件
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件