本章节翻译by chenchensmail@163.com 原文:OpenMP Directives (intel.com)
Intel® 编译器, icx
、 icpx
和 ifx
支持各种 OpenMP 指令,用于控制计算的部署 和数据映射到设备。这些包括:
-
target
-
teams
-
distribute
-
target data
-
target enter data
-
target exit data
-
target update
-
declare target
-
dispatch
target
构造指定代码的特定部分在设备上执行, 以及如何将数据映射到设备。
teams
构造创建多个线程组,每个组 由一个主线程和多个工作线程组成。 如果 teams
没有指定 num_teams
子句, 则团队数量由实现定义。
distribute
构造将循环的迭代分配给各个团队的主线程, 因此每个主线程执行迭代的子集。
target data
构造将变量映射到设备数据环境。 根据任何 map
子句,变量在 target data
区域的范围内进行映射。
target enter data
指令指定变量映射到设备。 使用此指令时, map
子句中指定的映射类型 必须为 to
或 alloc
。
target exit data
指令指定变量从设备上 unmapped
。 使用此指令时, map
子句中指定的映射类型必须为 from
, release
或 delete
。
target update
指令根据指定的 motion 子句 使设备上变量的值与其原始主机变量一致。
declare target
指令指定变量、函数 (C、C++ 和 Fortran )和子程序( Fortran )映射到设备。
declare variant
指令声明基础函数的专用变体, 并指定使用该专用变体的上下文。
dispatch
构造控制给定函数调用是否发生变体替换。
map
子句确定原始主机变量如何映射 到设备上的相应变量。映射类型包括:
-
to
:在进入target
区域时,原始主机变量的值被复制到设备上。
-
from
:在退出target
区域时,设备上的变量值从设备复制到原始主机变量。
-
tofrom
:在进入target
区域时,原始主机变量的值被复制到设备上, 并在退出
target
区域时复制回主机。 -
alloc
:在设备上分配原始主机变量的未初始化副本(值不从主机复制到设备)。
指令可以组合。例如,可以使用以下组合指令:
-
target teams
-
target teams distribute
-
target teams distribute parallel for
-
target teams distribute parallel for simd
建议尽可能使用组合指令, 因为它们允许编译器和 runtime 决定如何最好地将部署循环的迭代划分 以便在 GPU 上执行。