C++AMP介绍(一)

最后更新日期:2014-05-02

阅读前提

环境:Windows 8.1 64bit英文版,Visual Studio 2013 Professional Update1英文版。Nvidia QuadroK600 显卡

内容简单介绍

介绍C++ AMP怎样使用加速器(GPU)的并发运行能力。通过两个尽可能简洁的程序,让用户了解到怎样把AMP应用到自己的程序开发其中。

正文

C++AMP (C++ Accelerated Massive Parallelism)利用并行硬件(比如独立图形加速卡)的性能。加速你C++程序的运行速度,C++ AMP编程模型包含支持多维数组。索引。内存传输和平铺,包含数学函数库。你能够使用C++ AMP更广泛的控制CPU同GPU之间数据的传递。

C++ AMP要求你的显卡完整支持DirectX11硬件特性。

在Visual Studio上建立Win32 控制台项目。以下是我第一个C++AMP应用程序源码

#include "stdafx.h"

#include <amp.h>
#include <iostream>
using namespace concurrency; const int size = 5; void CppAmpMethod() {
int aCPP[] = { 1, 2, 3, 4, 5 };
int bCPP[] = { 6, 7, 8, 9, 10 };
int sumCPP[size]; //concurrency::array_view是AMP的数据包装器。可作为智能指针使用,代表了一维或多维数组。
//第一个模板參数是数据类型,第二个模板參数是维度。 //第一个构造參数是数组中元素的数量,第二个构造參数是数组
array_view<const int, 1> a(size, aCPP);
array_view<const int, 1> b(size, bCPP);
array_view<int, 1> sum(size, sumCPP); //调用dsicard_data方法。是为了避免sum包装器中的数据拷贝到GPU
//此方法的调用不能出如今有restrict(amp)约束的上下文(代码段)中
sum.discard_data(); parallel_for_each(
//sum.extent代表计算域,在这上面将会建立线程集合
//由于数组中有5个元素。所以会建立5根线程分别执行
sum.extent,
//Lambda表达式定义在加速器上各个线程将会执行的代码
//restrict(amp)是Microsoft AMP引入的约束符号,要求Lambda执行在GPU上
//默认值是restrict(cpu)约束在CPU上执行。所以不加约束能够在不论什么标准C++编译器中正确编译
//约束还能够是restrict(cpu,amp),没有其他。
//index类用来索引array_view中的元素,index模板參数表示idx的维度
[=](index<1> idx) restrict(amp)
{
//restrict(amp)约束使lambda表达式无法捕获到外面的引用型和指针型变量
//仅仅能使用concurrency::array_view容器,输入输出数据
sum[idx] = a[idx] + b[idx];
}
); // 打印输出结果. 正确的输出应该是 "7, 9, 11, 13, 15".
for (int i = 0; i < size; i++) {
std::cout << sum[i] << "\n";
} //更新sum包装器指向的数据源,即sumCPP中的数据(元素)
sum.synchronize(); // 打印输出结果. 正确的输出应该是 "7, 9, 11, 13, 15".
for (int i = 0; i < size; i++) {
std::cout << sumCPP[i] << "\n";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
CppAmpMethod(); system("pause"); return 0;
}

第二个C++ AMP程序演示怎样自己编写带restrict(amp)修饰的函数。以及怎样调用它。

#include "stdafx.h"

#include <amp.h>
#include <amp_math.h>
#include <iostream>
using namespace concurrency; const int size = 5; //带restrict(amp)约束的函数仅仅能使用C++标准的子集,称为kernel函数,
//在GPU上执行。仅仅能被带有restrict(amp)约束的上下文(代码段)调用
void AddElementsWithRestrictedFunction(
index<1> idx, array_view<int, 1> sum, array_view<int, 1> a, array_view<int, 1> b) restrict(amp)
{
sum[idx] = a[idx] + b[idx];
} void AddArraysWithFunction() { int aCPP[] = { 1, 2, 3, 4, 5 };
int bCPP[] = { 6, 7, 8, 9, 10 };
int sumCPP[5]; array_view<int, 1> a(5, aCPP);
array_view<int, 1> b(5, bCPP);
array_view<int, 1> sum(5, sumCPP);
sum.discard_data(); parallel_for_each(
sum.extent,
[=](index<1> idx) restrict(amp)
{
//调用restrict(amp)约束的函数
AddElementsWithRestrictedFunction(idx, sum, a, b);
}
); for (int i = 0; i < 5; i++) {
std::cout << sum[i] << "\n";
}
} /*
C++ AMP 带了两个数学库。 在名字空间Concurrency::precise_math的双精度库,也提供单精度数学函数。
在Concurrency::fast_math名字空间的单精度库,仅仅提供单精度数学函数。
能够使用accelerator::supports_double_precision属性推断GPU是否支持双精度库。
这些带restrict(amp)约束的数学函数在<amp_math.h>头文件里声明。
标准C++库<cmath>头文件里声明的数学函数在fast_math和precise_math空间中都能找到。 */
void MathExample() { double numbers[] = { 1.0, 10.0, 60.0, 100.0, 600.0, 1000.0 };
array_view<double, 1> logs(6, numbers); parallel_for_each(
logs.extent,
[=](index<1> idx) restrict(amp) {
logs[idx] = concurrency::fast_math::log10(logs[idx]);
}
); for (int i = 0; i < 6; i++) {
std::cout << logs[i] << "\n";
}
} int _tmain(int argc, _TCHAR* argv[])
{
//測试这里写的带restrict(amp)约束的函数
AddArraysWithFunction(); //測试C++ AMP提供的带restrict(amp)约束的数学函数
MathExample(); system("pause"); return 0;
}

如今你应该已经学会了C++AMP的编程方式,下一篇介绍C++ AMP关于性能优化方面的基本知识。

參考资料

http://msdn.microsoft.com/zh-cn/library/vstudio/hh265136(v=vs.120).aspx

http://blogs.msdn.com/b/nativeconcurrency/archive/2011/09/13/c-amp-in-a-nutshell.aspx

C++ AMP (C++ Accelerated MassiveParallelism)

http://msdn.microsoft.com/zh-cn/library/hh265137.aspx

C++AMP介绍(一)的更多相关文章

  1. CSS3 background-image背景图片相关介绍

    这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...

  2. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  3. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

  4. Linux下服务器端开发流程及相关工具介绍(C++)

    去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...

  5. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  6. HTML DOM 介绍

    本篇主要介绍DOM内容.DOM 节点.节点属性以及获取HTML元素的方法. 目录 1. 介绍 DOM:介绍DOM,以及对DOM分类和功能的说明. 2. DOM 节点:介绍DOM节点分类和节点层次. 3 ...

  7. HTML 事件(一) 事件的介绍

    本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...

  8. HTML5 介绍

    本篇主要介绍HTML5规范的内容和页面上的架构变动. 目录 1. HTML5介绍 1.1 介绍 1.2 内容 1.3 浏览器支持情况 2. 创建HTML5页面 2.1 <!DOCTYPE> ...

  9. ExtJS 4.2 介绍

    本篇介绍ExtJS相关知识,是以ExtJS4.2.1版本为基础进行说明,包括:ExtJS的特点.MVC模式.4.2.1GPL版本资源的下载和说明以及4种主题的演示. 目录 1. 介绍 1.1 说明 1 ...

  10. ExtJS 4.2 组件介绍

    目录 1. 介绍 1.1 说明 1.2 组件分类 1.3 组件名称 1.4 组件结构 2. 组件的创建方式 2.1 Ext.create()创建 2.2 xtype创建 1. 介绍 1.1 说明 Ex ...

随机推荐

  1. antd 父组件获取子组件中form表单的值

    还是拿代码来讲吧,详情见注释 子组件 import React, { Component } from 'react'; import { Form, Input } from 'antd'; con ...

  2. TASKER 手机在有同一个号码的三个未接电话时自动回复短信

    http://tieba.baidu.com/p/3695018030 感谢默默为Tasker吧奉献的人! 配置为>未接来电 任务为>代码>javascriptlet 代码为: va ...

  3. SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】

    今天运行壹個小程序,功能是读取指定目录下的 SQL 脚本,并加载到内存中批量执行,之前的程序运行良好.但是今天相关开发人员更新了其中壹個 SQL 脚本,于是程序运行的时候就出错了,错误提示信息如下:批 ...

  4. GDB高级用法

    http://blog.csdn.net/wwwsq/article/details/7086151

  5. js判断手机端和pc端

    var browser = { versions: function() { var u = navigator.userAgent, app = navigator.appVersion; retu ...

  6. iOS中bundle的意义

    什么是bundle? bundle就是一个文件夹,按照一定标准组织的目录结构.每个iOS APP至少有一个main bundle,这个main bundle包含了app的二进制代码及任何你用到的资源, ...

  7. wrap ConcurrentDictionary in BlockingCollection

    ConcurrentDictionary<int, BlockingCollection<string>> mailBoxes = new ConcurrentDictiona ...

  8. Windows X64汇编入门(1)

    最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助.我也是刚接触这方面知识,文中肯定有错误之处,大家多指正.文章的标题包含了本文的四方面主要内容: ...

  9. 使用navicat工具创建MySQL存储过程

    使用Navicat for MySQL工具创建存储过程步骤: 1. 新建函数(选择函数标签 -> 点击新建函数): 2.输入函数的参数个数.参数名.参数类型等: 3.编写存储过程:  代码如下: ...

  10. 第十四章 Executors源码解析

    前边两章介绍了基础线程池ThreadPoolExecutor的使用方式.工作机理.参数详细介绍以及核心源码解析. 具体的介绍请参照: 第十二章 ThreadPoolExecutor使用与工作机理 第十 ...