《C++ AMP:用Visual C++加速大规模并行计算》——3.2 accelerator与accelerator_view-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

《C++ AMP:用Visual C++加速大规模并行计算》——3.2 accelerator与accelerator_view

简介:

本节书摘来自异步社区出版社《C++ AMP:用Visual C++加速大规模并行计算》一书中的第3章,第3.2节,作者: 【美】Kate Gregory , Ade Miller,更多章节内容可以访问云栖社区“异步社区”公众号查看。

3.2 accelerator与accelerator_view

C++ AMP:用Visual C++加速大规模并行计算
大多数情况下,我们看到“accelerator”(加速器),就会想到“GPU”,但是GPU并非是唯一的加速器,并非所有显卡上都有可用作C++ AMP加速器的GPU(例如,显卡可能不支持DirectX 11)。accelerator对象位于concurrency命名空间,不仅可以表示GPU,还有可能可以表示虚拟加速器,例如Visual StudioWARP(一种CPU侧加速器,使用多核技术和SSE指令)安装的仿真器。accelerator的内存可以装载一个或多个数组,可以在这些数组上执行计算,可以用来优化数据并行计算操作。

函数accelerator::get_all()会返回运行时加速器向量,这样我们就可以根据目标计算机的不同配置,选择不同的代码执行路径。例如,我们可以检查加速器属性,看看它是仿真器还是CPU,这样我们可以做出更有针对性的决策,而不是仅仅了解有没有加速器。我们还可以查询加速器的功能,例如加速器是否支持双精度计算。下面这些常量值可以传递给构造函数,或用于比较:

accelerator::default_accelerator
accelerator::direct3d_warp
accelerator::direct3d_ref
accelerator::cpu_accelerator```
默认构造器是运行时选择的最佳加速器。如果我们有一个硬件加速器,比如说GPU,以及一个参考加速器,那么默认加速器就是GPU。另一方面,在没有合适的显卡的计算机上,默认加速器应该是参考加速器(参考加速器非常慢,实际上并不会对应用产生加速作用,但可用于调试)。在安装了微软Windows 8的机器上,我们不会需要参考加速器,因为我们有WARP可以用来加速应用。

加速器通常都是物理设备。这类设备有可能有好几个逻辑视图。这些视图相互之间是隔离的。加速器是一种隔离资源和执行上下文环境。我们可以让多个线程共享一个视图,也可以在同一个加速器上使用多个单独的视图,消除共享问题。这也是为什么数组构造函数会以accelerator_view作为参数的原因。每一类加速器都有一个默认视图,因此如果你想的是“我要把这个数组放到那个加速器上”,那么你就可以给构造函数传递加速器的默认视图:

accelerator device(accelerator::default_accelerator);
accelerator_view av = device.default_view;
array C(n, av);`
当然,这三行代码的作用和下面这行代码的作用相同:
`
array C(n);`
这行代码能在默认加速器的默认视图上构造数组。因为这行代码更短可读性更高,所以本书中的实例代码都使用这种方法。生产代码往往会创建和使用accelerator_view来获得更多的执行控制权和错误处理能力。如果想要应用程序优雅地处理超时检测与恢复(`Time-Out Detection and Recovery,
TDR)异常,我们就必须要创建唯一的accelerator_view,并在这个逻辑视图上执行代码。这样我们就可以处理与TDR有关的异常,并在新的accelerator_view上重新运行内核。如果应用不重启,就不可能从默认的accelerator_view`上恢复TDR错误。有关TDR的更多细节将在12.6节中讲述。

在自定义加速器视图时,为了实现不同加速器视图上的两个线程的隔离,我们应该选择一种排队模式。模式可以设置成立即的,即在加速器视图(例如,与视图数组相关的复制或parallel_for_
each`)上执行的相关CPU命令会发送到设备上,也可以设置成自动的,即这些命令可以在队列上排队,刷新队列的时候该加速器视图上的命令就会发送到设备上。默认模式是自动的。

发送命令到加速器要涉及到创建DMA缓冲区、命令集以及GPU内存引用。在自动排队模式下构造多条命令使用的一个DMA缓冲区,要比立即模式下针对每条命令都构造一个缓冲区来得更快。(关于排队模式的信息在7.4.6节有更多介绍。)

请记住Windows不会允许一个进程独占GPU太长时间,耗时2秒以上的批处理会被取消(结果会丢失)。如果某些命令运行时间很长,那么立即模式会比自动模式更安全一些。在这样的情形下,构造DMA缓冲区的开销无论如何都会远远小于命令操作的时间,因此这时使用立即模式可能不会有惩罚。面对长时间运行的计算,超时处理以及如何使用加速器视图来最大限度地减少错误,
加速器对象有许多有效属性,它们都有描述信息。了解这些属性后,我们可以使用它们重写第2章讲解的ShowAmpDevices实用程序。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章