Hello C++ AMP!(2)

矩阵运算也许对于大多数程序员并不重要,所以下面来个更通俗版本的AMP:

复制代码
 1 #include <iostream>
2 #include <amp.h>
3
4 int main()
5 {
6 int nickName[6]{'a', 96, 'd', 'r', 'j', 'x'};
7 concurrency::array_view<int> myView(6, nickName);
8 concurrency::parallel_for_each(myView.extent,
9 [=] (concurrency::index<1> idx) restrict(amp)
10 {
11 myView[idx] += 1;
12 }
13 );
14 for(int i = 0; i<6; ++i)
15 std::cout<<(char)myView[i];
16 return 0;
17 }
复制代码

在没有运行前,你知道输入的是什么吗?先不急着公布答案,先来说说其中的“内涵”。

首先,你是无法通过编译的。因为Line 6我使用了c++11里的初始化方式。默认情况下是无法通过编译的,你要改成

int nickName[6] = {'a', 96, 'd', 'r', 'j', 'x'};

是的,目前vs11不支持initialize list。

其次你可能会问,为什么nickName不是char类型的而是int类型的。最直白的回答就是array_view不支持char,最少也要是int。

具体我们可以看array_view的声明:

template <typename _Value_type, int _Rank = 1>
class array_view : public _Array_view_base<_Rank,sizeof(_Value_type)/sizeof(int)>
{
//为了便于阅读,省略此处代码
}


array_view在上一篇文章中提到过,这里重申下,通俗来讲他类似与一个迭代器。他提供了parallel_for_each需要用的index接口。

restrict是个非保留字符,他只是在当前语境中才有作用。这个“提示符”负责告诉编译器,程序员意图要生成什么程序。是cpu呢还是amp,amp的意思就是使用加速器。

什么是加速器(Aaccelerator)?就是另一个可以并行计算的设备,比如你的显卡GPU,比如其他支持SIMD的向量处理器,比如你通过OS驱动模拟的处理器等。另外,早期amp的前身是字符串“direct3d”,现在替换为amp了。如果你看资料发现了“direct3d”,不要太奇怪。

kernel,就是要运行在加速器上的代码。

本示例的kernel就一句:

myView[idx] += 1;

显然是对myNickName所有字符+1.现在你该明白输出什么了吧?

下面给个VS11对c++ 11的支持度(visual studio only _):

 

 

C++11 Core Language Features: C99 VC10 VC11
__func__ Partial Partial
C99 preprocessor Partial Partial
long long Yes Yes
Extended integer types N/A N/A



posted on   Meta.Grfx  阅读(1676)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示