本章节翻译by chenchensmail@163.com 原文:Compiling and Running an OpenMP Application (intel.com)
使用以下编译器选项启用 OpenMP 部署到 Intel® GPU。 这些选项适用于 C/C++ 和 Fortran。
-fiopenmp -fopenmp-targets=spir64
默认情况下,Intel® 编译器将程序转换为中间语言表示 SPIR-V, 并将其存储在编译过程生成的二进制文件中。 该代码可以通过在 runtime 中将 SPIR-V 代码 转换为平台的汇编代码以便在任何硬件平台上运行。 这个过程被称为即时 (JIT) 编译。
要启用编译器优化报告的输出,请添加以下选项:
-qopt-report=3 -O3
Note:
-
-qopenmp
编译器选项相当于-fiopenmp
,并且 这两个选项可以互换使用。
提前 (AOT) 编译
用于 Intel® 数据中心 Max 系列GPU的提前 (AOT) 编译, 你需要指定一个额外的编译器选项 (-Xs
), 如下所示。 此选项适用于 C/C++ 和 Fortran。
-fiopenmp -fopenmp-targets=spir64_gen -Xs "-device 0x0BD5 -revision_id 0x2f"
OpenMP Runtime 例程
以下是一些与设备相关的 runtime 例程:
omp_target_alloc omp_target_free omp_target_memcpy
Intel® 编译器支持以下 runtime 例程 作为 Intel® 拓展:
omp_target_alloc_host omp_target_alloc_device omp_target_alloc_shared
可以使用上面的 Intel® 拓展调用 omp_target_free
来释放分配的内存。
有关 icx
、 icpx
和 ifx
编译器中支持的 OpenMP 功能列表, 请参阅:
-
OpenMP Features and Extensions Supported in Intel® oneAPI DPC++/C++ Compiler
-
Fortran Language and OpenMP Features Implemented in Intel® Fortran Compiler
环境变量
以下是一些对于调试有用或提高程序的性能 的环境变量。
有关环境变量的更多信息,请参阅:
LIBOMPTARGET_DEBUG=1
启用显示来自 libomptarget.so 的调试信息。
LIBOMPTARGET_DEVICES=<DeviceKind>
控制子设备向用户公开的方式。
<DeviceKind> := DEVICE | SUBDEVICE | SUBSUBDEVICE | device | subdevice | subsubdevice
DEVICE/device
: 仅最上层设备被报告为 OpenMP 设备, 并支持 subdevice
子句。
SUBDEVICE/subdevice
: 仅第一级子设备被报告为 OpenMP 设备, 并忽略 subdevice
子句。
SUBSUBDEVICE/subsubdevice
: 仅第二级子设备被报告为 OpenMP 设备, 并忽略 subdevice
子句。 在使用 Level Zero 后端的 Intel® GPU 上, 将 subsubdevice 限制为堆栈内的单个计算 slice 还需要设置额外的 GPU 计算 runtime 环境变量 CFESingleSliceDispatchCCSMode=1
。
默认值为 <DeviceKind>=device
LIBOMPTARGET_INFO=<Num>
允许用户从 libomptarget 请求不同类型的 runtime 信息。 详细信息请参见:
LLVM/OpenMP Runtimes — LLVM/OpenMP 19.0.0git documentation
LIBOMPTARGET_LEVEL0_MEMORY_POOL=<Option>
控制如何配置可重用内存池。
<Option> := 0 | <PoolInfoList> <PoolInfoList> := <PoolInfo>[,<PoolInfoList>] <PoolInfo> := <MemType>[,<AllocMax>[,<Capacity>[,<PoolSize>]]] <MemType> := all | device | host | shared <AllocMax> := positive integer or empty, max allocation size in MB <Capacity> := positive integer or empty, number of allocations from a single block <PoolSize> := positive integer or empty, max pool size in MB
pool 是一个内存块列表,可以从单个块中 提供至少 <Capacity>
个最大为 <AllocMax>
大小的分配, 总大小不超过 <PoolSize>
。
LIBOMPTARGET_LEVEL0_STAGING_BUFFER_SIZE=<Num>
将暂存 buffer 大小设置为 <Num>
KB。 暂存 buffer 用于优化在主机内存不是统一共享内存 (USM) 时 主机和设备之间的拷贝操作。暂存 buffer 仅用于独立设备。 默认的暂存 buffer 大小为 16 KB。
LIBOMPTARGET_LEVEL_ZERO_COMMAND_BATCH=copy
启用 target
区域中数据传输的命令批处理。
如果在 target
构造上有 map(to: )
子句, 则此环境变量允许多个数据从主机到设备同时传输。 同样,如果在 target
构造上有 map(from: )
子句, 则此环境变量允许多个数据从设备到主机同时传输。 请注意, map(tofrom: )
或 map( )
将被拆分为 map(to: )
和 map(from: )
。
LIBOMPTARGET_LEVEL_ZERO_USE_IMMEDIATE_COMMAND_LIST=<Bool>
启用/禁用使用即时命令列表进行 kernel 提交。
<Bool> := 1 | T | t | 0 | F | f
默认情况下,禁用使用即时命令列表。
LIBOMPTARGET_PLUGIN=<Name>
指定要使用的部署插件名称。
<Name> := LEVEL0 | OPENCL | X86_64 | level0 | opencl | x86_64
默认情况下,卸载插件为 LEVEL0。
LIBOMPTARGET_PLUGIN_PROFILE=<Enable>[,<Unit>]
启用基本插件分析并在程序结束时显示结果。
<Enable> := 1 | T <Unit> := usec | unit_usec
默认情况下,插件分析被禁用。
如果未指定 <Unit>
,默认单位是微秒(usec
)。
LIBOMPTARGET_PROFILE=<FileName>
允许 libomptarget.so 生成类似于 Clang 的 -ftime-trace
选项的时间分析输出。
OMP_TARGET_OFFLOAD=MANDATORY
指定如果遇到设备构造或设备内存例程 且设备不可用或不受实现支持, 则终止程序执行。
控制隐式和显式缩放的环境变量
要禁用隐式缩放并仅使用一个 GPU 堆栈,请设置: ZE_AFFINITY_MASK=0.0
要启用显式缩放,请设置: LIBOMPTARGET_DEVICES=subdevice
在 Intel® 数据中心 GPU Max 系列上,默认启用隐式缩放。
SYCL 的环境变量
有几个 SYCL_PI_LEVEL_ZERO
环境变量 对于开发和调试 SYCL 程序(不仅仅是 OpenMP )非常有用。 它们在以下链接记录:
参考文献
-
OpenMP Features and Extensions Supported in Intel® oneAPI DPC++/C++ Compiler
-
Fortran Language and OpenMP Features Implemented in Intel® Fortran Compiler
-
Intel® oneAPI DPC++/C++ Compiler Developer Guide and Reference - Supported Environment Variables
-
Environment variables that effect DPC++ compiler and runtime