西交与清华北航杭电等高校合作的一个项目,做并行计算统一编程模型的,要用到实现 sycl 标准的 DPC++,所以就学习一下做个记录。

01 introduction

一些术语的简单描述。

  • 队列与操作: 队列将连接到设备,我们将操作提交到队列中,从而进行计算或数据移动,行为是异步发生的。
  • 异构系统: 异构系统指包含多种类型计算设备的系统,比如同时有中央处理器 CPU 和图形处理单元 GPU 的系统。SYCL 是为了解决异构系统中数据并行编程挑战而设计的。
  • 主机: 程序从主机开始运行,大部分代码为主机编写。一般来说,主机就是 CPU。
  • 设备: 加速设备,sycl 将一些工作转移到加速设备上进行。
  • 内核代码: 设备端执行的代码称为内核代码。

Lambda 表达式

1
[capture-list](params)->ret body
  • capture-list 表示获取的变量,可以按值捕获 [=] ,也可以按引用捕获 [&],还可以空捕获 []
  • params 是参数列表。sycl 提供了一些参数来标识正在调用内核处理的元素:这可以是一维的 id,也可以是二维或三维的 id。
  • ret 是返回类型。
  • body 是函数体。

02 where code runs

SYCL 程序可以是单个源文件,既包含在 CPU 上运行的主机代码,又包含在 SYCL 设备上运行的设备代码。

主机代码由操作系统启动 CPU 执行应用。设备对应加速器或处理器,在逻辑上独立于执行主机代码的 CPU。队列是一种将工作提交给设备执行的机制。

  • 主机端代码会异步执行。主机程序在 submit在设备上启动前 执行。
  • 对设备代码有限制。设备代码不支持动态内存分配和运行时类型信息。
  • SYCL 定义的一些函数和查询只能在设备代码中使用。

设备的选择

  1. 不关心使用哪个设备时,随意在哪个地方运行设备代码均可。
  2. 在主机设备上显示地运行设备代码,这通常用于调试的时候,保证程序在没有设备的情况下也能跑起来。
  3. 将设备代码分配到 GPU 或加速器上。
  4. 将设备代码分配到异构设备集。如同时分配到 GPU 和 FPGA 上。
  5. 从更一般的设备类别中选择特定的设备。从一组可用的 FPGA 类型中选择特定类型的 FPGA。

开发人员通常会使用方法 2 调试代码,并且只有在使用方法2对代码进行了实际测试后,才会使用方法 3-5 。

队列 绑定到单个设备,提交给队列的工作是在该队列绑定的设备上执行的。程序中可以创建多个队列,让每个队列与不同设备绑定。多个不同的队列也可以绑定到单个设备上。构造队列时选择设备是通过设备选择器实现的。

设备代码的开发通常的方法,是在部署到高性能计算集群进行性能测试和优化之前,在本地系统上开发和测试设备代码。因此主机可以像任何加速器一样执行设备代码。

五种常用的内置选择器:

  • default_selector 默认选择设备
  • host_selector 选择主机
  • cpu_selector 选择 CPU 设备
  • gpu_selector 选择 GPU 设备
  • accelerator_selector 选择一个标识为 加速器 的设备,如 FPGA

当设备选择失败时,会抛出runtime_error异常。

03 data_management