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>”参数并执行并行计算的 lambda 或函数对象。_Kernel_type
lambda 或仿函数。_Rank
范围的等级。
备注
parallel_for_each 函数在快捷键设备上启动数据并行计算。 parallel_for_each 基本行为类似 for_each,它针对容器内的每个元素运行一个函数。 parallel_for_each 调用的基本组件是计算域、索引和内核函数。 当 parallel_for_each 运行时,计算域中针对每个索引运行一个并行活动。 您可使用并行活动来访问输入或输出数组中的元素。 将 parallel_for_each 当成同步一样进行调用。 实际上,因为调用在单独的设备上运行,所以它是异步的。 我们对由未平铺的 parallel_for_each 运行的并行活动的顺序和并发不做任何保证。 活动仅能通过使用原子功能进行通信。
parallel_for_each 将并行操作组织成平铺式,其具有固定的大小和 1、2 或 3 维度,正如 tiled_extent 参数指定。 同一平铺中的线程可以访问用 tile_static 关键字声明的任何变量。 您可使用 tile_barrier::wait 方法 方法来同步对用 tile_static 关键字声明的变量的访问。 下列限制适用于平铺的 parallel_for_each:
平铺区域维度的产品不能超过 1024。
三维:D0 x D1 x 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 参数。
非图标: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
命名空间: 并发