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_eachfor_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

命名空间: 并发

请参见

参考

Concurrency 命名空间 (C++ AMP)