赞
踩
最后更新日期:2014-05-02
阅读前提:《C++ AMP介绍(一)》
环境:Windows 8.1 64bit英文版,Visual Studio 2013 Update1英文版,Nvidia QuadroK600 显卡
介绍C++ AMP的 array、array_view、extent类和平铺的知识。
数据的移动
array和 array_view两个数据容器(模板类)用于把数据从运行时库(CPU)移到加速器(显卡或通用计算卡)上,array类在构造时建立数据的深拷贝,把数据复制到加速器(GPU)上,而array_view类是个包装类,仅仅当核心函数(kernel function)要用到数据时,才把源数据复制到加速器上。
- #include <amp.h>
- using namespace concurrency;
-
- //演示array类的使用方式
- void test_array()
- {
- //测试数据
- std::vector<int> data(5);
- for (int count = 0; count < 5; count++)
- {
- data[count] = count;
- }
-
- //构造array实例
- array<int, 1> a(5, data.begin(), data.end());
-
- parallel_for_each(
- a.extent,
- [=, &a](index<1> idx) restrict(amp)
- {
- a[idx] = a[idx] * 10;
- }
- );
-
- //array实例a不需要调用同步方法
- //但是需要赋值给data
- data = a;
-
- //输出0,10,20,30,40
- for (int i = 0; i < 5; i++)
- {
- std::cout << data[i] << "\n";
- }
- }
array_view同array之间几乎有相同的成员,但是它们底层的行为不一样,所以当你建立两个指向同一个数据源的array_view实例时,实际上它们指向同一个内存地址,数据只有当需要的时候才会被复制到加速器中,所以你得注意数据的同步,array_view类的主要好处是数据仅当要被加速器用到的时候才会被移动。
共享内存是能被CPU和GPU访问的内存,array类可以控制共享内存的存取方式,但是首先我们需要测试加速器是不是支持共享内存,下面是array使用共享内存的示例代码。
- int test_sharedMemory()
- {
- // 一台计算机中可能有多块加速器,取默认加速器
- accelerator acc = accelerator(accelerator::default_accelerator);
-
- // 测试默认加速器是否支持共享内存
- if (!acc.supports_cpu_shared_memory)
- {
- std::cout << "The default accelerator does not support s
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。