OpenCL Support(译文)
原文链接:OpenCL Support
一、概述
Clang 完全支持从 1.0 到 3.0 的 OpenCL(C版本)。目前对 OpenCL 3.0的支持处于实验阶段(OpenCL 3.0)。
Clang 还支持 C++ for OpenCL内核语言,以及其他新的和实验性的功能。
有关 clang 在 OpenCL 中的使用的详细信息,请参阅 clang编译器用户手册。
二、功能缺失或支持有限
关于 clang 中 OpenCL 的一般问题和 bug,请参阅 GitHub 问题列表。
命令行标志 -cl-ext(用于覆盖目标支持的扩展/功能)缺少对某些功能的支持,即完全通过库实现的功能(请参阅基于库的功能和扩展)。
三、内部手册
本节作为 OpenCL 功能设计以及一些重要实现方面的内部文档。它主要针对高级用户和将前端功能集成为组件的工具链开发人员。
1、OpenCL Metadata(元数据)
Clang 使用元数据在IR中提供后台和OpenCL运行时所需的额外OpenCL语义。每个内核都将附加函数元数据,指定参数。内核参数元数据用于为运行时的查询提供源代码级别的信息,例如使用 clGetKernelArgInfo 调用。
请注意,-cl-kernel-arg-info 可以添加更多关于原始内核代码的信息,例如内核参数名称将与其他信息一起出现在 OpenCL 元数据中。
在参数信息元数据中用于编码 OpenCL 逻辑地址空间的 IDs 遵循SPIR规范第2.2节中定义的SPIR地址空间映射。
2、OpenCL 特定选项
除了 Clang 编译器用户手册中描述的选项外,还有以下特定于 OpenCL 前端的选项。本节中的所有选项都仅限前端,因此,如果与常规 clang 驱动程序一起使用,则需要前端转发,例如
-cc1或-Xclang。
(1) -finclude-default-header
在编译期间添加大多数内置类型和函数声明。默认情况下,前端不会加载 OpenCL 标头,因此不会声明某些内置类型和大多数内置函数。要自动加载它们,可以将此标志传递到前端(另请参阅 OpenCL 标头部分):
clang -Xclang -finclude-default-header test.cl
或者,可以使用 -include 或 -I 手动包含包含声明的内部标头 opencl-c.h,后跟标头位置的路径。标头可以在 clang 源代码树或安装目录中找到。
$ clang -I<path to clang sources>/lib/Headers/opencl-c.h test.cl
$ clang -I<path to clang installation>/lib/clang/<llvm version>/include/opencl-c.h/opencl-c.h test.cl
在这个例子中,假设内核代码包含 #include<opencl-c.h>,就像一个常规的 c include 一样。由于标头非常大且很长,因此可以在内部使用 PCH(预编译标头和模块内部)和模块(模块)来提高编译速度。
要为 OpenCL 启用模块,请执行以下操作:
$ clang --target=spir-unknown-unknown -c -emit-llvm -Xclang -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=<path to the generated module> test.cl
避免 OpenCL 内置声明解析延迟过长的另一种方法是使用 -fdeclare-OpenCL 内置标志启用的机制,该机制可作为替代功能使用。
(2) -fdeclare-opencl-builtins
除了使用 -finclude-default-header 包含内置类型和函数的常规标头外,clang 还支持使用 -fdeclare-opencl-builtins 声明内置函数的快速机制。这并没有声明内置类型,因此如果需要完整的功能,它必须与 -finclude-default-header 结合使用。
Example of Use:
$ clang -Xclang -fdeclare-opencl-builtins test.cl
(3) -ffake-address-space-map
使用伪映射(fake map)覆盖目标地址空间映射。这允许将显式地址空间 ID 添加到非分段存储器架构的位代码中,这些非分段存储器体系结构默认情况下没有每个 OpenCL 逻辑地址空间的单独 ID。传递 -ffake-address-space-map 将添加/覆盖使用以下值编译的目标的地址空间:1-全局(global)、2-常量(constant)、3-本地(local)、4-泛型(generic)。在 IR 中不包含地址空间属性表示私有地址空间(private)(另请参阅地址空间属性部分)。
$ clang -cc1 -ffake-address-space-map test.cl
3、Opencl builtins
(1) Calng builtins
有一些标准的 OpenCL 函数被实现为 Clang 内置函数:
- OpenCL v2.0 内核语言规范第6.13.16.2/6.13.16.3节中的所有管道函数。
- 地址空间限定符转换函数为第6.13.9节中的
to_global/to_local/to_private。 - 第6.13.17.1节中的所有
enqueue_kernel函数和第6.13.17.5节中的入队查询函数。
(2) Fast builtin function declarations
快速内置函数声明的实现(可通过 -fdecare-opencl-builtins 选项获得)由以下主要组件组成:
- TableGen 定义文件 OpenCLBuiltins.td。它包含支持的内置函数的紧凑表示。当添加新的内置函数声明时,这通常是唯一需要修改的文件。
- 在 ClangOpenCLBuiltinEmitter.cpp 中定义的 Clang TableGen 发射器。在 Clang 生成期间,发射器读取 TableGen 定义文件并生成 OpenCLBuildins.inc。此生成的文件包含各种表和函数,这些表和函数以紧凑的方式从 TableGen 的定义中捕获内置函数数据。
- SemaLookup.cpp 中特定于 OpenCL 的代码。当 Sema::LookupBuiltin 遇到潜在的内置函数时,它将检查该名称是否对应于有效的 OpenCL 内置函数。如果是这样,则使用 InsertOCLBuiltinDeclarationsFromTable 插入函数的所有重载,并进行重载解析。
4、OpenCL 扩展和功能
略
5、地址空间属性
Clang 使用 address_space(N)属性支持任意地址空间,其中 N 是Clang 源代码中指定范围内的整数。该地址空间可以与 OpenCL 地址空间一起使用,但是当这些地址空间转换为 OpenCL 地址空间,或 从 OpenCL 地址空格转换时回来时,行为不受 OpenCL 规范的约束。
OpenCL 实现提供了一个使用关键字的标准地址空间列表:private、local、global 和 generic。在 AST 和 IR 中,每个地址空间将由 Clang 源代码中提供的唯一数字表示。地址空间的特定 ID 不必在 AST 和 IR 之间匹配。通常,在 AST 地址空间中,数字表示逻辑段,而在 IR 中,数字代表物理段。因此,具有扁平内存段(flat)的机器可以在生成 IR 时将所有 AST 地址空间编号映射到相同的物理段 ID 或完全跳过地址空间属性。然而,如果 IR passes 需要地址空间信息,例如为了改进别名分析,建议将其保持较低,以反映后期 machine passes 中的物理内存段。逻辑地址空间和目标地址空间之间的映射在 Clang 的源代码中指定。
后续略...

浙公网安备 33010602011771号