第一章:简介
本章涵盖了一些核心概念,术语来奠定基础。
这是一个sycl程序,使用dpc++编译器进行编译并运行,我们将会得到一下内容:Hello,World
我们在学习完第四章之后将会完全理解这段代码。首先代码第一行定义了sycl结构,第三行设定设用sycl命名空间,第十一行向设备请求建立队列,第十三行建立主机与设备之间的共享数据,第十六行将工作队列排队到设备上,第十七行是一个在设备上运行的内核代码。通过parallel_for()我们可以将内核运行在每一个字符上将secret string解码为result string。对于程序来说代码运行没有顺序而言,因为主程序的运行对于并行队列来说是异步的。所以对于第十八行的.wait()来说是很重要的,我们需要确保内核以及完成否则我们的输出可能会在解码之前。
在第二章我们将会讲到队列和操作(Queues and Actions)队列是连接设备工作的唯一方式。并且我们需要理解到请求操作不需要等待便可以被放入到队列当中,主机在向队列提交一个操作后将会继续执行该程序,设备将会异步的执行队列请求。
异构系统指的是包含多种类型的计算设备的系统的任何系统,例如一个cpu与一个gpu组成的系统,当我们拥有多种类型的设备的时候,每个设备都具有不同的架构,因此就有不同的特性,导致每个设备有不同的编程和优化需求。这就是我们学习sycl以及dpc++的动机。
Host 每个程序都在主机上运行,程序当中绝大部分都是在主机上运行。
Devices 在一个程序当中使用多个设备实现异构编程,设备可以是gpu,fpga,cpu或是其他的。设备是sycl用来加载的目标,卸载计算是将工作转移到一个可以加速工作完成的设备上,但同时我们需要考虑到数据转移的时间。
异步 异步的性质是因为程序通过请求操作的“队列”转移到设备。主机程序将请求的操作提交到队列中,程序继续而不等待任何结果。这种不等待很重要,因此我们可以尝试保持计算资源(设备和主机)一直繁忙。如果我们必须等待,这将占用主机,而不是允许主机做有用的工作。
数据竞争 在之前的图1-1当中 我们在第18行进行了等待以防止第20行的在解码之前输出,事实上添加wait()会强制实现内存和内核之前的主机同步,这与之前让设备保持繁忙的建议相反,这就需要我们做出取舍来平衡程序。
c++ lambda函数 内核可以用多种方式来表示,最常见的一种表达方式便是lambda函数,我们在图1-1的程序中以及遇到了,他以[=]开始,[ ] 中的内容表示以何种方式捕获在lambda函数之前的内容。对于内核,捕获必须由值表示,该值由方括号中包含一个等号表示。具体内容可以查阅一下lambda函数的基本语法
并发性与并行性