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
Einschränkungs-Klausel (C++-AMP)