《C++ AMP:用Visual C++加速大规模并行计算》——3.8 在CPU和GPU之间复制数据

简介:

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

3.8 在CPU和GPU之间复制数据

C++ AMP:用Visual C++加速大规模并行计算
数据可以在CPU和加速器(通常是GPU)之间自动复制,也可以根据需要使用amp.h中众多的copy()重载函数之一显式复制。例如,我们可以在默认加速器上构造array,然后仅使用一条函数调用便可以把数据复制进去:

array<int, 1> a(5, v.begin(), v.end());
此外,我们还可以构造空数组,然后再使用copy()函数来加载数据。array_view在CPU上有一个对应容器,当加速器上的array_view开始处理时,array_view会自动把数据复制到加速器里,并把发生变化的数据同步回去在CPU上使用,如3.5节所述。

这两段代码段是等价的:

std::vector<int> v(5);                std::vector<int> v(5);
std::iota(v.begin(), v.end(), 0);          std::iota(v.begin(), v.end(), 0);
array<int,1> a(5,v.begin(),v.end());        array_view<int,1> av(5,v);
parallel_for_each(a.extent, [&](index<1> idx)   parallel_for_each(av.extent, [=]                                 (index<1> idx)
  restrict(amp)                      restrict(amp) 
{                             {
  a[idx] = a[idx] * 2;                  av[idx] = av[idx] * 2;
});                            });  
copy(a,v);                        av.synchronize();```
如果要在`parallel_for_each`之后访问CPU上的`array_view`,它将自动同步,因此我们可以忽略这条调用。这是使用`array_view`最大的优势所在。

当然,自动复制如非真正需要便会造成性能受损。C++ AMP让我们可以真正控制自动复制。在声明`array_view`的时候,我们可以给编译器一个暗示,说明数据将要发送到加速器上,但不会在那里改变:

`array_view<const int, 1> a(5, v);`
这么做会防止自动将加速器数据复制返回。这种聪明的关键词和概念复用方法,已为C++开发者所熟知。我们还可以暗示无需把初始值复制到加速器里,因为核函数会重写这些初始值,例如:
AI 代码解读

array_view out(5, v2);
out.discard_data();`
C++里没有writeonly关键词(或anti_const),因此我们要代而使用这种函数调用。

还有一种方法可以从array_view中取出数据并返还给它所包装的CPU集合,以便array_view作析构之用。例如,这种代码即使在没有调用synchronize的情况下,也可以让计算结果出现在std::vector v2中:

std::vector<int> v(5), v2(5, 0);
std::iota(v.begin(), v.end(), 0);
// braces for scope only
{
  array_view<const int, 1> a(5, v);
  array_view<int, 1> out(5, v2);
  out.discard_data();
  parallel_for_each(a.extent, [=](index<1> idx) restrict(amp)
  {
    out[idx] = a[idx] * 2;
  });
}```
对于数组视图来说,作用域结束的时候就会自动执行复制,这时const暗示的重要性就凸显出来了,因为我们不需要把没有改变的值从a复制回v,而暗示会阻止这种操作的发生。

任何时候,我们都可以显式地从一个数组把数据复制到另一个数组,或者从一个array_view把数据复制到另一个,或者从一个数组复制到std::vector等位于CPU的集合中。复制的两个参数分别是源和地址。

注意事项:
受限于对标准库方法的掌握程度,我们会发现要想记住参数顺序并非很容易,标准库方法大多以源作为第一个参数,而C风格函数一般会把目标作为第一个参数。但是,我们必须要选择一个参数顺序,它可能更像是标准库而不像C。C++ AMP的设计师一般要遵循C++约定,而非C约定。如果需要提示,`IntelliSense`会提醒我们。
AI 代码解读
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
打赏
0
0
0
0
1811
分享
相关文章
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
9天前
|
【Azure App Service】对App Service中CPU指标数据中系统占用部分(System CPU)的解释
在Azure App Service中,CPU占比可在App Service Plan级别查看整个实例的资源使用情况。具体应用中仅能查看CPU时间,需通过公式【CPU Time / (CPU核数 * 60)】估算占比。CPU百分比适用于可横向扩展的计划(Basic、Standard、Premium),而CPU时间适用于Free或Shared计划。然而,CPU Percentage包含所有应用及系统占用的CPU,高CPU指标可能由系统而非应用请求引起。详细分析每个进程的CPU占用需抓取Windows Performance Trace数据。
71 40
Jetson 学习笔记(八):htop查看CPU占用情况和jtop监控CPU和GPU
在NVIDIA Jetson平台上使用htop和jtop工具来监控CPU、GPU和内存的使用情况,并提供了安装和使用这些工具的具体命令。
299 0
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
38 13
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
28 5
|
5月前
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
61 0
GPU加速和CPU有什么不同
【10月更文挑战第20天】GPU加速和CPU有什么不同
120 1
使用GPU 加速 Polars:高效解决大规模数据问题
Polars 最新开发了 GPU 加速执行引擎,支持对超过 100GB 的数据进行交互式操作。本文详细介绍了 Polars 中 DataFrame(DF)的概念及其操作,包括筛选、数学运算和聚合函数等。Polars 提供了“急切”和“惰性”两种执行模式,后者通过延迟计算实现性能优化。启用 GPU 加速后,只需指定 GPU 作为执行引擎即可大幅提升处理速度。实验表明,GPU 加速比 CPU 上的懒惰执行快 74.78%,比急切执行快 77.38%。Polars 的查询优化器智能管理 CPU 和 GPU 之间的数据传输,简化了 GPU 数据处理。这一技术为大规模数据集处理带来了显著的性能提升。
151 4
MinerU-大语言语料处理神器,CPU/GPU均可跑,开源免费“敲”好用
在7月4日举行的WAIC 2024科学前沿主论坛上,书生·浦语2.5正式发布,面向大模型研发与应用的全链条工具体系同时迎来升级。
MinerU-大语言语料处理神器,CPU/GPU均可跑,开源免费“敲”好用

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等