다음을 통해 공유


람다, 함수 개체 및 제한 함수 사용

액셀러레이터에서 실행하려는 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)