C++与SYCL异构编程学习(二)

第一章:简介

本章涵盖了一些核心概念,术语来奠定基础。

Hello, World! and a SYCL Program Dissection

 这是一个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函数的基本语法

 并发性与并行性

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值