parallel_for_each 函式 (C++ AMP)
在整個計算區域( compute domain )執行函式。 如需詳細資訊,請參閱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
);
參數
_Accl_view
執行平行計算的 accelerator_view 物件。_Compute_domain
包含計算所需資料的 extent 物件。_Dim0
tiled_extent 物件的維度。_Dim1
tiled_extent 物件的維度。_Dim2
tiled_extent 物件的維度。_Kernel
接受類型 "index<_Rank>" 引數並執行平行計算的 Lambda 或函式物件。_Kernel_type
lambda 或 functor。_Rank
範圍的順位。
備註
parallel_for_each 函式會在加速器裝置上啟動資料平行計算。 parallel_for_each 的基本行為和 for_each 的基本行為很類似,後者會在容器中的每個項目上執行函式。 對 parallel_for_each 的呼叫中的基本元件包括「計算網域」(Compute Domain)、「索引」(Index) 和「核心功能」(Kernel Function)。 當 parallel_for_each 執行時,平行的活動會針對計算網域中的每個索引來執行。 您可以使用平行活動來存取輸入或輸出陣列中的項目。 對 parallel_for_each 的呼叫,其表現方式就如同以同步方式運作。 實際上,這個呼叫是非同步的,因為它會在不同的裝置上執行。 對於非磚狀 parallel_for_each 所執行的平行活動的順序和並行並無任何保證。 活動只藉由使用不可部分完成的函式來通訊。
parallel_for_each 的磚狀版本會將平行活動組織成具有固定大小和 1、2 或 3 個維度的磚,如同 tiled_extent 引數中所指定。 同一個 Tile 中的執行緒可以存取任何用 tile_static 關鍵字宣告的變數。 您可以使用 tile_barrier::wait 方法 方法來同步處理存取由 tile_static 關鍵字宣告的變數。 下列限制適用於並排的 parallel_for_each:
磚範圍維度的乘積不能超過 1024。
3D:D0 * D1 * D2 ≤ 1024 且 D0 ≤ 64
2D:D0 * D1 ≤ 1024
1D:D0 ≤ 1024
做為第一個參數提供給 parallel_for_each 的磚狀格線必須可被對應的磚範圍除盡 (沿著其每一個維度)。
如需詳細資訊,請參閱使用磚。
parallel_for_each 程式碼會在加速器上執行,通常是 GPU 裝置。 您可以明確將此加速器傳遞給 parallel_for_each 做為選擇性 accelerator_view 參數。 否則,目標加速器會從在核心功能中擷取的array<T,N> 類型的物件中選擇 。 如果並非所有的陣列都繫結至相同的加速器,則會擲回例外狀況。 傳遞至核心的 tiled_index 引數包含索引集合,包括與目前磚相關的索引。
parallel_for_each 函式的 _Kernel 參數必須是 Lambda 或函式物件。 若要在加速器上執行,Lambda 必須包含 restrict(amp) 子句,但是可以有其他限制。 限制子句實施了數項核心功能的限制。 如需詳細資訊,請參閱限制子句 (C++ AMP)。
您必須可以使用下列其中一個引數類型來叫用 _Kernel 引數:
非 tile:index<N>,其中 N 必須和 parallel_for_each用在extent<N> 是同一個層級。
並排:tiled_index 物件,其維度與用於呼叫 parallel_for_each 之 tiled_extent 物件的維度相符
核心功能必須傳回 void。
因為核心功能不接受任何其他引數,核心操作的所有其他資訊都必須是在 Lambda 或函式物件中擷取的。 除了必須以傳址方式或使用指標擷取的 array<T,N> 物件以外,所有擷取的資料都必須以傳值方式傳遞。 數項限制對於可擷取的物件類型也適用。 如需詳細資訊,請參閱限制子句 (C++ AMP)。
如果在嘗試啟動 parallel_for_each時發生錯誤,則呼叫執行階段會擲回例外狀況。下列原因可能會擲回例外狀況:
無法建立著色器。
無法建立緩衝區。
傳遞無效的範圍。
不相符的加速器。
需求
**標頭:**amp.h
**命名空間:**並行