《C++ AMP:用Visual C++加速大规模并行计算》——3.1 array < T,N >

简介:

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

3.1 array < T,N >

C++ AMP:用Visual C++加速大规模并行计算
对于C++ AMP开发者来说,头等重要的就是array。array模板位于concurrency命名空间,有两个参数:一个是集合元素的类型,另一个是秩(rank)或者说维数。我们日常工作中使用的多是一维、二维或三维数组,但C++ AMP并没有限制我们只用到三维,如果我们需要,最多可以用到128维!

正常情况下,array是加速器(一般是GPU)上的一组信息(相同类型的)。array其实是在accelerator_view上:每一类加速器都至少有一个这样的视图。加速器和它们的视图将会在下一节讨论。加速器有默认加速器,每一类加速器也都有自己的默认视图,因此在我们构造数组的同时,也会分配存储空间,例如:

array<int,1> a(5);
这行代码声明了一个一维int数组,由5个元素组成。一般来讲,我们都会指定数组的范围(下面马上会讲到范围的概念),但是一维、二维和三维数组的重载方法很简单:

array<float, 2> b(4, 2);
array<int, 3> c(4, 3, 2);```
上面声明的这三个数组里没有任何值;构造函数只是创建了空数组,我们可以在后面再把元素写入数组。或者,如果我们愿意的话,也可以在创建数组的同时复制加载数据:

`array<int, 1> a(5, v.begin(), v.end());`
在上面这个例子里,v是使用迭代器进行访问的某种容器(我们可以使用std::vector,如果使用begin(v)和end(v)来替换成员函数begin()和end(),还可以使用许多原生C数组)。以此方式来构造数组,会把v里面的数据也复制到a中,因此这些数据也会出现在加速器上。第三个参数是可选项;我们还可以这样来构造数组:

`array<float, 1> a(5, v.begin());`
array的内存布局是限定的;所有的元素都会顺序存储在连续内存块上。两个最低有效索引值相邻的元素在内存上也是相邻的。数组声明的最低有效维是最后一维(最右维)。

从`array`取回数据,必须要显式地声明复制:

`copy(a, v);`
在`concurrency`命名空间里,有很多`copy()`的重载函数,它们都支持`array`(如`array_view`,本章后面会讲到)和各种容器(如std::vector)的数据拷入和拷出。它们都是同步的,当然如果你愿意,也可以使用异步版本。`IntelliSense`或`amp.h`是找出所有同类选择的最佳方案。

数组会与某种加速器视图发生绑定关系。如果系统中只有一种加速器,那么对于选择使用哪个加速器来讲就没有很多的选择,但是你可能还是要使用一种特定视图。如果系统装有多种加速器,而且你想指定代码在哪个加速器上运行,那么就可以选择使用accelerator_view指定在何处构造数组:

`array<float, 1> m(n, v.begin(), av);`
注意事项:
下一节将会讲解如何获得`accelerator_view`,以及如何声明和初始化上面用到的av变量。
下面我们总结array使用的各种构造函数。重载函数数目众多,但均为下例的变形:

`array<float, 1> m(e, v.begin(), v.end(), av);`
这个例子的参数有:范围(`e`),复制源容器的迭代器(`v.begin`),标记复制数据结束点的迭代器(`v.end`),以及加速器视图(`av`)。从这里开始,下述变体均可支持。后面我们将会讨论范围类型;范围在这里用来定义数组的维度。我们可以根据自己的需要混搭使用:

每一个以范围作为头一个参数的构造函数都有三个等价的构造函数,它们取值1、2或者3(指定合适的秩范围),后面跟着与`extent`构造函数相同的参数。
每一个以迭代器对作为参数的构造函数都有一个等价的构造函数,它只有一个迭代器参数,并且复制元素个数由范围参数指定(请注意:该操作不会检查复制源是否有足够多的元素),以及另一个没有迭代器的构造函数,它不会把数据复制到数组当中。
每一个以`accelerator_view`作为参数的构造函数都有一个等价的构造函数,它没有`accelerator_view`参数;它们会使用默认视图。
每一个以`accelerator_view`作为参数的构造函数都有一个等价的构造函数,这个构造函数有另外一个`accelerator_view`参数,其作用是构造临时数组。临时数组(staging array)将会在7.3.2节讲解。
array的这些排列组合能够产生48种构造函数。此外,还有一个构造函数可以从`array_view`出发在特定`accelerator_view`上创建数组并复制视图内容。该构造函数的一个变体没有`accelerator-`
view参数(它使用默认的`accelerator_view`),另一个有两个参数适用于临时数组。因此,构造函数总数是51个。还有一个复制构造函数(深度复制),转移构造函数(`move constructor`),各类复制和移动赋值操作符,但我们可以不管这些内容。微软Visual Studio里的IntelliSense功能是最省事儿的方法,可以保证我们在构造和填充数组时使用正确的参数。
相关文章
|
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++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
缓存 C++ Windows
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
|
编译器 C++ 开发者
Visual Studio属性表:在新项目中加入已配置好的C++库
通过以上步骤可以确保Visual Studio中新项目成功地加入了之前已配置好的C++库。这个过程帮助开发者有效地管理多个项目中共享的库文件,提升开发效率。
721 0

热门文章

最新文章

  • 1
    PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
    246
  • 2
    Java 中数组Array和列表List的转换
    899
  • 3
    JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
    680
  • 4
    通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据和性能优化,reduce()的使用详解(附实际应用代码)
    1486
  • 5
    通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
    611
  • 6
    通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
    440
  • 7
    多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!array.flat()用法与array.flatMap() 用法及二者差异详解
    269
  • 8
    别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
    271
  • 9
    Array.forEach实战详解:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
    167
  • 10
    深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
    690