Share via


Verwenden von Lambdas, Function-Objekten und eingeschränkten Funktionen

AMP C++-Code, die Sie auf das Gaspedal ausführen möchten wird angegeben, als Argument in einem Aufruf der Parallel_for_each Methode.Sie können einen Lambda-Ausdruck oder eine Function-Objekt (Functor) als das Argument angeben.Darüber hinaus kann das Lambda-Ausdrucks oder Funktionsaufrufs Objekt eine C++ AMP-eingeschränkte Funktion aufrufen.In diesem Thema verwendet einen Array-Zusatz-Algorithmus, um Lambda-Ausdrücke, Function-Objekte und eingeschränkte Funktionen zu demonstrieren.Das folgende Beispiel zeigt den Algorithmus ohne AMP C++-Code.Es werden zwei eindimensionale Arrays von gleicher Länge erstellt.Die entsprechenden Integer-Elemente werden hinzugefügt und in einem dritten 1-dimensionales Array gespeichert.C++ AMP wird nicht verwendet.

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-Ausdruck

Mit einem Lambda-Ausdruck ist der direkteste Weg zu C++ AMP zu verwenden, um den Code umzuschreiben.

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";
    }
}

Der Lambda-Ausdruck muss eine Indizierung Parameter enthalten und muss über restrict(amp).Im Beispiel der Array_viewsum Objekt hat einen Rang von 1.Daher der Parameter der Lambda-Anweisung ist ein Index -Objekt, Rang 1 hat.Während der Laufzeit der Lambda-Ausdruck einmal ausgeführt wird für jedes Element in der Array_view Objekt.Weitere Informationen finden Sie unter Lambda-Ausdruckssyntax.

Function-Objekt

Sie können den Accelerator-Code in ein Funktionsobjekt Faktor.

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";
    }
}

Das Function-Objekt muss über einen Konstruktor und eine Überladung der Funktionsaufrufoperator enthalten.Der Funktionsaufrufoperator muss eine index-Parameter enthalten.Eine Instanz des Function-Objekts wird übergeben, als das zweite Argument für die Parallel_for_each Methode.In diesem Beispiel drei Array_view Objekte an den Konstruktor der Function-Objekt übergeben werden.Die Array_view Object sum hat einen Rang von 1.Der Parameter für den Funktionsaufrufoperator deshalb eine Index -Objekt, Rang 1 hat.Zur Laufzeit, die Funktion einmal ausgeführt wird für jedes Element in der Array_view Objekt.Weitere Informationen finden Sie unter Funktionsaufruf (C++) und Function Objects.

C++ AMP-eingeschränkte Funktion

Sie können den Accelerator-Code weiter Faktor, durch eine eingeschränkte Funktion erstellen und Aufrufen von Lambda-Ausdruck oder eine Function-Objekt.Im folgenden Codebeispiel wird veranschaulicht, wie eine eingeschränkte Funktion aufrufen, indem Sie einen Lambda-Ausdruck.

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";
    }
}

Die eingeschränkte Funktion umfaßt restrict(amp) und den Einschränkungen entsprechen, die in beschriebenen Einschränkungs-Klausel (C++-AMP).

Siehe auch

Referenz

Lambda-Ausdruckssyntax

Funktionsaufruf (C++)

Einschränkungs-Klausel (C++-AMP)

Konzepte

Function Objects

Weitere Ressourcen

C++ AMP (C++ Accelerated Massive Parallelism)