C++ AMP 介绍(二)
最后更新日期: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