C++ AMP 介绍(二)

本文是C++ AMP系列的第二部分,主要讲解array、array_view和extent类的数据移动原理,以及如何利用平行_for_each函数进行砖面计算。array在构造时创建数据深拷贝,而array_view在需要时才复制数据。文章还介绍了index类、extent类的使用,并探讨了内存同步、平铺计算和内存屏障的概念。提供了使用tile_barrier同步内存的技巧,并建议使用无符号整数以提升性能。
摘要由CSDN通过智能技术生成

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kagula086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值