《OpenACC并行编程实战》—— 2.2 OpenACC 2.5规范

2.2 OpenACC 2.5规范

本节列出OpenACC的主要构件、导语,读完本书后可以在此处快速查阅语法,不必到正文中寻找零星的介绍。初次阅读请跳过。

1.导语一般格式

C/C++:
#pragma acc 导语名字 [子语列表] 换行
Fortran
!$acc 导语名字 [子语列表]

2. parallel构件

C/C++:
#pragma acc parallel [子语列表] 换行
  结构块
Fortran:
!$acc parallel [子语列表]
  结构块
!$acc end parallel
parallel构件的子语:
async[( 整数表达式 )]
wait[(整数表达式列表 )]
num_gangs(整数表达式)
num_workers(整数表达式 )
vector_length(整数表达式 )
device_type(设备类型列表)
if(条件)
reduction(操作符:变量列表)
copy(变量列表)
copyin(变量列表)
copyout(变量列表)
create(变量列表)
present(变量列表)
deviceptr(变量列表)
private(变量列表)
firstprivate(变量列表)
default(none|present)

3. kernels构件

C/C++:
#pragma acc kernels [子语列表] 换行
  结构块
Fortran:
!$acc kernels [子语列表]
  结构块
!$acc end kernels
kernels构件的子语:
async[(整数表达式)]
wait[(整数表达式列表)]
num_gangs(整数表达式)
num_workers(整数表达式)
vector_length(整数表达式)
device_type(设备类型列表)
if(条件)
copy(变量列表)
copyin(变量列表)
copyout(变量列表)
create(变量列表)
present(变量列表)
deviceptr(变量列表)
default(none|present)

4. data构件

C/C++:
#pragma acc data [子语列表] 换行
  结构块
Fortran:
!$acc data [子语列表]
  结构块
!$acc end data
data构件的子语:
if(条件)
copy(变量列表)
copyin(变量列表)
copyout(变量列表)
create(变量列表)
present(变量列表)
deviceptr(变量列表)

5. enter data导语

C/C++:
#pragma acc enter data 子语列表  换行
Fortran:
!$acc enter data 子语列表
enter data的子语:
if(条件)
async[(整数表达式)]
wait[(整数表达式列表)]
copyin(变量列表)
create(变量列表)

6. exit data导语

C/C++:
#pragma acc exit data 子语列表  换行
Fortran:
!$acc exit data 子语列表
exit data的子语:
if(条件)
async[(整数表达式)]
wait[(整数表达式列表)]
copyout(变量列表)
delete(变量列表)
finalize

7. host_data导语

C/C++:
#pragma acc host_data 子语列表  换行
  结构化块
Fortran:
!$acc host_data 子语列表
  结构化块
!$acc end host_data
host_data的子语:
use_device(变量列表)

8. loop导语

C/C++:
#pragma acc loop [子语表表] 换行
  for循环
Fortran:
!$acc loop [子语列表]
  do循环
loop的子语:
collapse(n)
gang[(gang参数列表)]
worker[([num:]整数表达式)]
vector[([length:]整数表达式)]
seq
auto
tile(尺寸表达式列表)
device_type(设备类型列表)
independent
private(列表)
reduction(操作符:列表)

9.组合导语

C/ C++:
#pragma acc parallel loop [子语列表] 换行
  for 循环
#pragma acc kernels loop [子语列表] 换行
  for 循环
Fortran:
!$acc parallel loop [子语列表]
  do 循环
[!$acc end parallel loop]
!$acc kernels loop [子语列表]
  do 循环
[!$acc end kernels loop]

10. declare导语

C/C++:
#pragma acc declare 子语列表 换行
Fortran:
!$acc declare 子语列表
declare的子语:
copy(变量列表)
copyin(变量列表)
copyout(变量列表)
create(变量列表)
present(变量列表)
deviceptr(变量列表)
device_resident(变量列表)
link(变量列表)

11. init导语

C/C++:
#pragma acc init [子语列表] 换行
Fortran:
!$acc init [子语列表]
init的子语:
device_type( 设备类型列表 )
device_num( 整数表达式 )

12. shutdown导语

C/C++:
#pragma acc shutdown [子语列表] 换行
Fortran:
!$acc shutdown [子语列表]
shutdown的子语:
device_type( 设备类型列表 )
device_num( 整数表达式 )

13. set导语

C/C++:
#pragma acc set [子语列表] 换行
Fortran:
!$acc set [子语列表]
set的子语:
default_async( 整数表达式 )
device_num( 整数表达式 )
device_type( 设备类型列表 )

14. update导语

C/C++:
#pragma acc update 子语列表  换行
Fortran:
!$acc update 子语列表
update的子语:
async[(整数表达式)]
wait[(整数表达式列表)]
device_type(设备类型列表)
if(条件)
if_present
self(变量列表)
host(变量列表)
device(变量列表)

15. routine导语

C/C++:
#pragma acc routine 子语列表 换行
#pragma acc routine(名字) 子语列表 换行
Fortran:
!$acc routine 子语列表
!$acc routine(名字) 子语列表
set的子语:
gang
worker
vector
seq
bind(名字)
bind(字符串)
device_type(设备类型列表)
nohost

16. wait导语

C/C++:
#pragma acc wait [(整数表达式列表)] 子语列表 换行
Fortran:
!$acc wait [(整数表达式列表)] 子语列表
wait的子语:
async [( 整数表达式)]
时间: 2024-10-24 21:46:02

《OpenACC并行编程实战》—— 2.2 OpenACC 2.5规范的相关文章

《OpenACC并行编程实战》—— 1.2 并行编程语言

1.2 并行编程语言 在并行计算发展史上出现过多种并行编程语言,至今仍在使用的只剩几种, 它们各有特色. (1)Pthreads 20世纪70年代,贝尔实验室发明了UNIX,并于20世纪80年代向美国各大高校分发V7版的源码以做研究.加利福尼亚大学伯克利分校在V7的基础上开发了BSD UNIX.后来很多商业厂家意识到UNIX的价值也纷纷以贝尔实验室的System V或BSD为基础来开发自己的UNIX,较著名的有Sun OS.AIX.VMS.随着操作系统的增多,应用程序的适配性工作越来越繁重.为了

《OpenACC并行编程实战》—— 导读

前 言     2010年以来,中国超级计算机建设突飞猛进,欣欣向荣.一个原因是国力强盛,大力投资高新科技:另一个原因是整体科技水平提高,需求旺盛.天气预报.石油物探.工程仿真.基因测序等传统应用对计算资源的需求持续增长,以深度学习为代表的人工智能大爆发,资金雄厚的互联网公司对计算能力极度渴求.超级计算机的建设.应用主战场正在从教育科研单位转向科技企业. 本书特色     笔者学习超算技术时有过苦泪:教材一上来就讲技术细节,只能机械地学习,不清楚这些算法.语法要解决什么问题,花费巨大精力后却发现

《OpenACC并行编程实战》—— 第1章 并行编程概览 1.1 加速器产品

第1章 并行编程概览 对绝大多数人而言,编程语言只是一个工具,讲究简单高效.科学家的主要精力应该用在科研创新活动上,编程工作仅仅是用来验证创新的理论,编程水平再高也不可能获得诺贝尔奖.对学生和企业程序员而言,技术无穷尽,永远学不完,不用即忘,应该认清技术发展方向,学习有前途的技术,不浪费青春年华. OpenACC语言专为超级计算机设计,因此读者需要了解超级计算机的技术演进方向,特别是主流加速器的体系架构.编程模型,看清OpenACC的应用场景,有的放矢.普通读者虽然不会用到大型机群,但小型机群甚

《OpenACC并行编程实战》—— 第2章 OpenACC概览 2.1 OpenACC规范的内容

第2章 OpenACC概览 2007年出现的CUDA C/C++语言引爆了GPU通用计算热潮,但编程比较麻烦,挖掘硬件性能需要很多高超的优化技巧.为了降低编程门槛,2011年11月,Cray.PGI.CAPS和英伟达4家公司联合推出OpenACC 1.0编程标准,2012年3月PGI率先推出支持OpenACC的编译器PGI Accelerator with OpenACC.PGI公司创立于1989年,是一家在高性能计算领域很有名望的编译器和工具供应商,属于意法半导体旗下的全资子公司.2013年6

《OpenACC并行编程实战》—— 3.3 计算构件kernels

3.3 计算构件kernels OpenACC有两个计算构件(Compute Construct):parallel和kernels,用来将循环并行化.两个构件的目标是一样的,但行为有较大的区别.初学者应优先使用简单的kernels构件,熟练以后可以使用parallel构件,众多的子语还能够精细控制并行化方案.想象这样一些场景:刚接触OpenACC,细节了解不多,想尽快上手体验下效果:虽然了解精细的调优技术,但是要在有限的时间内改造一个大程序,因此不再追求最优性能,希望编译器能够自动选择一些参数

《OpenACC并行编程实战》—— 第3章 OpenACC计算构件 3.1 条件编译

第3章 OpenACC计算构件 程序的加速效果来自于对计算部分的并行化.本章重点介绍计算并行化所用的3个构件:kernels.loop和parallel,以及几个重要的子语.编译器将串行循环映射成并行线程的方式多种多样,需要仔细观察几种常用循环的并行化方式,掌握映射规律.为了演示计算构件的语法和加速效果,3.7节移植常用的Jacobi迭代.特别提醒:用OpenACC并行化程序的过程中,可能不会立即有加速效果,甚至计算并行化反而使整体运行时间延长.这是正常现象,增加的时间是主机与设备之间的数据传输

《OpenACC并行编程实战》—— 1.3 CUDA C

1.3 CUDA C 本节简要介绍CUDA C编程的相关概念,使读者能够看懂OpenACC编译过程中出现的CUDA内置变量,理解并行线程的组织方式.如果读者已有CUDA编程经验,请跳过. CPU用得好好的,为什么要费心费力地改写程序去到GPU上运行呢?只有一个理由:跑得更快.小幅的性能提升吸引力不够,必须有大幅提升才值得采购新设备.学习新工具.设计新算法.从图1.19可以看出,在双精度浮点峰值和内存带宽这两个关键指标上,GPU的性能都达到同时期主力型号CPU的5-7倍.如果利用得当,可以预期获得

OpenACC并行编程实战》—— 3.4 loop构件

3.4 loop构件 kernels构件让编译器自动分析代码,挖掘代码里的并行性,并实施并行化.但是,编译器毕竟只是个软件,不会知道程序员的真实意图.若想更准确高效地指导编译器的并行化工作,程序员可以使用loop导语.该导语能告诉编译器哪些循环需要并行化,以及用什么方式并行化. loop导语可用在kernels构件内,也可以用在parallel构件内.本节会具体讲解loop导语在两种计算构件中的行为,读完3.5节后读者会豁然开朗. loop导语作用于紧跟该导语的一个循环.loop导语可以描述执行

《OpenACC并行编程实战》—— 3.5 计算构件parallel

3.5 计算构件parallel OpenACC中的计算构件有两个,一个是前面介绍的kernels构件,一个就是这里要介绍的parallel构件.两个计算构件的作用都是将循环并行化,但有一些重要区别.本节将结合一些例子详细对比介绍.parallel这个基本构件开启加速器设备上的并行执行. 在C和C++中,parallel导语的语法是: #pragma acc parallel [子语列表] 换行 结构块 在Fortran中的语法是: !$acc parallel [子语列表] 结构块 !$acc

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

3.2 导语格式 OpenACC的绝大部分功能都是以导语的形式实现,导语有一个基本格式,这个格式简单易学.本书中关于OpenACC语法的描述,都会引用官方标准<The OpenACC Application Programming Interface Version 2.5>,不易懂的地方会追加解释.在C/C++中,使用#pragma预处理机制指定OpenACC导语,语法是:#pragma acc 导语名字 [子语列表] 换行每个导语都以#pragma acc开始.导语的其他部分都遵守C/C+