람다, 함수 개체 및 제한 함수 사용
액셀러레이터에서 실행하려는 C++ AMP 코드는 메서드 호출 parallel_for_each
에서 인수로 지정됩니다. 람다 식 또는 함수 개체(functor)를 해당 인수로 제공할 수 있습니다. 또한 람다 식 또는 함수 개체는 C++ AMP 제한 함수를 호출할 수 있습니다. 이 항목에서는 배열 추가 알고리즘을 사용하여 람다, 함수 개체 및 제한된 함수를 보여 줍니다. 다음 예제에서는 C++ AMP 코드가 없는 알고리즘을 보여줍니다. 길이가 같은 두 개의 1차원 배열이 만들어집니다. 해당 정수 요소가 추가되고 세 번째 1차원 배열에 저장됩니다. C++ AMP는 사용되지 않습니다.
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";
}
}
람다 식
람다 식을 사용하는 것이 C++ AMP를 사용하여 코드를 다시 작성하는 가장 직접적인 방법입니다.
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";
}
}
람다 식은 하나의 인덱싱 매개 변수를 포함해야 하며 포함 restrict(amp)
해야 합니다. 이 예제 에서 array_viewsum
개체의 순위는 1입니다. 따라서 람다 문에 대한 매개 변수는 순위가 1인 인덱 스 개체입니다. 런타임에 람다 식은 array_view 개체의 각 요소에 대해 한 번 실행됩니다. 자세한 내용은 람다 식 구문을 참조하세요.
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++ 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)
{
AddElementsWithRestrictedFunction(idx, sum, a, b);
});
for (int i = 0; i <5; i++) {
std::cout <<sum[i] <<"\n";
}
}
제한된 함수는 제한(C++ AMP)에 설명된 제한을 포함하고 restrict(amp)
준수해야 합니다.
참고 항목
C++ AMP(C++ Accelerated Massive Parallelism)
람다 식 구문
함수 호출
C++ 표준 라이브러리의 함수 개체
restrict(C++ AMP)