矩阵运算也许对于大多数程序员并不重要,所以下面来个更通俗版本的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: Concurrency | VC10 | VC11 |
Reworded sequence points | N/A | N/A |
Atomics | No | Yes |
Strong compare and exchange | No | Yes |
Bidirectional fences | No | Yes |
Memory model | N/A | N/A |
Data-dependency ordering | No | Yes |
Data-dependency ordering: function annotation | No | No |
exception_ptr | Yes | Yes |
quick_exit and at_quick_exit | No | No |
Atomics in signal handlers | No | No |
Thread-local storage | Partial | Partial |
Magic statics | No | No |
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 |