8.1.C++ AMP简介
C++ AMP是专为设计支持C++的异构并行模型.
全程是: Accelerator Massive Parallelism
下面是一个Vector C++ AMP的代码,通过这段代码来解释C++ AMP的语法:
#include <amp.h>
using namespace concurrency;
void vecAdd(float* A, float* B, float* C, int n)
{
array_view<float,> AV(n,A), BV(n,B);
array_view<float,> CV(n,C);
CV.discard_data();
parallel_for_each(CV.get_extent(), [=](index<> i)
restrict(amp) {
CV[i] = AV[i] + BV[i];
});
CV.synchronize();
}
1. 头文件amp.h 提供需要用到的函数等的声明
2. using namespace concurrency 作用域包含AMP的函数和类.
3. 模板array_view<T, D> AV<size, name>, T表示数据类型, D表示dimension维度, size表示变量大小,name表示变量名.这个模板的作用就是提供对C++数组的引用,提供一种新的方式访问现有的数组. 可以看出变量 A 和 B是一维的.
4. CV.discard_data(); 表示当前数组C中的数据值是无关紧要的,我理解为可以被覆盖.
AMP kernel函数
parallel_for_each(CV.get_extent(), [=](index<1> i)
restrict(amp) {
CV[i] = AV[i] + BV[i];
});
1. parallel_for_each指定一个计算应用到指定的数据集合中,
2. CV.get_extent(): 就是指定的数据集合,当前实例中,CV是一维的,数据集合的范围是[0,n-1].
3. 第二个参数: [=](index<1> i, 这是一个C++的lambda 表达式:
"=" 这个我理解的是: 把 i索引的数据拷贝到device空间中供kernel函数使用,这个有待进一步考证
关于index<1> i 表示一维的索引,i 表示的是threadIdx.x全局的线程id. 关于这个 index的用法,下面有几个示例有助于理解:
eg1: 这个表示一维索引第2个元素,索引从0开始算起
int aCPP[] = {, , , , };
array_view<int, > a(, aCPP);
index<> idx();
std::cout << a[idx] << "\n";
// Output: 3
eg2: 这个表示二维索引,idx中的第一个元素表示行,第二个元素表示列,所以这个索引的是第二行第三列
int aCPP[] = {, , ,
, , };
array_view<int, > a(, , aCPP);
index<> idx(, );
std::cout << a[idx] << "\n";
// Output: 6
eg3:
int aCPP[] = {
, , , , , , , , , , , ,
, , , , , , , , , , , }; array_view<int, > a(, , , aCPP);
// Specifies the element at 3, 1, 0.
index<> idx(, , );
std::cout << a[idx] << "\n"; // Output: 8
4. restrict(amp) 类似cuda中的"__device__" 表示运行在device上的kernel函数.
5. CV.synchronize(); 同步,等待kernel函数执行完成.
关于C++ AMP的更多信息可以参考这个网址:
https://msdn.microsoft.com/zh-cn/library/hh265137.aspx
8.1.C++ AMP简介的更多相关文章
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- Cesium简介以及离线部署运行
Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...
- 1.Hibernate简介
1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发; b.大大减少代码量; c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- Comet、SSE、Web Socket
来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(十一) Comet Comet是一种更加高级的Ajax技术("服务器推送&qu ...
- unity 3d 获取鼠标当前坐标
获取当前鼠标position:Input.mousePosition;
- hibernate hql 大全
Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. ...
- Android 控制ScrollView滚动到底部
scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部 scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部 ...
- 动态改变QSS
通常,一旦设置使用setObjectName来初始设置QSS: list_widget = new QListWidget(); list_widget->setObjectName(" ...
- 如何引用传递String Boolean 等,并改变他们的值
如何引用传递String Boolean 等,并改变他们的值 采用list, 在存入位置改变list的值 如 list.add(true); list.remove(0); list.add(fals ...
- JavaBean 内省API BeanUtils工具 泛型 xml xml约束
1 什么是JavaBean?有何特征? 1)符合特定规则的类 2)JavaBean分二类: a)侠义的JavaBean .私有的字段(Field) .对私 ...
- 【HDOJ】4351 Digital root
digital root = n==0 ? 0 : n%9==0 ? 9:n%9;可以简单证明一下n = a0*n^0 + a1*n^1 + ... + ak * n^kn%9 = a0+a1+..+ ...
- openSession()和getCureentSession()的区别
openSession():永远是打开一个新的session getCureentSession():如果当前环境有session,则取得原来已经存在的session,如果没有,则创建一个新的sess ...
- JS 打印报表
<script type="text/javascript"> window.print(); </script> 前台页面: <%@ Page La ...