Share via


parallel_for_each-Funktion (C++ AMP)

Führt die Funktion über die Compute-Domäne.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
    Die accelerator_view Objekt parallele Berechnung auf ausführen.

  • _Compute_domain
    Ein extent -Objekt, das die Daten für die Berechnung enthält.

  • _Dim0
    Die Dimension der tiled_extent Objekt.

  • _Dim1
    Die Dimension der tiled_extent Objekt.

  • _Dim2
    Die Dimension der tiled_extent Objekt.

  • _Kernel
    Ein Lambda-Ausdruck oder Funktion-Objekt, übernimmt ein Argument vom Typ "index <_Rank>" und führt die parallele Berechnung.

  • _Kernel_type
    Ein Lambda-Ausdruck oder eine Functor.

  • _Rank
    Der Rang des Wertebereichs.

Hinweise

Die parallel_for_each Funktion startet Daten Parallel-Berechnungen auf Accelerator-Geräten.Das grundlegende Verhalten von parallel_for_each ist wie die for_each, der eine Funktion für jedes Element, das in einem Container ausgeführt wird.Die grundlegenden Komponenten in einem Aufruf von parallel_for_each sind ein Domäne berechnen, ein Index, und ein Kernel-Funktion.Wenn parallel_for_each parallel-Aktivität wird ausgeführt, für jeden Index in der Compute-Domäne.Die parallele-Aktivität können Sie die Elemente in den Eingabe- oder Arrays zugreifen.Ein Aufruf von parallel_for_each verhält sich so, als ob es synchron ist.In der Praxis ist der Aufruf asynchron, da es auf einem separaten Gerät ausgeführt wird.Es gibt keine Garantien in Bezug auf die Reihenfolge und die Parallelität der parallelen Aktivitäten ausführen, indem Sie die nicht nebeneinander parallel_for_each.Aktivitäten nur mithilfe von atomare Funktionen kommunizieren.

Gekachelte Version des parallel_for_each organisiert die parallelen Aktivitäten in Kacheln unterteilt, die eine feste Größe und 1, 2 oder 3 Dimensionen, wie angegeben in der tiled_extent Argument.Threads in denselben Abschnitt haben Sie Zugriff auf alle Variablen, die mit der Tile_static Schlüsselwort.Können Sie die tile_barrier::wait-Methode Methode zum Synchronisieren des Zugriffs auf Variablen, die mit der Tile_static Schlüsselwort.Die folgenden Einschränkungen gelten für die nebeneinander parallel_for_each:

  • Das Produkt der Kachel Umfang Dimensionen darf 1024 nicht überschreiten.

    • 3D: D0 * D1 * D2 ≤ 1024; und D0 ≤ 64

    • 2D: D0 * D1 ≤ 1024

    • 1D: D0 ≤ 1024

  • Gekachelte Raster als ersten Parameter bereitgestellten parallel_for_each teilbar ist, entlang der Dimensionen, durch die entsprechenden Kachel Umfang werden müssen.

Weitere Informationen finden Sie unter Verwenden von Kacheln.

Die parallel_for_each Code ausgeführt wird, klicken Sie auf eine Schnellinfo in der Regel ein GPU-Gerät.Sie können diese Accelerator explizit zu übergeben parallel_for_each als optionalen accelerator_view Parameter.Andernfalls wird die Ziel-Accelerator aus den Objekten des Typs ausgewählt array<T,N> , die in der Kernfunktion erfasst werden.Wenn alle Arrays die gleiche Accelerator gebunden sind, wird eine Ausnahme ausgelöst.Die tiled_index an den Kernel übergebene Argument enthält eine Auflistung von Indizes, einschließlich derjenigen, die relativ zum aktuellen Ziegel.

Die _Kernel Parameter von der parallel_for_each Funktion muss ein Lambda-Ausdruck oder der Function-Objekt sein.Um auf eine Schnellinfo ausführen, muss der Lambda-Ausdruck enthalten die restrict(amp) -Klausel, obwohl es zusätzliche Einschränkungen verfügen kann.Beschränkungsklausel gelten einige Beschränkungen der Kernfunktion.Weitere Informationen finden Sie unter Einschränkungs-Klausel (C++-AMP).

Sie müssen möglicherweise Aufrufen der _Kernel Argument mithilfe einer der folgenden Argumenttypen:

  • Nicht nebeneinander angeordnet: index<N>, wo N muß der gleiche Rang als die extent<N> verwendet, der parallel_for_each.

  • Nebeneinander: A tiled_index , deren Abmessungen denen des entsprechen, Objekts die tiled_extent -Objekt im Aufruf von parallel_for_each.

Die Kernfunktion zurück, void.

Da die Kernfunktion keine anderen Argumente annimmt, müssen alle anderen Daten, die vom Kernel operiert im Lambda-Ausdruck oder der Function-Objekt erfasst werden.Alle erfasste Daten müssen durch Wert, übergeben werden, mit Ausnahme von array<T,N> -Objekten, die durch Verweis oder Zeiger erfasst werden müssen.Mehrere Einschränkungen gelten auch für die Objekttypen, die erfasst werden können.Weitere Informationen finden Sie unter Einschränkungs-Klausel (C++-AMP).

Tritt ein Fehler beim Starten der parallel_for_each, Aufruf der Common Language Runtime eine Ausnahme ausgelöst.Die folgenden Gründe können Ausnahmen ausgelöst werden:

  • Fehler beim Erstellen des Shaders.

  • Fehler beim Erstellen von Puffern.

  • Ungültige Erweiterung übergeben.

  • Nicht übereinstimmende Accelerators.

Anforderungen

Header: amp.h

Namespace: Concurrency

Siehe auch

Referenz

Concurrency-Namespace (C++ AMP)