CUDA、HIP、OpenCL和oneAPI编程模型总结及比较

  本文着重对近年来众核处理器以及并行编程模型的发展历程、研究现状和发展趋势进行概述,其中众核处理器主要包括以下四个以及AI加速卡和国产加速卡,并行编程模型重点对CUDA、HIP、OpenCL和DPC++进行介绍。


🚩目录如下:

目录

目录

背景

众核处理器

NVIDIA加速卡

AMD加速卡

Intel加速卡

国产加速卡

AI加速卡

众核处理器的发展趋势

GPU异构计算编程模型

CUDA编程模型

OpenCL编程模型

HIP编程模型

oneAPI编程模型

编程模型对比

总结


   同时,针对这四种编程语言的详细介绍和实例可以参考之前的博文:

CUDAhttps://blog.csdn.net/qq_46009046/article/details/133753993

OpenCLhttps://blog.csdn.net/qq_46009046/article/details/133777178

HIPhttps://blog.csdn.net/qq_46009046/article/details/133583217

DPC++https://blog.csdn.net/qq_46009046/article/details/123306679


背景

  近年来,随着人工智能技术在计算机视觉、天气预测和基因分析等方面的快速发展,其在科研和工程领域的研究和应用对底层硬件的计算能力和架构多样性需求变得日益复杂,从而带动硬件计算资源在过去几十年间得到了迅速发展。

  回顾计算机硬件计算资源的发展历程可以看到,19世纪70年代初,Intel生产的4004微处理器将运算器和控制器集成在一个芯片上,标志着CPU的诞生;在此后的30多年里,CPU的性能得到了快速的发展,从1978年Intel推出微处理器8086,即x86架构,到后来的Pentium和Pentium Pro微架构,通过指令集和编译优化、多级缓存、超标量和超线程等一系列优化技术使得CPU的主频得到快速提高。21世纪开始,一味的追求更高的频率带来日益严重的高耗能、高发热以及平庸的性能,同时由于集成电路的工艺发展到纳米级别,频率的提升也变得愈加困难,采用提高CPU制程和主频的办法遇到了工艺上的壁垒,这些问题使得处理器在性能上无法持续取得突破,摩尔定律逐渐失效。近年来,单核处理器性能提升的幅度已经缩小至每年只增加3%,因此通过多个核心的并行计算逐渐成为的新的解决方法。IBM 在 2001 年发布了双核 RISC 处理器 POWER4,它将两个 64 位 PowerPC 处理器内核集成在同一颗芯片上,成为首款采用多核设计的服务器处理器。此后几年间,4核、8核等更多核心的处理器相继问世,然而,由于CPU自身体系结构的限制,CPU核心的数量不宜太多,因此通过增加核心数来提高性能的方式也遇到了瓶颈。同时随着人工智能技术的快速发展,其对硬件算力的要求越来越高,传统CPU的发展难以和高速发展的人工智能技术相匹配。

  研究者开始探寻全新架构的硬件计算处理器。例如图形处理器GPU,早期的GPU主要应用于图形领域的渲染等。2011年TESLA GPU计算卡发布,标志着NVIDIA将正式用于通用计算的GPU产品线独立出来,这种处理器往往具有几百个甚至上千个核心,因此被称为众核处理器。凭借于众核处理器独特的体系结构和众多的核心数量,其并行计算能力相较于多核处理器得到了迅速提升并且广泛应用于人工智能及超级计算机等领域的复杂计算任务。尽管从 CPU 转向 GPU 架构是朝着正确方向迈出的一大步,但这还无法和现如今高速发展的人工智能技术相匹配, 因此,通过联合设计专门针对 AI 的计算模型和硬件成为了新的解决方法,例如Google于2016年研发的张量处理器TPU,相较于英伟达的通用计算GPU,TPU是Google为人工智能专门定制的专用集成电路(ASIC),其更加的适用于人工智能的计算任务,然而,其通用性因此受到了极大的限制。

  将不同结构的处理器组合在一起便形成了异构计算系统。近年来研究者从应用、功耗以及性能的需求出发,尝试将不同的处理器组合形成新的结构来发挥更高的计算性能、更多样化的计算任务以及更有普遍性的计算系统。然而,硬件的集成和组合并不意味着算力的直接相加。在异构计算结构中,不同处理器的结构、存储和计算均存在独立的标准,处理器和处理器之间的连接、任务调度和划分、数据传输、通信和同步等标准的差异使得异构计算系统的管理和使用更加困难,这不仅需要开发者具备丰富的硬件架构知识,又要熟悉各种软件的优化方法,从而其理论上的性能优势难以得到发挥。

  现如今,随着计算的应用场景变得日益复杂多样,为了跟上人工智能算法对算力的需求,GPU硬件架构快速走向多样化,GPU生产厂家众多,且在商业和市场等因素的影响下,GPU通用计算编程模型也日益多元化。

众核处理器

NVIDIA加速卡

  NVIDIA公司的GPU产品目前占据着人工智能和图形学应用的高端市场,比如专业计算卡Tesla Ampere 100、消费级GeForce 3090和GeForce 4090 GPU。这些最新架构GPU 都包含通用计算的CUDA核、渲染用的RT core和人工智能加速Tensor core。专业计算卡与消费级GPU的区别不大,比如A100的双精度性能为9.7 TFLOPS,而3090的双精度性为556 GFLOPS;3090的单精度性能是35.7TFLOPS,超过了A100的19.5TFLOPS,更低精度的FP16性能达到285TFLOPS,接近A100的312TFLPOS。

  2022年3月NVIDIA GTC大会上NVIDIA介绍了基于全新Hopper架构GPU—H100,它是NVIDIA迄今为止,用于加速人工智能、高性能计算和数据分析等任务的最强GPU芯片。H100拥有800亿个晶体管,采用台积电4nm工艺,提供SXM和PCIe两种规格,双精度和单精度性能分别为30 TFLOPS和24 TFLOPS、60 TFLOPS和48 TFLOPS。性能相比A100,FP8性能提升6倍,FP16、TF32、FP64性能各提升3倍。

  针对人工智能推理市场和边缘计算市场,NVIDIA还推出了5-30w的JETSON系列产品。为了更好地支持人工智能应用,NVIDIA的Ampere 架构GPU还提供了BFLOAT16、INT8和INT4等多种精度的硬件模块,同时,基于全新Hopper架构的H100配备第四代Tensor Core和Transformer 引擎(FP8精度),可使大型语言模型的训练速度提升高达9倍,推理速度提升惊人的30倍,从而奠定了NVIDIA在AI领域的市场领先地位。

AMD加速卡

  尽管AMD的GPU软件生态不如NVIDIA,但是其GPU的计算性能跟NVIDIA相比差距不大。美国近几年研制的三台E级超级计算机: Aurora, Frontier 和El Capitan。其中Frontier和 El Capitan使用AMD Radeon Instinct GPU。2020年10月AMD发布了采用 RDNA2 架构的AMD Radeon RX 6000 系列芯片,专门用于图形学计算领域。

  2021年11月,AMD发布了基于 CDNA2架构的 Instinct MI200系列计算卡,采用6nm FinFET工艺,拥有580亿个晶体管。新系列分为两款型号,Instinct MI250X和Instinct MI250,Instinct MI250X集成了220个计算单元、14080个流处理器核心,最高频率1.7GHz,并有880个第二代矩阵核心,峰值性能为:FP16半精度383 TFLOPS、FP32单精度/FP64单精度47.9 TFLOPS、FP32单精度/FP64双精度矩阵95.7 TFLOPS、INT4/INT8/BF16 383 TFLOPS。2022年6月,美国橡树岭国家实验室(Oak Ridge NationalLaboratory,ORNL)新近投入使用的超级计算机Frontier 就采用了AMD 升级版第三代EPYC 处理器,并搭载AMD Instinct MI 250X GPU,并以1.102 Exaflop/s 的Linpack 最高性能大幅领先于超级计算机Top500 排名第二的基于Arm 处理器的日本富岳(Fugaku),登顶超级计算机Top500 排名榜首。

Intel加速卡

  前几年,Intel主要生产与CPU集成在一起的GPU,根据Jon Peddie Research的调研,2022年第一季度,Intel在集成GPU市场的占比为60%。2020年Intel推出Xe架构,准备用一种架构去满足多种使用场景,从笔记本到游戏卡再到高性能超算。GPU分为四个系列产品,Xe_LP、Xe_HP、Xe_HPG和Xe_HPC,分别面向移动端、AI计算、游戏玩家和高性能计算市场。Xe LP架构的Iris Xe MAX独立GPU已经上市,采用10nm制程,拥有96个EU, 768个流处理器,使用4 GB LPDDR4X,带宽为68.26 GB/s,单精度计算能力约2.5 TFLOPS。同时,Xe_HPG架构的Arc Alchemist于2022年第一季度进入移动市场,随后于2022年第二季度推出台式离散图形卡。Intel Arc Alchemist系列将配备两个主要的DG2 GPU SKU,即大的“SOC 1”和小的“SOC 2”。SOC 1将采用DG2-512 SKU,并将由Arc A700和Arc A500系列图形解决方案使用,而将采用DG2-128 SKU的SOC 2将由Arc A300系列使用。Arc A300系列本身将支持多达8个Xe内核、128个执行单元、1024个ALU、128位(14 Gbps)内存解决方案和台积电的6nm工艺。

  在ISSCC 2022(IEEE国际固态电路会议)期间,Intel详细介绍了Xe_HPC架构GPU—Ponte Vecchio。 Ponte Vecchio GPU 包含了多达47个芯片(包括了16个Xe-HPC 架构的计算芯片、8个Rambo cache芯片、2个Xe 基础芯片、11个EMIB连接芯片、2个 Xe Link I / O芯片和8个HBM芯片),整套芯片包含了惊人的1000亿个晶体管,Ponte Vecchio 的 47 个芯片会使用不同节点的工艺制造,包括了台积电的7nm或5nm工艺,以及英特尔的7nm和10nm 工艺,并通过EMIB与Foveros 3D封装中整合在一起。

国产加速卡

  国产的GPU软硬件近年来也取得了较大的进步, 2018 年 9 月景嘉微JM7200 芯片完成流片和封装,单精度约0.5TFLOPS,目前主要用于图形学应用。2022年壁仞科技发布了自主原创的芯片BR100系列,它采用7nm制程,集成770亿晶体管,采用Chiplet(芯粒)、2.5D CoWoS等先进的设计、制造与封装技术,可搭配64GB HBM2E显存,超300MB片上缓存,支持PCIe 5.0、CXL互联协议等。性能方面,1024 TOPS INT8、512 TFLOPS BF16、256 TFLOPS TF32+、128 TFLOPS FP32,可实现2.3TB/s外部I/O带宽,支持64路编码、512路解码等,号称在FP32(单精度浮点)、INT8(整数,常用于人工智能推理)等维度,均超越了国际厂商最新旗舰。此外中国船舶重工集团公司第七〇九研究所和七一六所也生产面向专用领域的GPU。

  总之,虽然近些年来国产GPU有了一定起色,但是目前国产处理器的硬件架构、制程水平和计算性能同国外发达水平还有较大的差距。

AI加速卡

  专门针对 AI 的计算模型和硬件称之为AI加速卡,比较经典的是Google于2016年研发的张量处理器TPU,到目前为止,第四代TPU已经发布。TPU的架构属于DSA,定位准确,架构简单,单线程控制,定制指令集,架构在深度学习运算方面效率极高,且容易扩展。其最重要的硬件部分是其“Matrix Multiply Unit”。这部分矩阵计算单元用其特殊的脉冲阵列,针对性的提升了AI任务中的卷积、矩阵乘等矩阵运算的速度和功耗。

  MLPerf 最新发布的一套人工智能性能基准指标显示,第四代的TPU集群大幅超越了第三代 TPU的能力,甚至在目标检测、图像分类、自然语言处理、机器翻译和推荐基准等方面,部分能力超越了英伟达发布的 A100。

众核处理器的发展趋势

  近年来,在GPU市场,英伟达得益于强大的生态和技术一家独大,面对庞大的市场规模,以AMD、Intel为代表的厂商也纷纷加入其中,除了GPU系列产品的发布,其不断地完善通用计算、人工智能、图像处理等方面的生态建设,尽管近年来依然很难威胁英伟达的地位,然而随着技术的不断突破、生态的建立英伟达的地位将面临严峻的挑战。另外,众核处理器的发展近年来逐渐走向专用化,无论是谷歌提出的全新TPU还是英伟达在H100系列中的第四代Tensor Core和Transformer 引擎,其都是建立在人工智能领域的专用技术。这种专用性使得在面对需要大规模算力的高性能计算、人工智能、图形处理上能更加的发挥最大优势。同时随着架构、技术、性能上的突破,功耗问题近年来变得越来越重要,尤其是大规模并行计算是功耗量巨大,这势必会成为未来GPU发展的一大核心问题和关注点。

GPU异构计算编程模型

CUDA编程模型

  2007年NVIDIA公司推出GPU的并行计算架构CUDA,2021年发布了11.4版本。CUDA生态之所以发展的好,一方面是版本迭代很快,另外一方面就是软件功能强大,对人工智能的应用支持最完善。

  CUDA编程模型通过扩展C/C++语言实现并行计算功能,编程时主要基于CUDA驱动API、CUDA运行时API和CUDA库函数实现功能。CUDA运行时API封装了底层的驱动API,更加简化了开发过程,提高了开发效率。

  CUDA提供了非常丰富的开发工具,包括NVCC编译器、调试软件CUDA-GDB、性能分析软件Nsight、数学库如cuBLAS、cuFFT、cuSOLVER 、cuSPARSE、cuRand、NVIDIA Performance Primitives等,这些工具和库简化了用户开发的难度,提高了GPU硬件的利用率。

  以CUDA并行编程为例,实现两个向量相加的核函数为:

__global__ void vectorAdd(float *d_A,float  *d_B,float  *d_C,int numElements)
{
    int i = cudaBlockIdx_x * cudaBlockDim_x + cudaThreadIdx_x;
    if(i<numElements)
    {
    d_C[i] = d_A[i] + d_B[i];
  }
}

OpenCL编程模型

  OpenCL(Open Computing Language) 是第一个面向异构计算设备的开放式、免费标准,由Khronos组织维护,2009年10月公布了1.0规范,最新版本是2020年发布的3.0。OpenCL得到了NVIDIA、AMD、Intel、高通、ARM等知名公司的支持,广泛适用于 CPU、GPU、FPGA、DSP 和人工智能芯片等各种计算设备。

  OpenCL规范类似CUDA通过扩展C/C++语言实现并行计算功能,提供了统一的编程API,由API完成各种功能,API的具体编程实现由各个设备厂家来完成。早期OpenCL语言主要用于CPU和GPU计算设备,目前已经扩大到FPGA和DSP等。OpenCL目前比较诟病的一点就是为了可移植性,在使用时编程比较繁琐。

  以OpenCL并行编程为例,实现两个向量相加的核函数为: 

// OpenCL kernel to perform an element-wise addition 
const char* programSource =
"__kernel                                            \n"
"void vecadd(__global int *A,                        \n"
"            __global int *B,                        \n"
"            __global int *C)                        \n"
"{                                                   \n"
"                                                    \n"
"   // Get the work-item’s unique ID                 \n"
"   int idx = get_global_id(0);                      \n"
"                                                    \n"
"   // Add the corresponding locations of            \n"
"   // 'A' and 'B', and store the result in 'C'.     \n"
"   C[idx] = A[idx] + B[idx];                        \n"
"}                                                   \n"

HIP编程模型

  AMD的GPU早期主要使用OpenCL来开发,后来为了提高开发效率,借鉴了很多CUDA的设计理念,推出了支持HIP(Heterogeneous-Computing Interface for Portability )和OpenCL编程的ROCm框架。

  ROCm在设计风格上类似于CUDA,提供了非常丰富的开发工具,包括HCC编译器,性能分析工具rocProf,数学库如rocBLAS、rocFFT、rocSOLVER 、rocSPARSE、rocRand、深度学习库MIopen等。

  HIP是一个C++运行时API和内核语言,使用HIP编程模型编写的异构程序可以同时在类GPU加速卡平台和NVIDIA GPU上运行。AMD HIP API接口与CUDA API相似。当涉及在NVIDIA GPU编译时HIP充当了CUDA之上的一个精简代理层,且其Runtime API兼容CUDA runtime API。

  ROCm还提供了将CUDA应用程序通过使用HIPIFY工具自动转换为HIP内核语言及运行API的功能,当然,这种转码一般还需要手动进一步调整和优化代码。

  以HIP并行编程为例,实现两个向量相加的核函数为:

__global__ void vectorAdd(float *d_A,float  *d_B,float  *d_C,int numElements)
 {
     int i = hipBlockIdx_x * hipBlockDim_x + hipThreadIdx_x;
     if(i<numElements)
     {
     d_C[i] = d_A[i] + d_B[i];
     }
 }

oneAPI编程模型

  Intel CPU和GPU近几年来一直支持OpenCL ,由于应用的日趋复杂,再加上Intel的产品线覆盖CPU、GPU、FPGA 和AI芯片等,这使得高性能计算系统的开发过于复杂,为解决此问题,Intel研发了oneAPI框架,其旨在提供一个适用于各类计算架构的统一编程模型和API接口,使编程人员只编写一次代码,就可以让程序在各种硬件平台上。oneAPI包含一种全新的编程语言DPC++,DPC++基于C++编写,由一组C++类、模板与库组成,同时兼容Kronos的SYCL规范。与OpenCL不同,SYCL包含模板和lambda函数,以使更高级别的应用程序软件能够以优化的内核代码加速进行干净的编码。开发人员在比OpenCL更高的级别上编程,从而提高开发效率。

  DPC++是一种单一源代码语言,其中主机代码和异构加速器内核可以混合在同一源文件中。在主机上调用DPC++程序,并将计算加载到加速器。程序员使用熟悉的C++和库结构,并添加了诸如工作目标队列、数据管理缓冲区和并行性并行的函数,以指导计算和数据的哪些部分应该被加载。

  由此可见,oneAPI既提高了开发人员的开发效率,又具有一定的性能可移植性,在未来具有良好的应用前景。

  以DPC++并行编程为例,实现两个向量相加的核函数为:

 //4. 调用oneAPI的核函数在Device上完成指定的运算;
        h.parallel_for (range<1>(numElements), [=](id<1> index) {
  //核函数部分,若单独写一个函数,直接使用函数名(参数表)调用即可
      if (index < numElements)
        v3_accessor [index] = v1_accessor [index] + v2_accessor [index];
    });
  }).wait(); //排队等待

编程模型对比

  除了上面重点介绍的四种GPU编程模型外,还有OpenACC、美国国家实验室研发的RAJA和KOKKOS等异构计算语言。本文重点对CUDA、OpenCL、HIP和oneAPI的几个关键术语进行对比,如表1所示。从表1可以发现,这几个编程模型在关键术语上有互相借鉴的地方。表2对这几种并行编程框架从开放性、开发难度和适应平台等方面进行分析比较。从表2可以看出,除了CUDA,其它编程模型都具有一定的开放性,能支持多种计算平台。

表1 不同编程模型对应的网格划分

CUDA

HIP

OpenCL

oneAPI

Grid

Grid

NDRange

NDRange

Block

Block/Work-group

Work-group

Work-group

Thread

Thread/Work-item

Work-item

Work-item

表2 不同编程框架的比较

编程框架

出现时间

开放性

主要支持语音

支持硬件

编程难度

CUDA

2007

企业私有

C、C++

NVIDIA GPU

容易

HIP

2016

API标准

C、C++

AMD GPU、NVIDIA GPU

容易

OpenCL

2008

API标准

C、C++

CPU、GPU、FPGA、DSP等

困难

OneAPI

2020

API标准

C、C++

CPU、GPU、FPGA、AI等

容易

总结

  本文对近年来多核处理器、众核处理器以及并行编程模型的发展历程、研究现状和发展趋势进行概述。对比了各个编程模型的特点。硬件处理器从最初的单核到多核、众核再到现在为了满足不同应用和研究的异构体系CPU+GPU或CPU+AI加速卡等,处理器体系结构不断的发生着变化,同时从近年来不断出现的并行编程工具、人工智能专用优化技术来说,处理器走向专用化、简单化。从上述异构计算体系面临的问题和挑战来看,目前的异构计算依然存在很大的研究价值,主要有以下几个方面:

  功耗问题。近年来随着可持续发展观念的深入人心,加上人工智能技术海量的数据所需要的庞大算力资源,让异构计算的功耗问题变得逐渐重要,未来低功耗、高算力将会是异构计算的重要发展趋势。

  统一的编程模型。多层面的异构使得将多种不同的处理器结合起来工作往往需要多种程序代码的联合工作,这极大地增加了开发和维护的难度。OneAPI尽管作为一个统一的编程模型但是受限于生态和产品目前无法在人工智能领域的应用中普及。提供一个统一的编程模型将会很大程度上提高并行编程效率。

  负载均衡。由于不同的处理器的计算性能、功耗性能各不相同,因此将一个计算任务进行拆分给不同的硬件处理器进行协同计算,这不仅要求开发人员对任务划分算法设计的高效,更要求对硬件处理器的深度了解,即便如此,加上异构计算本身的复杂性,使得很难进行精确的任务划分。因此,如何有效的自适应分配并行计算任务将会是异构计算的一个重要研究热点。

  内存资源管理。为了最大化硬件效率,往往需要将数据在不同的缓存结构中进行传输和移动,但存储器的复杂内存结构带来的数据共享和数据访问冲突等问题也使得程序的调度和控制变得日益复杂。所以如何有效的管理资源、利用资源实现硬件计算资源和高效利用非常重要。

  通信瓶颈。数据通信和传输可能是限制异构系统可扩展性的潜在瓶颈,在进行大规模异构计算时,通信任务相对于计算任务的耗时可能更高,因此,研究更加高效的通信方式或硬件存算架构将会对异构计算系统的可扩展性提供良好的基础。

  • 28
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小殊.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值