C++AMP的“入口”即parallel_for_each,只有控制线程次数.extent和lambda表达式两个参数。
简单理解任何可以适用表达式的地方都能适用lambda表达式,所有的lambda表达式都会以[]作为前缀,但是方括号可能不会像下面这样为空。这被称为“捕获字句”,()是lambda参数,{}为lambda表达式的内容。lambda表达式不需要写在单独的一行,它的写法没有限制。
std::for_each(v.begin(),v.end(),[](int i) {std::cout<<i<<endl;});
parallel_for_each函数是C++AMP的核心,也是并行操作发生的地方,我们可以构造数组然后给它赋值,也可以构造array_view,std::vector等CPU密集型数据结构中的数据。之后可以使用parallel_for_each遍历数组中的每个元素,或者适用array_view,或者访问部分数据。parallel_for_each的操作extent对象,其控制执行线程的数量。
parrallel_for_each(v.extent,[=](index<1> idx)restrict(amp) {kernel执行体});
要执行{}里面的内容也简称kernel(运行在GPU上的代码)有以下三个特征:
- 返回值类型是void。不管什么计算都应该在一个或多个数组视图中保存。
- 要使用restrict(amp)或者restrict(amp,cpu)标记;
- 仅能使用amp_math.h含有的函数,也就是说仅调用代码生成时显式使用restrict(amp)或者restrict(amp,cpu)标记的函数;
- 参数不能按引用传值(除了数组实例以为),按值传入是可以的。