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简介的更多相关文章

  1. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  2. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  3. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  4. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  5. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

  6. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  7. HTTPS简介

    一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...

  8. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  9. Cesium简介以及离线部署运行

    Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...

  10. 1.Hibernate简介

    1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发;           b.大大减少代码量;           c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...

随机推荐

  1. Comet、SSE、Web Socket

    来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(十一) Comet Comet是一种更加高级的Ajax技术("服务器推送&qu ...

  2. unity 3d 获取鼠标当前坐标

    获取当前鼠标position:Input.mousePosition;

  3. hibernate hql 大全

    Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. ...

  4. Android 控制ScrollView滚动到底部

    scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部 scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部 ...

  5. 动态改变QSS

    通常,一旦设置使用setObjectName来初始设置QSS: list_widget = new QListWidget(); list_widget->setObjectName(" ...

  6. 如何引用传递String Boolean 等,并改变他们的值

    如何引用传递String Boolean 等,并改变他们的值 采用list, 在存入位置改变list的值 如 list.add(true); list.remove(0); list.add(fals ...

  7. JavaBean 内省API BeanUtils工具 泛型 xml xml约束

    1 什么是JavaBean?有何特征? 1)符合特定规则的类    2)JavaBean分二类:     a)侠义的JavaBean         .私有的字段(Field)         .对私 ...

  8. 【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+..+ ...

  9. openSession()和getCureentSession()的区别

    openSession():永远是打开一个新的session getCureentSession():如果当前环境有session,则取得原来已经存在的session,如果没有,则创建一个新的sess ...

  10. JS 打印报表

    <script type="text/javascript"> window.print(); </script> 前台页面: <%@ Page La ...