OpenCL在国产GPU上的实现∗
2021-10-11高胜寒熊庭刚
高胜寒 熊庭刚
(武汉数字工程研究所 武汉 430205)
1 引言
近年来,GPU进行通用计算的潜力引起了研究者的注意。由于GPU具有极强的浮点运算能力,通过将GPU引入异构计算系统,可以大幅提高计算系统性能[1]。OpenCL是面向异构系统的并行编程标准和编程环境,它的出现为异构计算提供了一种通用和开放的解决方案[2]。据2018年中国高性能计算机发展现状分析与展望指出,近年我国采用异构加速体系架构的系统数量逐年增加,但是所用GPU硬件仍然为国外主流厂商所垄断[3]。所以,在国产GPU硬件上实现OpenCL异构计算编程框架的实现具有相当的研究意义。
2 异构计算国内外发展现状
在异构计算领域,国外厂商在软硬件方面均处于领先地位。硬件层面上,图形处理器(GPU)市场基本上为国外公司所垄断,AMD、NVIDIA占有了桌面级GPU市场,在嵌入式市场则主要由ARM、Imagination、VIVANTE等占据[4]。在软件层面,上述国外公司也对如CUDA和OpenCL等一系列异构计算标准提供了支持[5~6]。
当前,尽管已有国内厂商推出了一系列国产GPU,但是其研发重点仍然集中于提高GPU的图形渲染能力上,在通用计算方向研究较少[7-8]。从目前所知的报道看,大部分国产GPU尚未对OpenCL标准提供支持,异构计算在国产GPU上的研究尚有很大空间。
3 OpenCL在国产GPU上的设计与实现
OpenCL标准中定义了四个抽象模型,即平台模型、执行模型、内存模型和编程模型[9]。在国产GPU上进行OpenCL的设计和实现,其关键在于实现隔离,即操作系统无关性和平台无关性[10]。本节结合国产GPU的系统结构,定义和设计了两个隔离层并设计了API解析程序,从而将OpenCL标准的四个模型映射到了国产GPU架构上,实现了模型的匹配。由于国产GPU设计的通用性,OpenCL的各模型都较为便利地在GP201上得到了实现。
3.1 国产GPU架构
3.1.1 国产GPU计算架构
国产GPU采用可拓展的统一渲染架构(Scalable Universal Shader Architecture,SUSA),以流处理器为基本计算单元。其渲染架构如图1所示。
图1 GP201的可拓展的统一渲染架构
OpenCL的平台模型定义了其异构计算平台的组织方式。OpenCL平台由两部分组成,即宿主机(Host)和 OpenCL 设备(compute device)[11]。Open-CL设备内部的计算资源由多个计算单元(compute unit)组成,每个计算单元内部则有处理单元(processing element)。
国产GPU在OpenCL平台模型中作为OpenCL设备存在,其内部具有多个Cluster即对应模型中的处理单元,每个处理单元内部则以流处理器作为基本处理单元。基于此,国产GPU计算架构实现了与OpenCL的抽象平台模型的匹配。
方位意义是“东西”的初始意义,随着时间的推移,整个语言系统的变化,“东西”也衍生出了其他的意义。“东西”可泛指各种具体的或者抽象的事物,也可指代人。我们常说“买东西”、“卖东西”,对于“东西”的“货物”这一意义的起源,或源于东汉时期,初时只表示货卖的物品。彼时洛阳为“东京”,长安为“西京”,到洛阳购货为“买东”,到长安购货为“买西”,在《木兰诗》中亦有“东市买骏马,西市买鞍鞯”,于是“东西”逐渐用来指代货物。再后来,其指代的范围扩大,不再局限于货卖的物品,而是用来指代各种具体的和抽闲的事物。不过,“东西”用来指代各种具体或抽象的事物的现象,宋时始见,直到明清时期才尤为广泛。
如图2所示,在执行任务时,主机将各命令块以多指令多数据流(MIMD)模式分别下发至设备,命令在设备中以单指令多数据流模式(SIMD)分配到流处理器中,流处理器作为最小的运算单元采用单指令多线程模式(SIMT)对数据执行操作。
国产GPU采用多核多线程调度与管理机制,即使用多指令多数据流(MIMD)、单指令多数据流(SIMD)、单指令多线程(SIMT)三模式相结合,实现了软硬件协调的动态负载均衡、数据阻塞检测与控制等技术。其指令处理流程如图2所示。
图2 GP201指令处理流程
3.1.2 国产GPU指令处理流程
[7] Aileen San Pablo-Baviera, “Security Challenges of the Philippine Archipelago”, Southeast Asian Affairs, Institute of Southeast Asian Studies, Singapore, 1998, p. 219.
OpenCL标准定义了两种不同的编程模型:任务并行和数据并行。通过上述调度与管理机制,实现了国产GPU与OpenCL编程模型的匹配,充分利用了国产GPU的计算资源。
3.1.3 国产GPU存储体系
5)Constant memory(常量存储器):对应于常量内存。
GPU需要进行大量的数据搬移工作,这就对显存的带宽、数据读取速度提出了更高的要求。因此,存储管理单元已经成为现代GPU设计的关键之一。国产GPU设计了一套多级存储系统,以此提高了系统中信息存储和传递效率。
OpenCL标准定义了抽象的内存模型[12],国产GPU由驱动完成了具体向硬件上的映射。国产GPU多级存储器模型和OpenCL存储模型映射关系如下。
1.2.3 健康对照组纳入标准 (1)年龄20~70岁,(2)最佳矫正视力≥1.0,(3)屈光度≤ ±6D、柱镜≤±2D,(4)Goldmann压平眼压测量值小于21 mm Hg,(5)视乳头及黄斑区结构正常(眼底镜检查),(6)无眼科疾病史,(8)无眼科手术史。
1)Register(寄存器);
国产GPU驱动程序为各主流图形API提供了支持,目前实现了对OpenCL 1.2标准的支持。在国产GPU上,OpenCL应用通过调用OpenCL中间库,向不同的操作系统提供了不同的底层库调用接口,并在底层库中实现了基于OpenCL执行模型的一系列API操作。未来,通过对OpenCL API解析函数的补充和更新,国产GPU对于更高版本的OpenCL标准的支持也是可以实现的。
3)Shared memory(共享存储器):对应于局部内存;
4)Global memory(全局存储器):对应于全局内存;
“我们把盆往床边放来试试看好不好?”(我动手去帮忙移盆了,因为在对话过程中我发现他对“边”还没有概念,他对上下有概念了,在搭脚手架过程中我发现他对 “边”没有概念。)“好了,图图现在站上盆,看看能不能爬上床了?”(站上去,一下子就爬到床上了,特别开心。)
从图1可以看出,锂离子电池在离线后,其端电压会经历一个跳变,图中A点到B点的变化,然后在脱离负载的情况下经过一段时间缓慢恢复至一个稳定的电压值——开路电压OCV。上述过程中B点的电压值我们称为回跳电压,并记为Ut。
如前所述,我们可以把那个一般意义上的启蒙看作是一个过程,是个体逐渐学会主动运用自身理性进行批判性思考的过程,这就从两个层面决定了启蒙要面对并接受种种反启蒙,启蒙要在种种反启蒙的鞭挞下不断地自我完善从而走向那个一般意义上的启蒙。
3.2 基于国产GPU的OpenCL实现
OpenCL是一个完整的并行编程框架,为Open-CL开发人员提供了硬件抽象层API和面向内核的异构编程环境,便于开发者更方便地开发和优化他们的应用。国产GPU上的OpenCL框架如图3所示。
如图3所示,为了使得设计代码具有良好的可移植性,国产GPU上的OpenCL实现采用了硬件适配层(HAL)、操作系统适配层(OSL)和库函数实现层三层结构。
图3 基于国产GPU的OpenCL框架
作为OpenCL设计与实现的重要组成部分,驱动程序中的HAL层和OSL层分别实现了硬件和操作系统的隔离。在具体应用实现过程中,OpenCL API的解析程序并不直接与硬件和操作系统交互,而是通过HAL层和OSL层实现该操作,从而屏蔽了不同硬件和操作系统的差异,实现了硬件和操作系统的无关性。
2)Local memory(本地存储器):对应于私有内存;
4 测试与验证
由于快速傅里叶变换需要进行大量的并行运算操作,使其较为适合评估设备运算性能。为测试并展示GP201的计算性能及在其之上设计与实现的OpenCL执行效率,本文基于快速傅里叶算法,以OpenCL编程语言设计了快速傅里叶变换程序[13]。本文基于蝶形算法进行了序列长度为16~65536的多组测试,比较了该应用程序在GP201原型和商用显卡上的运算表现,对国产GPU上OpenCL设计效果进行了评估。
4.1 测试程序设计
改进后的DEA模型结果表明郑州市创新型城市的效率变动呈现下降趋势,其效率评价指数从2011年的0.75降至2016年的0.44,期间在2014年效率水平略有回升。可见,尽管郑州市在样本期间整体处于最优规模阶段且实现了DEA有效,但其核心创新能力的轻微弱化现象必须予以高度关注。
Cooley-Tukey算法也称为蝶形算法[14],于1965年由J.W.库利和T.W.图基最先提出,是各快速傅里叶变换算法中最常见的一种,也是通常所说的FFT算法所指的算法。一个N点序列的离散傅里叶变换公式如下式所示。
(2)将“无障碍网络课程”打造成特色。目前国内所有残障人士几乎都是在专门的学校接受教育。但是这种教育并不是终身的,而无障碍网络课程则使他们能够继续学习。因此,应该将无障碍网络课程打造成特色,一方面可以满足障碍人士终身学习的需求,另一方面还可以利用网络课程给他们颁发相应的证书。
“南海核心利益说”距其提出已经整整8年。追根溯源,引发该说的是《中国军队寻求拓展海军实力》这篇文章。此后,关于该说的研究及其影响大体都在该文的框架之内。就这篇文章而言,“南海核心利益说”不过是一个具体的论据;但就此后该说的影响而言,该文不过是为该说提供的一个国际趋势分析框架。因此,对该说的思考宜以这篇文章的框架为基础,以前后事实发展为依据,同时就该话题的“政治性”以及同国际关系理论的关系进行探讨。
在国产GP201上运行的快速傅里叶变换程序的程序流程如下。
OpenCL模型中的宿主机内存不在国产GPU内部,该内存取决于组成异构计算体系时的主机设备。通过上述映射关系,国产GPU完成了对Open-CL标准中内存模型的匹配。
1)查询平台上OpenCL设备数量,并储存设备信息,若找不到则结束程序。
2)由设备类型创建一个上下文,获取设备信息并选择运算所使用的具体设备。打印设备相关信息,主要是其compute units数量。
3)创建命令队列,然后开始进行主要的设备运算阶段。
实习基地单位老师负责考评学生的出勤率、实习态度、沟通能力和业务能力。校方指导老师负责考评学生的实习记录和实习报告。双方评分权重各占一半,最后得分为综合得分。
4)统计程序运行时间以便后续分析。清理内存空间,结束程序。
4.2 测试平台
异构计算平台由主机端和设备端构成,本文中主机端为基于X86架构的CPU电脑主机,设备端为搭载了GP201原型的FPGA加速板卡,该原型为GP201的1∕64裁剪子集,核心频率为0.5MHz。本文采用的商用显卡为AMD公司生产的AMD Radeon HD7450M,其核心频率为700MHz。本文使用的主机端的操作系统是Linux操作系统,版本为Ubuntu 12.04,主机程序使用的编译软件是Linux系统下的GNU编译器套件GCC4.8.2。
4.3 测试结果
在GP201原型上和商用显卡上分别执行应用程序,测试结果如表1所示。
表1 原型快速傅里叶变换运算用时
本文采用的FPGA上搭载的逻辑为GP201的1∕64裁剪子集,运算单元数较少,且其核心运算频率较低,约为0.5MHz。尽管如此,该裁剪子集仍然表现出来不俗的计算速度。依据当前设计,GP201目标产品的主频将达到1GHz以上,运算单元个数为原型64倍。为便于计算比对,本文取GP201频率为1000MHz。依据上述参数,结合GP201原型系统运行时间数据,本文对GP201运算速度进行了预测,并将其与商用显卡运行时间进行比较,数据如表2所示。
表2 GP201快速傅里叶变换运算用时
从表中我们可以看出,本文中所实现基于GP201原型的加速方案运算速度相当优秀。在FFT序列较短时尤其明显,在序列较长的运算中依然优于商用显卡。以此可以预见,GP201的实际产品性能将可达到更高水准。相应地也表明所设计与实现的基于国产GPU的OpenCL异构计算架构具有较高的性能。
5 结语
如今,GPU已经被广泛运用于异构计算体系之中。在国产GPU上实现OpenCL异构计算标准的应用,可以充分发挥其运算能力,拓宽国产GPU的应用面。本文通过实验,验证了国产GPU上Open-CL的设计与实现的效果。通过数学计算,将GP201的运算结果与商用显卡的运算结果进行比较。结果表明,基于国产GPU的OpenCL异构计算应用运行正常,OpenCL各结构层次运行正常,国产GPU作为异构计算组件性能良好,较好地发挥出了硬件的能力,基于国产GPU的OpenCL的设计与实现是较为成功的,国产GPU在异构计算领域前景十分光明。