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

命名空间: 并发

请参见

参考

Concurrency 命名空间 (C++ AMP)