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) 子句,但是可以有其他限制。 限制子句實施了數項核心功能的限制。 如需詳細資訊,請參閱restrict (C++ AMP)

您必須可以使用下列其中一個引數類型來叫用 _Kernel 引數:

  • 非 tile:index<N>,其中 N 必須和 parallel_for_each用在extent<N> 是同一個層級。

  • 並排:tiled_index 物件,其維度與用於呼叫 parallel_for_eachtiled_extent 物件的維度相符

核心功能必須傳回 void

因為核心功能不接受任何其他引數,核心操作的所有其他資訊都必須是在 Lambda 或函式物件中擷取的。 除了必須以傳址方式或使用指標擷取的 array<T,N> 物件以外,所有擷取的資料都必須以傳值方式傳遞。 數項限制對於可擷取的物件類型也適用。 如需詳細資訊,請參閱restrict (C++ AMP)

如果在嘗試啟動 parallel_for_each時發生錯誤,則呼叫執行階段會擲回例外狀況。下列原因可能會擲回例外狀況:

  • 無法建立著色器。

  • 無法建立緩衝區。

  • 傳遞無效的範圍。

  • 不相符的加速器。

標頭:amp.h

命名空間:並行

Concurrency 命名空間 (C++ AMP)

顯示: