【CUDA】学习笔记(3)论文笔记:并行异构计算机调研

发表在CCF期刊上的一篇论文《Parallel programming models for heterogeneous many‐cores: a comprehensive survey》,对当前并行编程模型技术做了一个综合的调查和介绍。这篇文章能够帮助理解异构计算现状以及未来的发展方向。阅读笔记如下:

介绍

通过主CPU和加速器和协处理器(如:GPG- PUs, XeonPhis, FPGAs, DSPs and NPUs)的组合,形成多个异构架构,这种有架构可以提供计算平台的性能,降低功耗。这种架构也是未来超级计算机的构建模块。例如美国的Aurora 2020; Frontier 2020; El Capitan 2020将采用CPU-GPU结合的架构。这种架构和编程模型与传统的多核处理器明显不同,对程序编写有跟高的要求,程序员必须处理异构核心和内存层次,这是很大的挑战。对异构计算的软件编程研究已经有四十多年了,那些帮助减少程序员工作量的软件开发工具和编程模型将非常重要。

排名前十的超级计算机的架构及编程模型

论文从以下几个方面详细介绍异构计算及编程模型

  1. 异构多核的历史发展和最新并行编程模型
  2. 编程模型采用的代码生成技术
  3. 优化异构计算设备之间通信开销的软件技术
  4. 该领域的开发性问题及研究方向

平行编程模型综述:

并行编程模型经常通过线程机制来实现(如POSIX),在多核异构下不得不考虑主处理器和加速器的异构性。这里有一张图很好的总结了多核异构架构下的编程模型:

这张图从可编程性及性能两个方面把这些编程模型分成了低层和高层两部分,低层的性能更好而高层的可编程性更强。低层的模型更接近硬件,提供更底层的API。而高层的模型隐藏了很多底层硬件的细节,提供更抽象的编程接口。

低层编程模型

开启GPGPU编程的序幕:关于GPGPU编程的发展历史,需要了解着色语言,可以参考这篇文章,有更详细的介绍。文章中还提到了微软和NVIDIA早起的类似C语言的着色语言:HLSL和Cg。但这两种语言也没有提供在图形硬件上开发通用程序的抽象接口。

针对于供应商的编程模型,这里主要指的是硬件研发生产厂商,如IBM的Cell/B.E,NVIDIA的GPU,AMD的GPU,Intel的XeonPhi等,这些厂商针对自己的硬件提供编程接口。这里主要看了一下NVIDIA的GPU编程模型CUDA,CUDA提供了统一的着色模型,所有的硬件着色单元都有能力处理各种类型的着色任务,NVIDIA的架构从G80开始经过了Tesla,Fermi,Kepler,Maxwell,Pascal,Volta,Turing几代的发展,Volta架构中加入了张量核很大程度提高了深度学习的性能。NVIDA编程架构CUDA基于C/C++,Fortran语言。CUDA架构被广泛的使用,在超级计算机中也使用了CUDA架构。此外Intel也有自己的软件库,如COI提供了编程接口,程序可以运行在XeonPhi设备上。Intel在2020年推出了统一编程接口OneAPI。文章中还介绍了IBM等厂商的软件接口,这里就不细说了,主要学习的还是CUDA。

各厂商也会发布一些通用的接口,除了GPU以外,APU和FPGA也是常用的加速设备,这些通用接口可以在这些硬件上运行,如OpenCL就是一个开发编程的标准,下表中展示了各厂商对于OpenCL标准的支持,有些是开源的项目:

OpenCL有很好的代码移植性,但不能包装性能在不同平台也能一样好,因为各个厂商对于自己的硬件架构都做了优化。近些年来移动芯片系统越来越受重视。借助GPU的计算能里移动设备上也能够支持OpenCL。OpenCL也并非是业界的统一标准,CUDA在GPGPU编程上逐渐成为行业标准。OpenCL流行的背后也有很多原因,其中一个是因为OpenCL在处理多核及内存层次架构上的多样性。例如缓存(Cache)在Intel XeonPhi上使用,暂存器(scratch-pad memory)通常被DSP,游戏主机,图形加速器上使用。总体来看,OpenCL和CUDA会是一种共存的模式,形成完整的生态。

高层编程模型

  • 基于C++的编程模型
    SYCL:SYCL是一种免版税,跨平台的抽象层,它允许使用标准ISO C ++编写异构处理器的代码,并将应用程序的主机代码和内核代码包含在同一源文件中。
    DPC++:oneAPI中包含,在SYCL基础上的扩展。
    C++APM:C++ Accelerated Mas- sive Parallelism,建立在DirectX11上的一种基于C++的异构并行编程模型。
    HC (Heterogeneous Computing):AMD研发面向GPU的C++编译器
    PACXX:基于C++ 14标准,包含很多C++的新特性的统一编程模型,包含一个基于LLVM和Clang的自定义编译器。
    其他:boost.compute、HPL、VexCL、hlslib、alpaka等
  • 基于Skeleton的编程模型
    Skeleton programing也可以称为骨架编程,提供一种更加高级的抽象,封装了架构的细节。
    SkePU:一种基于C++模版的骨架编程框架,该框架包含六个数据并行框架和一个任务并行框架,以及两种通用容器类型。后端支持包括:OpenMP, OpenCL 和 CUDA。
    SkelCL:它为程序员提供矢量数据类型,高级数据分发机制,以实现自动缓冲区管理,主机与加速器之间的隐式数据传输。
    其他:Muesli、Marrow、ParallelME、
  • 基于STL的编程模型
    TBB(Threading Building Blocks):是Intel为并行编程开发的C++模版库。TBB旨在解除程序员和底层硬件的绑定。
    HPX(High Performance Par- allelX):是用于并行和分布式系统的通用C ++运行时系统。HPX的目标是易于使用,并实现高可伸缩性和可移植性。
    Thrust:NVIDIA GPU的C ++标准并行模板库。用户不需要知道如何将计算映射到计算资源(例如线程块大小,缓冲区管理,算法变体选择等),而只需注意计算本身。
    其他:Microsoft’s PPL、RAJA
  • 基于Directive的编程模型
    这些编程模型仅需在目标代码区域之前添加指令构造,而将卸载,并行化和优化的任务委托给编译器和运行时系统。如OpenMP、OpenACC、Intel LEO、XcalableMP、Mint、OpenMDSP等。这种编程模式只需要在目标代码区域添加指令。这样做一方面可以提供生产效率,另一方面,程序员可以逐步标记代码,减少调试调试的障碍。
  • 基于Domain的编程模型
    领域编程模型是获得更好性能的较好选择。
    OPS:多块结构网络应用(multi-block structural grid application),前端给用户提供了一套常见的用户接口,后端产生针对设备优化的代码。
    OP2:这个框架建立在OPS的基础上,不同的是OP2的目标是非结构网络应用。
    AMGCL:通过AMG算法解决大型稀疏线性系统,只提供C++头文件的库。这个库提供了共享内存和分布式内存的算法。
    其他:Lime、Halide、KernelGenius、Membarth、Chapel:
    深度学习:Tensorflow、PyTorch、MXNet这些框架在前端提供了功能性程序语言如:Python、R、Scala、Julia。用这些脚本语言描述训练的流程和接口。后端通过低级或者其他高级编程模型如OpenCL、CUDA、SYCL等把任务分配到异构并行系统上执行。

编译技术提高可编程性和可移植性

将一种编程模型转换成另一个可用代码,这样可以提高可重用性和学习其他编程模型的难度。下面介绍几种转换技术:

  • C-to-CUDA
  • CUDA-to-OpenCL
  • Directive-to-CUDA OpenCL
  • Adapting CUDAOpenCL to multi-core CPUs
  • Supporting multiple devices

最小化主机-加速器通信的优化技术

当并行多核架构提供高效高性能计算的时候,程序员也发现处理复杂的系统变的越来越困难。事实上,程序员需要有效地管理主机通信,因为如果不小心的话,通信开销可能完全使计算分流的优势黯然失色。算上内存转换时间,运行一个核心代码的时间比单在GPU上处理话费的时间要多出2-50倍。很多并行编程框架都推出了流机制来缓冲主机通讯的开销。通过划分内核的方式,允许通讯和计算任务在不同的硬件资源上同时进行,从而将内核运行和数据移动重叠进行。这种实现的代表有:CUDA Streams,OpenCL Command Queues和Intel的hStreams。

流机制

这个机制的核心思想是在时间和空间上的复用。时间共享通常是把程序分成多个阶段,如主机通讯和计算。使用时间共享,可以将其中一些阶段重叠以利用管道并行性来提高性能。空间共享使用多个流还享有资源分区的想法。即将资源(例如,处理核心)划分为多个组,并将每个流映射到分区上。如下图,设备具有16个核心,并在逻辑上分为四个分区(P0,P1,P2,P3)。然后将不同的任务卸载到不同的分区上,例如T0,T1,T2,T3分别在P0,P1,P2,P3上运行。

Intel hStream

Intel hStream是一个开源的流机制的实现,基于COI编程模型构造。它的核心是资源分区机制。在物理层面,设备被分成多个组,每个组包含多个处理核心。在逻辑层面,一个设备可以被看成一个或多个domains,每个domains包含多个places,每个places包含多个streams。逻辑概念对于程序员来说是可见的,物理层是透明的,运行时自动在两者直接进行映射。hStream是一个库,给用户提供API去访问加速器。hStream编程和CUDA和OpenCL很类似。

流程序的性能建模

选择一个正确的流配置对性能的影响很大。最佳配置必须基于每个程序每个数据集来决定。通过遍历搜索来找到详细的配置是无效的,而且间接投入比潜在的利益大的多。所以,建造异构流程序的模型是非常重要的。

  • 手工分析模型
    Gomez等人研究了在GPU架构下异步数据传输的性能。该模型允许程序员估计应该分解GPU上的计算的最佳流数。Werkhoven等人提供一种分析性能模型,以指示何时在GPU上应用哪种重叠方法。手工分析模型具有以下缺点:由于模型与特定的多核体系结构紧密耦合,因此无法跨体系结构移植。
  • 基于机器学习的模型
    研究人员利用机器学习技术来自动构建预测模型,以直接预测最佳配置。这种方法可以避免每次在架构演进时都需要人工修改的hard-wired heuristic方法的麻烦,因为这种架构在内核的数量和类型可能会从一代到下一代发生变化时都需要进行修改。

未来的发展方向

  • 超级计算机朝并行异构架构方向发展
  • 编程模型层级化,低级模型针对硬件进行优化,高级模型提供编程接口更加抽象
  • 模式感知并行编程
  • 基于机器学习的程序调优

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值