用OpenCL开发嵌入式混合代码
近几年来,处理器从最求高性能转向追求多内核。这种改变主要是由于量子效应(quantum effects)的作用难以实现高性能和低功耗的兼得,因而需要加速开发新的软件技术。这些技术属于通用运算块,不但可应用于异构多核CPU,还可以应用于图形加速器、数字信号处理器(DSP)以及现场可编程门阵列(FPGA),以加速算法,应对日益提高的运算性能要求。
OpenCL由苹果公司提议开发,得到Khronos Group的维护,其开发目的是提供便携式开放编程架构,这使得软件可并行利用多核CPU和专用处理内核,特别是图形处理器可实现并行处理非图形处理。
OpenCL与OpenGL类似,也就是都可实现利用不可知设备开放标准以创建自定义实现。在设计上OpenCL可与OpenGL一同工作,也就是可共享架构数据,使用OpenCL完成的数据,接着可使用OpenGL显示。OpenCL标准由2008年成立的工作组开发,Nvidia主持工作,Apple参与编辑。从那以后,OpenCL标准向后兼容的修订版本经过一系列可用于验证一致性的一致性测试完成发布。
OpenCL对现有处理器的一致性实现主要适用于芯片供应商(Altera, AMD, ARM, Freescale, Imagination Technologies, Intel, Nvidia, 德州仪器,赛灵思等)。 为加速运行OpenCL架构,需要使用针对这些供应商的OpenCL驱动器。
OpenCL与Nvidia的CUDA,Stanford的Brookand和微软DirectCompute类似。 与这些语言相比,OpenCL具有开放、便携、低端、与硬件较适应的特点,但在一定程度上较难使用。这主要是因为OpenCL用于支持异构内核并行处理的便携式硬件抽象层。
OpenCL还形成基于带有其他功能的C99子集的语言,可支持两种不同的并行处理模式,即任务并行和数据并行。
任务并行是嵌入式模式,最为工程师所熟悉。任务并行一般利用多线程OS实现,以便于不同的线程可同时运行。在线程需要访问共享资源时,可利用互斥器、信号或其他各类的锁定机制。 OpenCL支持这种程序模式,但这并不是其强大功能。
数据并行可应用于使用跨数据集进行同一操作的算法。在数据并行模式中,一种运行如框过滤器具有并行性,这样同一微算法可并行运行多次,但这种算法的各项实例化可在其自身的数据子集上运行——这样实现了数据并行。这是最适于OpenCL支持的程序模式。OpenCL的五种兼容交叉模式有助于解释这些概念。这些模式是架构、平台、执行、内存和程序。
OpenCL架构包括平台层、运行时间和编译器。平台允许主程序查询可用设备,创建前后关系。运行时间允许主程序操纵前后关系。编译器创建可执行程序并基于带有一些其他语言功能的C99子集以支持并行程序。为向芯片供应商提供OpenCL一致性,需要提供启动架构运行的OpenCL驱动器。
通过连接一个或多个器件的主机定义平台,如GPU。各器件被分为一个或多个的运算单元,如内核。各运算单元被分为一个或多个处理元件。
OpenCL程序执行发生在两处:在器件上执行的内核,最常见的是GPU,以及在主机器件上执行的主机程序,最常见的是CPU。
要了解执行模式,最好先了解内核如何运行。主机计划执行内核时,需要定义索引空间。内核实例(工作项)执行这个索引空间的各个项目。
在OpenCL中,索引空间被表示为NDRange。NDRange是一维、二维、或三维索引空间。NDRange的图形表示如图1。主机定义内核使用的前后关系。前后关系包括器件表、内核、源代码和内存对象。通过主机产生和维护前后关系。另外,主机利用叫作命令队列的OpenCL API创建数据结构。主机通过命令队列安排内核在器件上运行。
图 1 NDRange的图形表示
可在命令队列上放置的命令包括内核执行命令、内存管理命令和同步命令。同步命令用于限制其他命令的执行顺序。通过在OpenCL命令队列放置命令,运行时间可在系统内处理在器件并行完成的命令。
执行内核的工作项目可访问下列内存:
• 全局内存——适用于所有工作组的所有工作项目。
• 常量内存——由主机初始化,在整个内核寿命中内存保持为常量。
• 本地内存——由工作组共享的内存。
• 私有内存——单个工作项目私有的内存。
正如上文所述,OpenCL主要支持两种程序模式:数据并行,即各处理器在分布式数据的不同条目上执行同一任务;任务并行,即在共同的数据集上执行多个任务。在各类并行程序中,运行中并行线程同步被视为首选。OpenCL为并行处理间的同步控制提供三种方式。第一种方式是在索引空间内创建以限制某个工作项目以便使工作项目按顺序运行。第二种方式是在命令队列内建障碍以限制命令顺序。第三种方式是在命令队列内创建由命令生成的事件。这些事件的运行可强制顺序操作。
例如使用工具OpenCL特别适用于图像/视频编辑应用程序, AI 系统,模型架构,游戏物理,电影渲染,和增强现实。但主要在嵌入式移动器件中还设置了为OpenCL标准定义的嵌入式配置文件,包括整个OpenCL标准的子集。OpenCL嵌入式配置文件包括以下几个亮点:
• 64位整数(可选)
• 3D图形支持(可选)
• 为浮点计算放宽估算规则
• 提高嵌入式器件转换的准确度
• 内置原子函数(可选)
展望未来,OpenCL路线图包括几项计划,以提高OpenCL至下一个相关程度。
高级模式(OpenCL-HLM):OpenCL目前正探索通过语言构件整合器件和主机执行环境,以便提高OpenCL的易用性。如果实现这项计划,OpenCL的应用将更加广泛。
长期重要路线图:OpenCL正不断探索加强内存和执行模式的方式,以利用不断更新的硬件功能。另外,OpenCL正不断努力利用经优化的同步工具,使并行程序模式在 OpenCL 运行得更加强健。
WebCL: OpenCL的愿景是通过Java脚本绑定件进行并行运算。
标准并行中间表示(OpenCL-SPIR):OpenCL计划摆脱创建编译器和语言绑定件的业务。创建标准化中间表示,可通过不属于OpenCL内核团队的工程师将OpenCL绑定至新语言,这样可扩大OpenCL的应用范围,并使得OpenCL中间表示成为现在乃至未来编译器的目标。
OpenCL前景光明,但仍面临着许多问题亟待解决,工作组的当前计划已经解决了其中的很多问题。在下一个运算阶段,我们预测处理内核将会剧增,包括异构CPU和异构CPU/GPU,我们仍将需要成熟软件架构,这有助于使我们利用所有硬件运算功能,将其应用于我们的系统。在这种大趋势下,OpenCL被坚持定位为开放、自由、成熟的标准,得到行业支持,并将拥有光明的未来。
- 嵌入式软件设计中查找缺陷的几个技巧(03-06)
- DSP HPI口与PC104总线接口的FPGA设计(04-14)
- Linux 2.4.x内核软中断机制(04-06)
- 多核DSP Bootload代码加载方法研究(06-11)
- 设计基于NXP LPC2000的次级启动加载程序用于代码升级(04-04)
- 嵌入式软件代码保护系统设计(05-08)