热度 17
2012-12-2 20:59
3224 次阅读|
0 个评论
##1 由“ OpenCL 是什么?”想到的…… “OpenCL到底是什么?”。在执笔《日经电子》2008年12月15日号刊登的报道“苹果主导下的‘OpenCL’,为处理器带来自由”期间,同事及上司多次这样询问笔者。虽然笔者自以为随着对OpenCL采访的不断深入,已理解了其内含及意义,但却难以满意地回答这种问题。 万般无奈之下,笔者在报道中这样写道,“简而言之,OpenCL是在异构(Heterogeneous)多处理器平台上将硬件差异抽象化的技术”。对各位读者来说,也许这种表达方式很难理解。惭愧的是,目前还没办法用一句话回答“OpenCL到底是什么?”。笔者在与致力于推进OpenCL标准化的Khronos Group的总裁Neil Trevett见面谈及此事,他苦笑道:“业界人士能马上理解OpenCL的概况及其必要性。但是,要简洁地传达给业界以外的人却很难。我们也为此而头痛”。 既然OpenCL难以简单进行描述,为什么笔者还要予以关注,笔者想借此机会略作介绍。 假设在数字化民用产品上运行的应用软件的开发者,需要根据事先确定的系统结构编写程序。例如,在“该产品上配备A公司的CPU及B公司的DSP”的前提条件下,需要编写A公司的CPU用程序、以及B公司的DSP用程序。还需要规定CPU与DSP之间的通信步骤。 CPU、GPU及DSP等处理器有各自的长处和短处,并具有根据处理器厂商的不同、适合执行某种处理的特点。在上述例子中,本来也许C公司的DSP更适合,或者将部分处理工作交给D公司的GPU,从执行速度及耗电量等方面来看更恰当。但是,改变处理器的种类并非易事。由于根据处理器的厂商及种类不同,程序编写的方法也不同,因此,如果不大幅改写程序,就不能在其他的系统结构下工作。也就是说,不仅是改用不同的处理器很难,确定哪种结构为最佳也很难。按照已确定的系统构造编写程序,就意味着剥夺了选择处理器的自由。 可将软件开发者制作的程序拿到许多厂商推荐的多种处理器上试用,并自由地选择处理器的组合。OpenCL的目的就是提供这样的平台。OpenCL规定了无需修改已制作完成的程序,即可在配备与原系统不同种类处理器的系统上执行的标准API。 参与OpenCL制定工作的某半导体厂商技术人员对笔者表示,明确区分软件开发者与半导体厂商职责范围的分界线就是OpenCL。当时,正值笔者产生了“即使造成此前拥有的客户流失也在所不惜?”的疑问。他的回答是这样的。“这才是健康的竞争环境。在这种竞争环境中,(厂商)会为了得到客户的认可而全力以赴。在半导体产品上精益求精,是我们的天职”。有了OpenCL这种API的分隔,软件开发者及设备厂商将可获得处理器选择的自由,而半导体厂商则可获得处理器开发的自由。 顺便提一下,Khronos Group的Trevett是已开始在手机等领域得到广泛应用的图形处理API“OpenGL ES”的提案人。他表示,“虽然如今OpenGL ES被广泛采用,但从制定性能指标到普及为止花费了4年的时间”。由于性能指标制定后经过了2年半导体才面世,因此OpenGL ES的价值未能得到充分的认识。 Trevett预计,与OpenGL ES面世时不同,OpenCL将会及早得到普及。“再过2个月适用性试验就将开始,预计各公司的处理器也将迅速提供支持。苹果已向我们表示,将在新一代操作系统中提供技术支持。虽然也许难以用语言描述OpenCL,只要能看到实际运行的情形,大家肯定会马上认识到它的价值”(Trevett)。真可谓“百闻不如一见”。 ## 2 Altera的野望 去年11月Altera"悄悄的"发布了Altera面向FPGA的OpenCL计划,内容仅仅是一个网页和一份仅仅8页的白皮书,没有可以实现的工程。内容虽少,但是难掩Alter在可配置计算领域的野心。 OpenCL为何物? OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL由一门用于编写kernels (在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。传统上,OpenCL应用于CPU、GPU等通用设备,在OpenCL 1.2中,提供了对其他设备的支持。 FPGA它极强的可配置性能在很多领域发挥作用。随着工艺的提高,FPGA的功能也越来越强大,可以在某些领域替代CPU、GPU的计算功能。但是传统的FPGA设计极为复杂,不仅设计思路同在CPU、GPU上设计软件完全不同,还需要大量的考虑如约束等非常细节的物理底层问题。因为传统FPGA设计不仅门槛很高,而且设计周期也远长于纯软件设计。如果能把OpenCL标准引入到FPGA中,开发人员利用OpenCL能够自然的描述在FPGA中实现的并行算法,其抽象级要比VHDL或者Verilog等硬件描述语言(HDL)高得多。 OpenCL标准简介 OpenCL应用程序含有两部分。OpenCL主程序是纯软件例程,以标准C/C++编写,可以运行在任何类型的微处理器上。例如,这类处理器可以是FPGA中的嵌入式软核处理器、硬核ARM处理器或者外置x86处理器。如图所示。 在这一主软件例程执行期间的某一点,某一功能有可能需要很大的计算量,这就可以利用并行器件的高度并行加速功能,例如CPU、GPU、FPGA等器件。要加速的功能被称为OpenCL内核。采用标准C编写这些内核。下图中的例子对两个数组a和b进行矢量加法,将结果写回输出数组中。矢量的每一元素都采用了并行线程,当采用像FPGA这类具有大量精细粒度并行单元的器件进行加速时,能够很快的计算出结果。主程序使用标准OpenCL应用程序接口(API),支持将数据传送至FPGA,调用FPGA内核,传回得到的数据。 CPU与GPU的并行性来自于把并行线程在不同的内核中执行,而FPGA是把内核内核功能传送到专用深度流水线硬件电路中,使用流水线并行处理概念,而本质上就是多线程的。这些流水线的每一条都可以复制多次,与一条流水线相比,提供更强的并行处理功能。如图示,可以通过级联功能单元实现矢量加法内核,在OpenCL描述中实现每一操作,进行复制以满足实际应用的吞吐量和延时要求。虽然所显示的只是一个简单表征,但每个功能单元都可以是深度流水线,以保证最终电路的工作频率足够高。此外,编译器可以建立电路来管理与外部系统的通信。