Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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)