C++AMP学习(2)-数据array&array_view详解
来源:互联网 发布:使用数组储存1825 编辑:程序博客网 时间:2024/06/08 18:23
本节将分别介绍AMP中最重要的数据类型array&array_view。通常情况下,数据存储于主机端,处理过程要在设备端执行。AMP提供了两种数据类型,用于核函数的输入。
(1)array数组:array是实实在在存储在设备端的数据,类似于cudamalloc申请主机内存。唯一不同在于array可以为多维数据。array<T,N>有两个模板参数T(类型),N(维度)。
array声明:"array<int,3> device_a(4,2,2) "是申请4*2*2的设备三维数组。
array初始化:array是利用vector进行初始化,"array<int,1> device_a(5,v.begin(),b.end())" 是利用vector初始化array。
array显式拷贝:将设备结果拷贝至主机端,必须使用copy显式进行。
下面给出一个完整的代码:
#include "iostream"#include "amp.h"#include "vector"#include "algorithm"using namespace concurrency;int main(){const int N = 20000;std::vector<int> v_a(N,0);array<int, 3> a(1,2,10000,v_a.begin(),v_a.end());parallel_for_each(a.extent, [&](index<3> idx) restrict(amp) {a[idx] =2;});concurrency::copy(a,v_a.begin());for_each(v_a.begin(), v_a.end(), [](int x) {std::cout << x << std::endl;});return 0;}(2)array_view数组视图:array_view就像引用一样,有点cuda中统一存储的味道。无论设备在设备,还是主机端,都用array_view"包装"一下,使用过程中可以避免大量的数据拷贝代码,底层会自动实现数据的传输。当然,计算机也不是那么"聪明",有时候还是需要人为控制数据传输,降低存储拷贝给性能带来的影响,AMP也提供了相应的函数。array_view的声明初始化有两种:其一是CPU数据(vector)的"包装",和array一样。"array_view<int,3> av(1,2,3,v.begin(),v.end())"也可以利用av"包装"v。其二是GPU数据(array)的包装,"array_view<int,3> av(array)"使用array初始化av;还可以使用
view_as进行包装array。使用代码如下:
#include "iostream"#include "amp.h"#include "vector"#include "algorithm"using namespace concurrency;int main(){const int N = 20000;std::vector<int> v_a(N,0);array<int, 3> a(1,2,10000,v_a.begin(),v_a.end());array_view<int, 3> av(1,2,1000,v_a);//CPU数据“包装”//array_view<int, 3> av(a);//GPU数据“包装”parallel_for_each(av.extent, [=](index<3> idx) restrict(amp) {av[idx] =2;});av.synchronize();//concurrency::copy(a,v_a.begin());//若选用GPU数据,则需要显式copyfor_each(v_a.begin(), v_a.end(), [](int x) {std::cout << x << std::endl;});getchar();return 0;}
阅读全文
0 0
- C++AMP学习(2)-数据array&array_view详解
- C++AMP中array、array_view、extent类和平铺介绍
- C++ AMP: writeonly becomes discard_data for C++ AMP array_view
- [C学习]赋值&逗号
- C++AMP学习(1)-入门
- dojo学习笔记(二) dojo.lang.array & dojo.lang.func & dojo.string.extras
- linux下C/C++学习 & socket
- Spring.Net&amp;amp;amp;amp;amp;NHibernate 学习
- Uchome1.2 &amp;&amp; 1.5 代码学习——common.php
- HP-UX.将本地磁盘数据备份到磁带.HP9000&tape array 5300
- 回首C&&C++
- Spring.Net&NHibernate 学习 2
- C语言再学习 -- 详解C++/C 面试题 2
- C语言再学习 -- 详解C++/C 面试题 2
- C语言再学习 -- 详解C++/C 面试题 2
- c&cpp常见问题
- const & %c
- const & %c
- Python小白白学习篇之文件与异常
- 走进Spark生态圈:运行程序在Spark集群
- 406. Queue Reconstruction by Height
- java报错-->Property 'xxx' not found on type 包名.类名
- 关于Linux的简单操作命令
- C++AMP学习(2)-数据array&array_view详解
- kickstart
- CCF认证2017-09 通信网络
- JAVA【集合一】集合类
- matlab sort函数
- 【Linux学习】之 Shell(变量、数组)
- javawebday23补充(类似大纲的东西)
- HDU3488 Tour(二分图最小完备匹配,KM算法,转化思想)
- 笔记本Linux系统,修改合盖不休眠