Data Parallel CPP 学习笔记
西交与清华北航杭电等高校合作的一个项目,做并行计算统一编程模型的,要用到实现 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 定义的一些函数和查询只能在设备代码中使用。
设备的选择
- 不关心使用哪个设备时,随意在哪个地方运行设备代码均可。
- 在主机设备上显示地运行设备代码,这通常用于调试的时候,保证程序在没有设备的情况下也能跑起来。
- 将设备代码分配到 GPU 或加速器上。
- 将设备代码分配到异构设备集。如同时分配到 GPU 和 FPGA 上。
- 从更一般的设备类别中选择特定的设备。从一组可用的 FPGA 类型中选择特定类型的 FPGA。
开发人员通常会使用方法 2 调试代码,并且只有在使用方法2对代码进行了实际测试后,才会使用方法 3-5 。
队列 绑定到单个设备,提交给队列的工作是在该队列绑定的设备上执行的。程序中可以创建多个队列,让每个队列与不同设备绑定。多个不同的队列也可以绑定到单个设备上。构造队列时选择设备是通过设备选择器实现的。
设备代码的开发通常的方法,是在部署到高性能计算集群进行性能测试和优化之前,在本地系统上开发和测试设备代码。因此主机可以像任何加速器一样执行设备代码。
五种常用的内置选择器:
default_selector
默认选择设备host_selector
选择主机cpu_selector
选择 CPU 设备gpu_selector
选择 GPU 设备accelerator_selector
选择一个标识为 加速器 的设备,如 FPGA
当设备选择失败时,会抛出runtime_error
异常。
03 data_management
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 年雨冰季!