OpenCL简介
2 OpenCL简介
本章讨论了OpenCL标准的关键概念,并试图传达OpenCL在移动平台上进行应用程序开发的基本知识。
2.1 OpenCL背景和概述
OpenCL由Khronos集团开发和维护,是一种开放式,免版税的标准,适用于异构系统中的跨平台并行编程。 它的设计方式可帮助开发人员利用现代异构系统中可用的海量计算能力,并极大地促进跨平台的应用程序开发。
Snapdragon平台上的Qualcomm®Adreno TM GPU系列是最早完全支持OpenCL的移动GPU之一。
图2-1显示了支持OpenCL的典型异构系统。 在此系统中,主要包括三个部分:
- 主机CPU本质上是管理和控制应用程序的命令程序/主设备。
- 多个OpenCL设备,包括GPU,DSP,FPGA和硬件加速器。
- 内核代码,这些代码由主机编译并加载到OpenCL设备中以执行。
2.2 移动端的OpenCL
近年来,移动片上系统(SOC)在计算能力,复杂性和功能方面取得了显着进步。 移动SOC(移动GPU)中的GPU非常强大,就原始计算能力而言,一些顶级移动GPU达到了控制台/离散GPU的水平。
这给开发人员带来了挑战:如何在不了解GPU底层细节的情况下有效利用计算能力并快速开发应用程序,同时保持不同SOC之间的应用程序兼容性?
为解决这些问题而创建的OpenCL凭借其跨平台支持,使开发人员可以轻松利用移动SOC的计算能力。 通过使用OpenCL,移动SOC可以轻松地在许多领域启用高级用例,例如图像/视频处理,计算机视觉,机器学习等。
在QTI中,使用带有Adreno GPU的OpenCL已成功加速了许多用例,这些案例展示了出色的性能,功能和可移植性。 强烈建议将OpenCL与GPU一起使用,以加速其在Snapdragon SOC上的应用。
2.3 OpenCL标准
OpenCL标准主要包含两个组件,即OpenCL运行时API和OpenCL C语言。 该API定义了一组在主机上运行的用于资源管理,内核分发和许多其他任务的功能,而OpenCL C语言用于编写在OpenCL设备上执行的内核。 以下各节将回顾OpenCL API和OpenCL C语言。
2.3.1 OpenCL API函数
OpenCL API函数可以分为两类,平台层和运行时。 表2-1和表2-2分别总结了平台层和运行时层的高级功能。
2.3.2 OpenCL C语言
作为C99标准的子集,OpenCL C语言用于编写可在设备上编译和执行的内核。 具有C语言编程经验的开发人员可以轻松地开始使用OpenCL C编程。 但是,至关重要的是要了解C99标准和OpenCL C语言之间的差异,以避免常见的错误。
这是两个主要区别:
- 由于硬件限制和OpenCL执行模型,OpenCL C语言不支持C99中的某些功能。 示例包括函数指针和动态内存分配(malloc / calloc等)。
- OpenCL C语言在多个方面扩展了C99标准,以便它可以更好地服务于其编程模型并促进开发,例如:
-它添加了内置函数来查询OpenCL内核执行参数。
-has它具有可以利用GPU硬件的图像加载/存储功能。
2.3.3 OpenCL版本和配置文件
当前具有临时SPIR-V 1.2标准的OpenCL v2.2包含许多改进的功能。
OpenCL定义了两个配置文件,即嵌入式配置文件和完整配置文件。 嵌入式配置文件主要针对与传统计算设备(例如台式机GPU)相比具有较低精度能力和较少硬件功能的移动设备。
2.4 OpenCL的可移植性和向后兼容性
2.4.1 程序可移植性
作为严格定义的计算标准,OpenCL具有良好的程序可移植性。 如果一个供应商平台编写的OpenCL应用程序未使用任何供应商专有或特定于平台的扩展或功能,则应在其他供应商平台上良好运行。
Khronos的认证计划可确保OpenCL的程序可移植性,该认证程序要求OpenCL供应商在其平台上通过严格的一致性测试,然后再声明其为OpenCL“符合标准”。
2.4.2 性能可移植性
与程序可移植性不同,OpenCL性能通常不可移植。 作为高级计算标准,OpenCL的硬件实现取决于供应商。 不同的硬件供应商具有不同的设备体系结构,并且每个可能都有其优缺点。 结果,为一个供应商的平台编写和优化的OpenCL应用程序的性能不可能与其他供应商的平台相同。
即使对于相同的供应商,其不同世代的GPU硬件在微体系结构和功能上也可能有所不同,这可能导致OpenCL程序的性能明显不同。 结果,为老一代硬件优化的应用程序经常需要进行微调,以充分利用新一代硬件的全部功能。
2.4.3 向后兼容
OpenCL完全具有向后兼容性,以确保对旧代码的投资可以在新版本的OpenCL上运行而不会出现问题。 请注意,由于某些API函数在较新版本中可能已被弃用,因此,如果将OpenCL 1.1或1.2弃用的API与OpenCL 2.x头文件一起使用,则需要定义CL_USE_DEPRECATED_OPENCL_1_1_APIS或CL_USE_DEPRECATED_OPENCL_1_2_APIS。
不保证将OpenCL扩展继承到新设备,因此使用扩展的应用程序需要检查新设备是否支持它们。