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;}


原创粉丝点击