使用 Lambda 表达式、函数对象和受限函数
作为调用中的参数指定 AMP C++ 代码加速器运行所需的 parallel_for_each 方法。您可以为该参数提供 lambda 表达式或函数对象 (型仿函数)。此外,lambda 表达式或函数对象可以调用 C++ AMP 的受限制的功能。本主题使用数组添加算法演示 lambda 函数的对象,以及受限的功能。下面的示例演示不需要 C++ 的存储系统的代码的算法。创建相同的长度的两维数组。添加和存储的第三个维数组中对应的整数元素。不使用 C++ 的存储系统。
void CpuMethod() {
int aCPP[] = {1, 2, 3, 4, 5};
int bCPP[] = {6, 7, 8, 9, 10};
int sumCPP[5];
for (int idx = 0; idx < 5; idx++)
{
sumCPP[idx] = aCPP[idx] + bCPP[idx];
}
for (int idx = 0; idx < 5; idx++)
{
std::cout << sumCPP[idx] << "\n";
}
}
Lambda 表达式
使用 lambda 表达式是重写代码中使用 C++ 的存储系统的最直接方式。
void AddArraysWithLambda() {
int aCPP[] = {1, 2, 3, 4, 5};
int bCPP[] = {6, 7, 8, 9, 10};
int sumCPP[5];
array_view<const int, 1> a(5, aCPP);
array_view<const 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)
{
sum[idx] = a[idx] + b[idx];
}
);
for (int i = 0; i < 5; i++) {
std::cout << sum[i] << "\n";
}
}
Lambda 表达式必须包含一个索引参数,并且必须包括restrict(amp)。在示例中, array_viewsum对象具有排位为 1。因此,要在 lambda 语句的参数是索引有秩为 1 的对象。在运行时,lambda 表达式执行一次中每个元素, array_view 对象。有关更多信息,请参见 Lambda表达式语法。
Function 对象
可以挑选的加速器代码转换为函数对象。
class AdditionFunctionObject
{
public:
AdditionFunctionObject(const array_view<int, 1>& a,
const array_view<int, 1>& b,
const array_view<int, 1>& sum
)
: a(a), b(b), sum(sum)
{
}
void operator()(index<1> idx) restrict(amp)
{
sum[idx] = a[idx] + b[idx];
}
private:
array_view<int, 1> a;
array_view<int, 1> b;
array_view<int, 1> sum;
};
void AddArraysWithFunctionObject() {
int aCPP[] = {1, 2, 3, 4, 5};
int bCPP[] = {6, 7, 8, 9, 10};
int sumCPP[5];
array_view<const int, 1> a(5, aCPP);
array_view<const int, 1> b(5, bCPP);
array_view<int, 1> sum(5, sumCPP);
sum.discard_data();
parallel_for_each(
sum.extent,
AdditionFunctionObject(a, b, sum)
);
for (int i = 0; i < 5; i++) {
std::cout << sum[i] << "\n";
}
}
该函数的对象必须包含一个构造函数,并且必须包括函数调用运算符的重载。函数调用运算符必须包括一个索引参数。作为第二个参数传递的函数对象的实例 parallel_for_each 方法。在此示例中,三个 array_view 对象传递给函数的对象构造函数。Array_view 对象sum其排位为 1。因此,函数调用运算符的参数是索引有秩为 1 的对象。在运行时,该函数执行一次每个元素中 array_view 对象。有关更多信息,请参见函数调用(C++)和 函数对象。
C + + 的受限制存储系统函数
可以通过创建受限制的功能,并调用此方法从 lambda 表达式或函数对象,进一步挑选加速器代码。下面的代码示例演示如何从 lambda 表达式中调用受限制的功能。
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)
{
AddElements(idx, sum, a, b);
}
);
for (int i = 0; i < 5; i++) {
std::cout << sum[i] << "\n";
}
}
受限制的功能必须包括restrict(amp) ,并且符合所述的限制限制子句 (C++ AMP)。