parallel_for_each funkcji (C++ AMP)
Uruchamia funkcję w całej domenie obliczeń.Aby uzyskać więcej informacji, zobacz Omówienie AMP C++.
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
);
Parametry
_Accl_view
Obiekt accelerator_view na którym należy uruchomić równoległe obliczenia._Compute_domain
Obiekt extent zawierający dane do obliczeń._Dim0
Wymiar obiektu tiled_extent._Dim1
Wymiar obiektu tiled_extent._Dim2
Wymiar obiektu tiled_extent._Kernel
Wyrażenie lambda lub obiekt funkcji, który przyjmuje argumenty typu "index<_Rank>" i wykonuje obliczenia równoległe._Kernel_type
Wyrażenie lambda lub funktor._Rank
Liczba wymiarów zakresu.
Uwagi
Funkcja parallel_for_each rozpoczyna obliczenia równoległe na danych na urządzeniach akceleratora.Podstawowym zachowaniem parallel_for_each jest podobne do metody for_each, która wykonuje funkcję na każdym elemencie w kontenerze.Podstawowymi składnikami w wywołaniu parallel_for_each są domena obliczeń, indeks i funkcja jądra.Gdy parallel_for_each jest uruchamiana, aktywność równoległa jest uruchamiana dla każdego indeksu w domenie obliczeń.Można użyć aktywności równoległej, aby uzyskać dostęp do elementów w tablicy wejściowej lub wyjściowej.Wywołanie parallel_for_each zachowuje się tak jakby było synchroniczne.W praktyce wywołanie jest asynchroniczne, ponieważ jest uruchamiane na oddzielnym urządzeniu.Nie ma żadnej gwarancji dotyczącej kolejności i współbieżności równoległych aktywności uruchamianych przez nie fragmentującą metodę parallel_for_each.Aktywności komunikują się tylko za pomocą funkcji niepodzielnych.
Wersja metody parallel_for_each, która używa fragmentacji, organizuje równoległe aktywności we fragmenty, o stałym rozmiarze i o 1, 2 lub 3 wymiarach, jak określono w argumencie tiled_extent.Wątki w tym samym fragmencie mają dostęp do każdej zmiennej zadeklarowanej ze słowem kluczowym tile_static.Można użyć metody Metoda tile_barrier::wait aby zsynchronizować dostęp do zmiennych zadeklarowanych ze słowem kluczowym tile_static.Następujące ograniczenia mają zastosowanie w metodzie parallel_for_each używającej fragmentacji:
Produkt wymiarów rozmiaru fragmentu nie może przekraczać 1024.
3D: D0 * D1 * D2 ≤ 1024; i D0 ≤ 64
2D: D0 * D1 ≤ 1024
1D: D0 ≤ 1024
Siatka poddana fragmentacji, podana jako pierwszy parametr do parallel_for_each musi być podzielny po każdym jego wymiarze przez odpowiedni rozmiar fragmentu.
Aby uzyskać więcej informacji, zobacz Za pomocą płytki.
Kod parallel_for_each jest uruchamiany na akceleratorze, zwykle urządzeniu GPU.Akcelerator ten można przekazać jawnie do parallel_for_each jako opcjonalny parametr accelerator_view.W przeciwnym razie akcelerator docelowy jest wybierany z obiektów typu array<T,N> przechwyconych w funkcji jądra.Jeśli wszystkie tablice nie są związane z tym samym akceleratorem następuje wyrzucenie wyjątku.Argument tiled_index przekazywany do jądra zawiera zbiór indeksów, łącznie z tymi, które są powiązane z bieżącym fragmentem.
Parametr _Kernel funkcji parallel_for_each musi być obiektem lambda lub funkcyjnym.Aby uruchomić akcelerator, lambda musi zawierać klauzulę restrict(amp), jednakże może mieć też dodatkowe ograniczenia.Klauzula ograniczająca nakłada kilka ograniczeń funkcji jądra.Aby uzyskać więcej informacji, zobacz Klauzula ograniczenia (C++ AMP).
Trzeba być w stanie wywołać argument _Kernel za pomocą jednego z następujących typów argumentów:
Bez użycia fragmentacji: index<N>, gdzie N musi mieć tyle samo wymiarów co extent<N> używane w parallel_for_each.
Przy użyciu fragmentacji: Obiekt tiled_index, którego wymiary odpowiadają tiled_extent obiektowi użytym w wywołaniu parallel_for_each.
Funkcja jądra musi zwracać void.
Ponieważ funkcja jądra nie przyjmuje żadnych innych argumentów, wszystkie inne dane przetwarzane przez jądro muszą być ujęte w obiekcie lambda lub funkcyjnym.Wszystkie ujęte dane muszą być przekazywane przez wartość, z wyjątkiem obiektów array<T,N>, które muszą być przekazane przez odwołanie lub wskaźnik.Kilka ograniczeń stosuje się również na typy obiektów, które mogą być ujęte.Aby uzyskać więcej informacji, zobacz Klauzula ograniczenia (C++ AMP).
Jeśli wystąpi błąd podczas próby uruchomienia parallel_for_each, wywołanie wykonania zgłasza wyjątek.Wyjątki mogą być zgłoszone z następujących przyczyn:
Nie można utworzyć modułu cieniującego.
Nie można utworzyć buforów.
Przekazano nieprawidłowy zakres.
Niedopasowane akceleratory.
Wymagania
Nagłówek: amp.h
Przestrzeń nazw: Concurrency