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. Swift教程之枚举语法

    import Foundation //MARK:-------枚举语法----------- //不像 C 和 Objective-C 一样.Swift 的枚举成员在被创建时不会被赋予一个默认的整数 ...

  2. Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied) nginx 启动失败

     Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied)     nginx 启动失败 ...

  3. 游戏编程之Unity常用脚本类的继承关系

    前言学习Unity开发引擎的初学者会接触大量的脚本类,而这些类之间的关系往往容易被忽略.本文对Unity引擎开发中的一些常用类及其关系进行了简单的归纳总结. 博文首发地址:http://tieba.b ...

  4. Python脚本报错AttributeError: 'module' object has no attribute 'maketrans'

    出现此错误的原因:是此文件smtp02.py 所在的目录下有string.pyc 的文件存在,与python库里的string.pyc冲突造成无法确认编译所取的类库.

  5. .NET:CLR via C# User-Mode Constructs

    The CLR guarantees that reads and writes to variables of the following data types are atomic: Boolea ...

  6. unity3d摄像机参数

    1. Clear Flags:清除标记.决定屏幕的哪部分将被清除.一般用户使用对台摄像机来描绘不同游戏对象的情况,有3中模式选择: Skybox:天空盒.默认模式.在屏幕中的空白部分将显示当前摄像机的 ...

  7. google protocol buffer的原理和使用(二)

    本文主要会介绍怎么使用Google Protocol的Lib来序列化我们的数据,方法非常多种,本文仅仅介绍当中的三种.其它的方法读者能够通过自行研究摸索.但总的来说,序列化数据总的来说分为下面俩步: ...

  8. C++代码文件名标准化处理工具

    工具功能:批量处理C++代码文件,将C++代码文件名中大写字母改为下划线+小写字母. 为了方便代码在不同平台下的移植,代码文件命名规范为:不使用大写字母,单词之间用下划线间隔开.为此写了这个小工具,将 ...

  9. QT设置centralWidget布局

    QT设置centralWidget布局 设置之前是这样的,这时候即使设置了控件的布局,实际上控件大小还是不会跟这变,因为centralWidget没有设置布局. 需要在没有控件的空白区域,点击右键在布 ...

  10. RequireJS 参考文章

    入门: http://www.cnblogs.com/snandy/archive/2012/05/22/2513652.html http://www.cnblogs.com/snandy/arch ...