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-2.0-specification

 有一些标准的 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 的源代码中指定。

后续略...

posted @ 2023-05-18 16:51  lixycc  阅读(242)  评论(0)    收藏  举报