《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实用程序。

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
6月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
1380 2
|
9月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
1268 3
|
6月前
|
IDE 编译器 开发工具
msvcp100.dll,msvcp120.dll,msvcp140.dll,Microsoft Visual C++ 2015 Redistributable,Visual C++ 运行库安装
MSVC是Windows下C/C++开发核心工具,集成编译器、链接器与调试器,配合Visual Studio使用。其运行时库(如msvcp140.dll)为程序提供基础函数支持,常因缺失导致软件无法运行。通过安装对应版本的Microsoft Visual C++ Redistributable可解决此类问题,广泛应用于桌面软件、游戏及系统级开发。
753 2
|
7月前
|
并行计算 C++ Windows
|
安全 编译器 C++
Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?
这些是Microsoft Visual C++不同版本的Redistributable安装包,用于32位系统,确保相关应用正常运行。它们提供C++运行时环境,简化部署流程,支持第三方库及框架,并确保应用兼容性。定期更新可修复问题并引入新功能。在空间有限或需解决程序冲突时可考虑删除,但需谨慎操作以防影响应用稳定性和兼容性。删除前请确认无应用依赖,并通过控制面板安全卸载。
3465 1
Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
12月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
457 12
|
10月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
249 0