爱丁堡毕设:并行计算GPU加速

爱丁堡毕设:并行计算GPU加速

Tags
Projects
Research
Creator Economy
Published
Created time
Feb 22, 2023 08:26 AM
Author

Background

SYCL 是一个单源编程模型,使现代 C++ 设计方法(例如模板)能够跨主机和设备代码边界以类型安全的方式无缝工作。在过去的几十年中,图形处理单元 (GPU) 已经从能够在屏幕上绘制图像的专用硬件设备发展为能够执行复杂并行内核的通用设备。如今,几乎每台计算机都包括一个 GPU 和一个传统的 CPU,许多程序可以通过将部分并行算法从 CPU 卸载到 GPU 来加速。
OneAPI 是一种提供统一编程模型以简化跨不同架构的开发的解决方案。它包括用于表达并行性的统一和简化的语言和库,并在包括CPU、GPU、FPGA在内的一系列硬件上提供不折不扣的原生高级语言性能。oneAPI 计划基于行业标准和开放规范,可与现有 HPC 编程模型互操作。OneAPI是英特尔在SuperComputing 2019上首次提出的愿景,希望能统一计算和简化的跨体系结构编程模型,开放成为行业标准,为各种不同硬件提供毫不妥协的性能。
Data Parallel C++ (DPC++) 是 oneAPI 对 SYCL 编译器的实现。它利用现代 C++ 生产力优势和熟悉的结构,并结合了数据并行和异构编程的SYCL标准。DPC++ 是一种单一源语言,其中主机代码和异构加速器内核可以混合在同一个源文件中。在主机上调用 DPC++ 程序并将计算卸载到加速器。程序员使用熟悉的 C++ 和具有附加功能的库结构,例如用于工作目标的队列、用于数据管理的缓冲区和parallel_for用于指示应该卸载哪些计算和数据部分的并行性。
notion image

DPC++程序设计大致可分为以下5个步骤:

1)申请Host内存。
2)创建SYCL缓冲区并为其定义访问缓冲区内存的方法。在这方面,设备(device)和主机(host)可以共享物理内存或具有不同的内存。当内存不同时,卸载计算需要在主机和设备之间复制数据。而通过创建缓冲区(buffer)和访问器(accessor)的方式,DPC++就不需要程序员自己管理数据复制,其能够对程序员透明地确保数据可供主机和设备使用。
3)创建队列以向device(包括Host)提交工作(包括选择设备和排队),默认地使用q.submit([&](handler& h) {//commands});这样的语句实现。
4)调用oneAPI的kernel函数在device上完成指定的运算,与上面类似,这在代码编写过程中一般也采用lambda表达式实现:h.parallel_for(range<1>(NUM), [=](id<1> i){//do something for each i});
5)将SYCL缓冲区的数据读回Host端。
GEMM (GEneral Matrix Multiplication) 即通用矩阵乘法,由于其作为CNN(卷积神经网络)算法必要的基础算法,因此在机器学习、尤其是处理天然具有矩阵形式的图像的计算机视觉(CV)等领域相当重要,如何优化其运行时间已经成为热门话题。

CPU架构的特点:

  • 包含少数的、复杂的内核;
  • 能够很好地执行不规则操作;
  • 可以运行操作系统,控制多个IO,指针操作等。

GPU架构的特点:

  • 包含数以百计的简单内核,在一个共同的存储器上运行(如PRAM模型);
  • 计算能力强,但内存延迟高(1:500);
  • 没有缓存、预取等功能;
  • 需要高计算密集以获得良好的性能;
  • 可以进行 图形渲染、图像/信号处理、矩阵操作、FFT等。
我们可以发现GPU比CPU核的通用性差, 没有缓存、分支预测、失序执行等。在相同的硅片面积上GPU可封装更多的内核。但是GPU擅长于数据并行处理,在许多数据元素上并行执行相同的计算,每次内存访问有许多计算。数据元素可以隐藏内存访问延迟,没有大的数据缓存。

GEMM 通用矩阵乘法

本此设计选用GEMM(通用矩阵乘法)为研究对象,分别对不同大小规模的矩阵应用于CPU,GPU上进行并行化测试。利用Intel云服务器整理及分析其程序时间数据,并结合SYCL框架的特点从算法上寻找对于时间性能优化的可能性。利用局部分组再并行处理的数学理论思想,成功移植到了代码层面,验证了OneAPI异构编程的兼容性与可行性。研究的最后讨论了一些其他在未来值得被关注和提升的点。

论文部分如下:

OneAPI 发展

其使用英特尔主导的DP C++编程语言,相关编程书籍已经在网上免费提供。
经过一年的发展,oneAPI日趋完善,现在不仅支持DP C++,也支持优化的Python。
在软件工具库方面,英特尔一口气拿出了7个,涵盖数学、人工智能、视频处理等场景,使开发者能够快速获得最佳性能和跨体系结构支持。
在英特尔自家的硬件产品上,基于oneAPI编写的程序可以轻松无缝移植。比如一个在至强处理器上运行的目标检测模型,开发者只需将设备名称这一行代码从CPU更改成XEHP,即可在Xe显卡上运行。
notion image
oneAPI还是全行业的开放标准,任何厂商都可以使用。因此oneAPI获得了行业支持,包括微软Azure和谷歌TensorFlow最近的认可,美国阿贡国家实验室、伊利诺伊大学都在使用oneAPI。
notion image
行业中的机构和企业正在努力为oneAPI提供对AMD、英伟达硬件的支持:
  • 软件公司Codeplay公布了第一版针对英伟达GPU的D PC ++编译器;
  • 海德堡大学计算中心宣布建立oneAPI CoE,重点是为AMD GPU提供oneAPI支持。
英特尔正努力搭建oneAPI的软件生态,甚至已经有企业开始将基于CUDA的产品移植到oneAPI上。
柏林Zuse研究所将他们的海浪模拟商业应用EasyWave进行了移植后,支持了CPU、Xe GPU、Stratix FPGA以及英伟达GPU。