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
Lambda 或函数的对象会采用一个参数类型的"索引 <_Rank>",然后运行的并行计算。_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年。
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参数传递给内核包含的索引包括那些相对于当前平铺的集合。
_Kernel参数的parallel_for_each函数必须是 lambda 函数或函数对象。 必须在要运行的加速器,请包括 lambda restrict(amp)子句,但可以有更多的限制。 限制子句都有的内核函数的几个限制。 有关更多信息,请参见 限制子句 (C++ AMP)。
您必须能够调用_Kernel参数,使用以下参数类型之一:
非平铺: index<N>,其中N必须是相同的秩为extent<N>中使用parallel_for_each。
平铺: A tiled_index对象的尺寸匹配的tiled_extent对象的调用中使用parallel_for_each。
内核函数必须返回void。
内核函数不带任何其他参数,因为内核上运行的所有其他数据必须捕获 lambda 或函数的对象中。 所有捕获的数据必须通过值传递,除array<T,N>对象的引用或指针必须捕获。 几个限制条件上应用的对象类型可以捕获的。 有关更多信息,请参见 限制子句 (C++ AMP)。
如果试图启动时出现错误parallel_for_each,调用运行时引发异常。 由于以下原因,可以引发异常:
未能创建着色器。
无法创建缓冲区。
传递了无效的范围。
不匹配的加速键。
要求
标题: amp.h
命名空间: 并发