parallel_for_each – funkce (C++ AMP)
Spustí funkci napříč výpočetní doménou.Další informace naleznete v tématu Přehled produktu 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
);
Parametry
_Accl_view
Objekt accelerator_view, na kterém se spustí paralelní výpočet._Compute_domain
Objekt extent, který obsahuje data pro výpočet._Dim0
Dimenze objektu tiled_extent._Dim1
Dimenze objektu tiled_extent._Dim2
Dimenze objektu tiled_extent._Kernel
Výraz lambda nebo objekt funkce, který má argument typu "index<_Rank>" a provádí paralelní výpočet._Kernel_type
Výraz lambda nebo funktor._Rank
Řád rozsahu.
Poznámky
Funkce parallel_for_each začíná datově paralelní výpočty na zařízeních akcelerátoru.Základní chování parallel_for_each je například jako chování for_each, které spustí funkci na každý prvek v kontejneru.Základní komponentou ve volání parallel_for_each jsou compute domain, index a kernel function.Při běhu parallel_for_each se pro každý index ve výpočetní doméně spustí paralelní aktivita.Lze použít paralelní aktivity k přístupu k elementům ve vstupních nebo výstupních polích.Volání parallel_for_each se chová, jako by bylo synchronní.V praxi je volání asynchronní, protože běží na samostatném zařízení.Neexistují žádné záruky v rámci pořadí a souběžnosti paralelních činností, které jsou spuštěné nerozdělovaným parallel_for_each.Činnosti komunikují pouze pomocí atomických funkcí.
Rozdělovaná verze parallel_for_each paralelní činnosti uspořádává do částí, které mají pevnou velikost a 1, 2 nebo 3 dimenze, podle argumentu tiled_extent.Vlákna ve stejné části mají přístup k libovolné proměnné deklarované s klíčovým slovem tile_static.Lze použít metodu tile_barrier::wait – metoda k synchronizaci přístupu k proměnné deklarované s klíčovým slovem tile_static.Platí následující omezení pro rozdělovanou verzi parallel_for_each:
Produkt části rozsahu dimenze nesmí přesáhnout 1024.
3D: D0 * D1 * D2 ≤ 1024; a D0 ≤ 64
2D: D0 * D1 ≤ 1024
1D: D0 ≤ 1024
Mřížka částí, pokud je první parametr parallel_for_each, musí být dělitelná odpovídajícím rozsahem dlaždice podél každé své dimenze.
Další informace naleznete v tématu Používání bloků.
Kód parallel_for_each běží na akcelerátoru, obvykle zařízení GPU.Můžete předat tento akcelerátor explicitně na parallel_for_each jako volitelný parametr accelerator_view.Jinak je cílový akcelerátor vybrán z objektů typu array<T,N>, které jsou ukládány do funkce jádra.Pokud nejsou všechna pole vázána na stejný akcelerátor, je vyvolána výjimka.Argument tiled_index předaný do jádra obsahuje kolekci indexů, včetně těch, které se vztahují k aktuální části.
Parametr _Kernel funkce parallel_for_each musí být výraz lambda nebo objekt funkce.Pro spuštění na akcelerátoru, musí výraz lambda zahrnovat klauzuli restrict(amp), ačkoli může mít i další omezení.Klauzule omezení zavádí několik omezení funkce jádra.Další informace naleznete v tématu Klauzule omezení (C++ AMP).
Musí být možno vyvolat argument _Kernel pomocí jednoho z následujících typů argumentů:
Nerozdělovaná verze: index<N>, kde N musí být stejného řádu jako extent<N> v parallel_for_each.
Rozdělované: Objekt tiled_index, jehož rozměry odpovídají objektu tiled_extent použitému při volání parallel_for_each.
Funkce jádra musí vrátit void.
Protože funkce jádra nepřijímá další argumenty, všechna ostatní data provozovaná jádrem musí být zachycena ve výrazu lambda nebo objektu funkce.Všechna sebraná data musejí být předána podle hodnoty, s výjimkou objektu array<T,N>, který musí být zachycen odkazem nebo ukazatelem.Několik omezení se vztahuje rovněž na typy objektů, které lze zachytit.Další informace naleznete v tématu Klauzule omezení (C++ AMP).
Pokud dojde k chybě při pokusu o spuštění parallel_for_each, volání modulu runtime vyvolá výjimku. Výjimky mohou být vyvolány z následujících důvodů:
Chyba při vytváření shaderu.
Chyba při vytváření vyrovnávacích pamětí.
Při předání neplatného rozsahu.
Neshodné akcelerátory.
Požadavky
Hlavička: amp.h
Obor názvů: Souběžnost