parallel_for_each-Funktion (C++ AMP)
Führt eine Funktion übergreifend über die "compute"-Domäne aus. Weitere Informationen finden Sie unter Übersicht über C++ AMP.
template <
int _Rank,
typename _Kernel_type
>
void parallel_for_each(
const extent<_Rank>& _Compute_domain,
const _Kernel_type &_Kernel
);
template <
int _Dim0,
int _Dim1,
int _Dim2,
typename _Kernel_type
>
void parallel_for_each(
const tiled_extent<_Dim0, _Dim1, _Dim2>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Dim0,
int _Dim1,
typename _Kernel_type
>
void parallel_for_each(
const tiled_extent<_Dim0, _Dim1>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Dim0,
typename _Kernel_type
>
void parallel_for_each(
const tiled_extent<_Dim0>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Rank,
typename _Kernel_type
>
void parallel_for_each(
const accelerator_view& _Accl_view,
const extent<_Rank>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Dim0,
int _Dim1,
int _Dim2,
typename _Kernel_type
>
void parallel_for_each(
const accelerator_view& _Accl_view,
const tiled_extent<_Dim0, _Dim1, _Dim2>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Dim0,
int _Dim1,
typename _Kernel_type
>
void parallel_for_each(
const accelerator_view& _Accl_view,
const tiled_extent<_Dim0, _Dim1>& _Compute_domain,
const _Kernel_type& _Kernel
);
template <
int _Dim0,
typename _Kernel_type
>
void parallel_for_each(
const accelerator_view& _Accl_view,
const tiled_extent<_Dim0>& _Compute_domain,
const _Kernel_type& _Kernel
);
Parameter
_Accl_view
Das accelerator_view-Objekt, auf dem die parallele Berechnung ausgeführt werden soll._Compute_domain
Ein extent-Objekt, das die Daten für die Berechnung enthält._Dim0
Die Dimension des tiled_extent-Objekts._Dim1
Die Dimension des tiled_extent-Objekts._Dim2
Die Dimension des tiled_extent-Objekts._Kernel
Ein Lambda- oder Funktionsobjekt, das ein Argument des Typs "index<_Rank>" akzeptiert und die parallele Berechnung ausführt._Kernel_type
Ein Lambda- oder Funktionselement._Rank
Der Rang des Wertebereichs.
Hinweise
Die parallel_for_each-Funktion startet datenparallele Berechnungen auf Zugriffstastengeräten. Das grundlegende Verhalten von parallel_for_each entspricht dem von for_each. Hiermit wird eine Funktion für jedes Element ausgeführt, das sich in einem Container befindet. Die grundlegenden Komponenten in einem Aufruf von parallel_for_each sind eine Berechnungsdomäne, ein Index und eine Kernelfunktion. Wenn parallel_for_each ausgeführt wird, wird eine parallele Aktivität für jeden Index in der Berechnungsdomäne ausgeführt. Sie können die parallele Aktivität verwenden, um auf Elemente in den Eingabe- oder Ausgabearrays zuzugreifen. Ein Aufruf von parallel_for_each verhält sich so, als sei er synchron. In der Praxis ist der Aufruf asynchron, da er auf einem separaten Gerät ausgeführt wird. Es gibt keine Garantien bezüglich der Reihenfolge und Nebenläufigkeit der parallelen Aktivitäten, die von der nicht angeordneten parallel_for_each-Funktion ausgeführt werden. Aktivitäten kommunizieren nur mithilfe von atomischen Funktionen.
Mit der unterteilten Version von parallel_for_each werden die Aktivitäten in Kacheln organisiert, die eine feste Größe und 1, 2 oder 3 Dimensionen haben, wie im tiled_extent-Argument angegeben. Threads in derselben Kachel haben Zugriff auf alle Variablen, die mit dem tile_static-Schlüsselwort deklariert werden. Sie können die tile_barrier::wait-Methode-Methode verwenden, um Zugriff auf die Variablen zu synchronisieren, die mit dem tile_static-Schlüsselwort deklariert werden. Für die unterteilte parallel_for_each-Funktion gelten die folgenden Beschränkungen:
Das Produkt der Kachelwertebereichsdimensionen darf 1024 nicht übersteigen.
3D: D0 * D1 * D2 ≤ 1024; und D0 ≤ 64
2D: D0 * D1 ≤ 1024
1D: D0 ≤ 1024
Das unterteilte Raster, das als erster Parameter für parallel_for_each bereitgestellt wird, muss entlang seiner Dimensionen durch den entsprechenden Kachelwertebereich teilbar sein.
Weitere Informationen finden Sie unter Verwenden von Kacheln.
Der parallel_for_each-Code wird auf einer Zugriffstaste, normalerweise ein GPU-Gerät, ausgeführt. Sie können diese Zugriffstaste an parallel_for_each als optionalen accelerator_view-Parameter explizit übergeben. Andernfalls wird die Zielzugriffstaste von Objekten des Typs array<T,N> ausgewählt, die in der Kernelfunktion aufgezeichnet werden. Wenn alle Arrays nicht an dieselbe Zugriffstaste gebunden werden, wird eine Ausnahme ausgelöst. Das tiled_index-Argument, das dem Kernel übergeben wird, enthält eine Auflistung von Indizes, einschließlich derjenigen, die relativ zur aktuellen Kachel sind.
Der _Kernel-Parameter der parallel_for_each-Funktion muss ein Lambda- oder Funktionsobjekt sein. Um auf einer Zugriffstaste ausgeführt zu werden, muss das Lambda-Objekt die restrict(amp)-Klausel enthalten, wobei zusätzliche Einschränkungen gelten können. Die Einschränkungsklausel erlegt der Kernelfunktion einige Einschränkungen auf. Weitere Informationen finden Sie unter Einschränkungs-Klausel (C++-AMP).
Es muss möglich sein, das Argument _Kernel aufzurufen, indem Sie einen der folgenden Argumenttypen verwenden:
Nicht angeordnet: index<N>, wobei N den gleichen Rang wie extent<N> aufweisen muss, der in parallel_for_each verwendet wird.
Nebeneinander angeordnet: Ein tiled_index-Objekt, dessen Dimensionen mit denen des tiled_extent-Objekts übereinstimmen, das im Aufruf von parallel_for_each verwendet wurde.
Die Kernelfunktion muss void zurückgeben.
Da die Kernelfunktion keine anderen Argumente akzeptiert, müssen alle anderen Daten, die vom Kernel bearbeitet werden, im Lambda- oder Funktionsobjekt aufgezeichnet werden. Alle aufgezeichneten Daten müssen mithilfe eines Werts übergeben werden. Eine Ausnahme bilden array<T,N>-Objekte, die mithilfe eines Verweises oder Zeigers aufgezeichnet werden müssen. Einige Einschränkungen gelten auch für die Objekttypen, die aufgezeichnet werden können. Weitere Informationen finden Sie unter Einschränkungs-Klausel (C++-AMP).
Wenn ein Fehler beim Versuch auftritt, den parallel_for_each-Aufruf zu starten, löst die Laufzeit eine Ausnahme aus. Ausnahmen können aus folgenden Gründen ausgelöst werden:
Fehler beim Erstellen des Shader.
Fehler beim Erstellen von Puffern.
Ungültiger Wertebereich übergeben.
Nicht übereinstimmende Zugriffstasten.
Anforderungen
Header: amp.h
Namespace: Nebenläufigkeit