本节书摘来自华章出版社《OpenACC并行编程实战》一 书中的第2章,第2.2节,作者何沧平,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
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 [( 整数表达式)]