邱浩淼

(汕头市超声仪器研究所有限公司,广东 汕头515000)

1 CPU+GPU 异构编程方式

1.1 CPU+GPU 异构计算系统

CPU+GPU 异构计算系统是一种新型的计算系统,对传统计算机系统进行了设计与改善,计算任务由加速部件GPU 与CPU 共同完成。这种异构方式具有显着的运用优势,增强了GPU 的运算能力,例如对追求浮点运算性能的结构中具有非常远超CPU 浮点运算能力的GPU。同时GPU 在具有传统图像处理能力的同时也具有一定的计算能力。随着目前技术的的不断发展,GPU 运用过程中在、编程模型、如硬件结构等层面上存在则问题也得到了不同程度的改善。随着目前计算机系统的逐渐完善,在其功能与扩展性等层面上也出现了一些问题,GPU 加速部件的运用能够对此有效解决[1]。

图1 GPU 计算模型

1.2 CPU+GPU 异构在计算系统编程上的困境

CPU+GPU 异构计算在目前多项领域中均得到快速发展,但是由于技术以及实际运用等多种层面的制约,在具体的计算过程中依然存在着一些不足之处。程序开发难度较大。 GPU的设计初衷是处于图形,因此将其进行通用计算层面上存在一定的限制,硬件建设性不足,重点表现为双精度性能有限,数据校验机制建设不足,数据传输有限。目前国内在GPU 软件开发编程模型与方式依然发展不够成熟,设备架构(CUDA)技术的开发具有重要意义,但是在运用过程中需要考虑到CPU 模式中长久存在的X86 编程习惯。目前针对异构计算中标准开放计算语言(OpenCL)的运用时间较短,尚没有形成统一开放的运用体系[2]。

2 目前采用的程序开发方式

2.1 底层图形API 的开发方式

这一开发方式运用较早,在目前CPU+GPU 异构计算方式中依然适用,运用过程中要求对GPU 硬件底层图形API 做到灵活运用,将其中的程序与图形处理进行一一对应。在编程处理过程中一般采用开发图形库着色语言(GLSL)等方式。GPU 产品在早期开发过程中包括顶点处理、片段处理等图形渲染过程,GPU 可编程能力较为有限。目前已经出现并运用了素级可编程性,在一般代数问题的求解过程中可以采用像素程序解决,能够对有限差分方程组求解(PDEs)进行有效解决。底层图形API的运用为程序员进行技术处理与解决提供了新的方式与途径。目前主要采用DirectX、OpenGL 的开发图形语言[3]。

图2 CPU 指令执行流程

2.2 采用低层次抽象的轻量级编程工具

CUDA 的运用有效弥补了传统方式中需要图形API 来实现GPU 的访问的不足,是一种能够直接访问硬件的软硬件体系,建立的图形处理器(GPGPU),能够进行通用目的的计算,是C语言中的编程语言,开发了大量高性能的开发语言。能够在实现GPU 计算能力的同时建立一种密集数据计算方式。OpenCL能够运用在Cell 类型架构、GPU、CPU、DSP 等并行处理器之中,是一种基于通用计算方式开发的运用体系。能够编程GPU、CPU及其他其他分离的计算设备组成的异构群。OpenCL 运用过程中可以不把算法映射到底层图形API 之中,在开发过程中同时包含了API 库、开发语言以运行系统。

2.3 建立高层次抽象函数库与模板库

CUDA 快速傅里叶变换(CUFFT)运用中设计了与标准C 语言程序库(FFTW)相近的接口,通过GPU 建立了一个函数库,能够实现傅里叶变换。对FFTW 操作方式中数据存储内存之中进行了有效互补,CUDA 离散傅里叶变换(CUFFT)在存储方式中具有显存特征,在数据交换中要求在内存与显存之间进行交换。CUDA 线性代数基础子程序库(CUBLAS)运用中能够进行简单的矩阵计算,具有和BLAST 差不多的接口,属于基本的矩阵与向量的运算库。运用中可以将其运用到线性代数程序包(LAPACK)等复杂函数包之中。CUBLAS 也为显存的存储方式,要求完成封装之后才能替代线性代数子程序(BLAST)函数。

可以采用高层次抽象编译器的处理方式,运用复杂的代码分析技术、指示语句、语言运行时系统、算法模板等自动生成GPU 内核程序。例如PGI x86+GPU 编译器,设计了一种新指示语句(PRAGMAS),目前得到了一定运用。

3 目前编程方法的运用

目前很多开发者是从底层图形API 方法程序逐渐开发设计而言,在遗留代码的处理过程中依然可以运用底层图形API 处理方法,可以不用太大修改原来的运用程序。但是在具体的运用过程中存在着一些局限性。在运用过程中要求程序员编写构造图形素元,并分配纹理存储。因此要求程序员在开发设计过程中详细掌握GPU 硬件特点、限制因素以及图形API 的运用方式。同时在设计算法的表达上可以采用三角形、纹理等方式。这种方式在推行过程中在GPU 产品运行代码执行效率难以达到理想效果,与新程序相比运用优势不明显。

针对这一方式,在处理过程中可以采用OpenCL、CUDA 等较低层次的编程工具,此时只有少量程序段会影响性能,只需将这些代码自己编写即可。运用过程中为了获得良好的效果,要求积极优化GPU 具体数据结构,但是对开发者提出了较高的要求,要求其掌握一门新的编程语言。

执行标准函数应用程序运用过程中,为了提升了其运行效率,可以采用GPU 加速版本的标准函数库的处理方式,运行中要求降低GPU 和主机之间的通讯。但是在实际运用中,函数库的灵活性较为有限,有可能出现多余的存储器访问。

针对需要专业领域算法应用程序,开发者难以自己编写程序,而标准函数库中又难以找到对应程序的情况,可以采用编译器来解决。这一方式目前运用时间较短,存在着一定的局限性。Portland Group 运用中难以在嵌套循环结构与底层流处理器之间建立良好的映射关系,需要用户自己做较大量的工作,内核程序并行化复杂度,没有得到很好地隐藏。

结束语

CPU+GPU 异构计算模式在目前计算机领域中运用较为广泛,在程序开发方面存在着一定的局限性,目前GPU 产品的硬件架构设计中正在积极向着程序设计层面演变,工业界与学术界目前正在对此积极研发,CPU+GPU 的异构计算系统设计正在逐步完善。