parallel_for_each 関数 (C++ AMP)
計算ドメインを越えて関数を実行します。 詳細については、「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>" の引数を取り、並列計算を実行するラムダまたは関数オブジェクト。_Kernel_type
ラムダまたはファンクタ。_Rank
範囲のランク。
解説
parallel_for_each 関数は、アクセラレータ デバイスでデータ並列計算を開始します。 parallel_for_each の基本的な動作は、コンテナー内にある各要素に対して関数を実行する for_each と同様です。 parallel_for_each への呼び出しの基本コンポーネントは、計算ドメイン、インデックス、およびカーネル関数です。 parallel_for_each が実行されると、並列アクティビティが計算ドメインの各インデックスに対して実行されます。 並列アクティビティを使用すると、入力または出力配列の要素にアクセスできます。 parallel_for_each の呼び出しは同期されているかのように動作します。 別のデバイスで実行されるため、実際には呼び出しは非同期です。 非タイルの parallel_for_each で実行される並列アクティビティの順序と同時実行についての保証はありません。 アクティビティはアトミック関数のみを使用して伝達されます。
parallel_for_each のタイル化されたバージョンは、tiled_extent 引数に指定されるように、固定サイズで 1、2、または 3 次元のタイルに並列アクティビティを編成します。 同じタイルのスレッドは、tile_static キーワードで宣言された変数にアクセスできます。 tile_barrier::wait メソッド メソッドを使用して、tile_static キーワードで宣言された変数へのアクセスを同期することができます。 次の制限はタイル化された parallel_for_each に適用します。
タイルの範囲の次元の積は 1024 を超えることはできません。
3D: D0 * D1 * D2 ≤ 1024; and 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 パラメーターは、ラムダまたは関数オブジェクトである必要があります。 アクセラレータで実行するには、ラムダには追加の制限が存在する可能性がありますが、restrict(amp) 句を含む必要があります。 制限句では、カーネル関数の複数の制限が適用されます。 詳細については、「制限の句 (C++ AMP)」を参照してください。
次の引数の型の 1 つを使用して _Kernel 引数を呼び出すことができる必要があります。
非タイル: N が parallel_for_each で使用される extent<N> と同じランクである必要がある場合、index<N>。
タイル: 次元が parallel_for_each への呼び出しで使用する tiled_extent オブジェクトの次元と一致する tiled_index オブジェクト。
カーネル関数は void を返す必要があります。
カーネル関数は他の引数を受け取らないため、カーネルで操作されるその他のすべてのデータはラムダまたは関数オブジェクトでキャプチャされる必要があります。 すべてのキャプチャされたデータは、参照またはポインターによってキャプチャされる必要のある array<T,N> オブジェクトを除き、値渡しされる必要があります。 複数の制限はキャプチャできるオブジェクト型にも適用されます。 詳細については、「制限の句 (C++ AMP)」を参照してください。
parallel_for_each を開始しようとしたときにエラーが発生した場合、ランタイムを呼び出すと例外がスローされます。例外は次の理由でスローされます。
シェーダーを作成できない。
バッファーを作成できない。
渡された範囲が無効。
アクセラレータが一致しない。
必要条件
ヘッダー: amp.h
名前空間: Concurrency