OpenCL 通用编程与优化(3)
3.3 在图形和计算工作负载之间的上下文切换
3.3.1上下文开关
如果在AdrenoGPU上运行低优先级工作负载时,需要图形用户界面(UI)渲染,后者可能被迫暂停,以便GPU切换到高优先级工作负载。完成高优先级任务后,低优先任务恢复。这种类型的工作负载切换称为上下文切换。上下文交换机通常很昂贵,因为它需要复杂的硬件和软件操作。然而,它是一个重要的特性,使新兴的和先进的时间关键任务,如汽车应用。
3.3.2在GPU上限制内核/工作组的执行时间
有时,计算内核可能运行过多的时间,并触发警报,导致GPU重置,并导致不可预测的后果。通常,安卓设备上的UI呈现以固定的频率进行,例如,每30毫秒进行一次。长时间运行的计算内核可能会导致UI延迟和失去响应,从而损害用户体验。根据经验法则,内核的执行时间应该是几十毫秒。
3.4 支持OpenCL标准特性
Adreno A3x图形处理器支持OpenCL 1.1嵌入式配置文件,而Adreno A4x图形处理器支持OpenCL 1.2完整配置文件,而Adreno A5x和A6x图形处理器支持OpenCL 2.0完整配置文件。从OpenCL 1.1嵌入式配置文件到OpenCL 1.2完整配置文件,大部分更改都是在软件而不是硬件上,比如改进的API函数。
然而,从OpenCL 1.2完整配置文件到OpenCL 2.0完整配置文件,还引入了许多新的硬件特性,如共享虚拟内存(SVM)、内核队列内核(KEK)等。表3-2列出了在Adrenogpu上对OpenCL配置文件支持的主要差异。
表3-2在Adrenogpu上支持的标准OpenCL特性
Features | OpenCL 1.1 embeddedAdreno A3x | OpenCL 1.2 full Adreno A4x | OpenCL 2.0 full Adreno A5x, A6x; OpenCL 3.0 in A7x and above |
---|---|---|---|
Separate compilation and linking of objects | No | Yes | Yes |
Rounding mode | Rounding to zero | Rounding to nearest even | Rounding to nearest even |
Built-in kernels | No | Yes | Yes |
1D texture, 1D/2D image array | No | Yes | Yes |
Shared virtual memory | No | No | Yes (coarse grain only) |
Pipe | No | No | Yes |
Load-store image | No | No | Yes |
Nested parallelism | No | No | Yes |
Kernel-enqueue-kernel (KEK) | No | No | Yes |
Generic memory space | No | No | Yes |
C++ atomics | No | No | Yes |
3.5OpenCL2.0的关键特性
3.5.1共享虚拟内存(SVM)
作为OpenCL 2.0中最重要的特性之一,SVM允许开发人员编写代码,以便在主机和设备之间共享复杂的数据结构,如链表或树。在OpenCL 2.0之前,由主机创建的指针可能不会被设备上的内核直接访问,并且与该指针相关联的数据也不能被共享。
通过在OpenCL 2.0中对SVM的支持,主机和设备可以共享指针和可能包含指针的复杂数据结构。此外,OpenCL 2.0中的SVM还定义了内存一致性模型,以便主机和内核可以使用原子学进行同步而相互交互。这允许开发人员以最小的同步成本在设备和主机之间编写高度交互式的并行代码。
在OpenCL 2.0之前,主机和设备只能在代码中显式指定的某些点进行同步。
自从AdrenoA5xgpu以来,OpenCL 2.0的完整配置文件已经得到了完全的支持,包括先进的SVM特性,如支持原子的细粒度缓冲区SVM。在该平台上可用的功能上可能会有细微的不同。建议使用API函数clGetDevice CL_DEVICE_SVM_CAPABILITIES CL_DEVICE_SVM_CAPABILITIES来查询平台上可用的确切特性。
在OpenCL 3.0中,SVM通过特性宏机制成为了一个可选的特性,但最新的高级Adrenogpu继续支持它。
3.5.2 OpenCL内核排队内核(KEK)
KEK特性允许内核中的工作项,即父内核,可以排队使用一个子内核,而不使用CPU主机。此功能可帮助前期不知道且仅在运行时可用的工作负载。一个工作项可以根据运行时的结果有条件地排队排列另一个内核。一个典型的用例可以是K-means集群。
AdrenoGPU在没有GPU将信息传递给CPU主机的情况下实现了KEK特性,从而节省了通信开销。在Adrenogpu中,子内核在父内核完成后不会开始执行,尽管OpenCL标准允许子内核在不等待父内核完成的情况下执行。
3.6 OpenCL3.0的关键特性
Khronos集团已经正式发布了OpenCL 3.0标准。最明显的变化是许多必需的,而以前的OpenCL标准中的强制性特性将成为可选的。这一机制背后的动机是为了改善OpenCL生态系统的基础和影响。通过降低通过OpenCL一致性的标准,许多设备,如嵌入式设备、FPGA和其他专用硬件,可以被认证为OpenCL 3.0一致性,而不支持一些高复杂度的特性(如浮点算法、共享虚拟内存、KEK等)。
从A7x开始,Adrenogpu将支持OpenCL 3.0。理想情况下,开发人员应该能够运行他们的OpenCL1。x和2。在支持OpenCL 3.0的Adrenogpu上运行x应用程序。
3.6.1功能宏
OpenCL 3.0引入了一种名为特性宏的机制。它是将旧版本中的大多数标准特性分类为不同的特性集,开发人员需要在使用它们之前查询是否支持这些特性。查询功能的正确性和代码的可移植性是很重要的。
3.6.2向后兼容性
为3.0以上版本开发的OpenCL应用程序应该可以在不进行更改的情况下工作,因为向后兼容性通常是有保证的。然而,开发人员应该开始针对最新的OpenCL 3.0版本编写代码,以获得长期更好的支持。