parallel_for_each (Función) (C++ AMP)

Ejecuta una función en el dominio de cálculo.Para obtener más información, vea Información general sobre 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                     
);

Parámetros

  • _Accl_view
    El objeto accelerator_view para ejecutar sobre el cálculo en paralelo.

  • _Compute_domain
    Un objeto de extent que contiene los datos para el cálculo.

  • _Dim0
    La dimensión del objeto de tiled_extent .

  • _Dim1
    La dimensión del objeto de tiled_extent .

  • _Dim2
    La dimensión del objeto de tiled_extent .

  • _Kernel
    Un objeto de función o lambda que toma un argumento de tipo “index<_Rank>” y realiza el cálculo en paralelo.

  • _Kernel_type
    Una lambda o funtor.

  • _Rank
    El rango de la extensión.

Comentarios

La función parallel_for_each inicia los cálculos en paralelo de datos en dispositivos aceleradores.El comportamiento básico de parallel_for_each es similar al de for_each, que ejecuta una función en cada elemento que está en un contenedor.Los componentes básicos en una llamada a parallel_for_each son un dominio de cálculo, un índice y una función del kernel.Cuando parallel_for_each se ejecuta, se ejecuta una actividad paralela para cada índice en el dominio del cálculo.Es posible utilizar la actividad paralela para acceder a los elementos de las matrices de entrada o salida.Una llamada a parallel_for_each se comporta como si fuese sincrónico.En la práctica, la llamada es asincrónica porque se ejecuta en un dispositivo independiente.No hay garantías sobre el orden y la simultaneidad de las actividades paralelas ejecutadas por parallel_for_each sin mosaicos.Las actividades solo se comunican mediante funciones atómicas.

La versión del mosaico en parallel_for_each organiza las actividades paralelas en mosaicos que tienen un tamaño fijo y las dimensiones 1, 2, ó 3, como se especifica en el argumento de tiled_extent.Los subprocesos del mismo mosaico tienen acceso a cualquier variable declarada con la palabra clave tile_static.Puede utilizar el método de tile_barrier::wait (Método) para sincronizar el acceso a las variables declaradas con la palabra clave tile_static.Las siguientes restricciones se aplican a parallel_for_each con mosaico:

  • El producto de las dimensiones de la medida del mosaico no puede ser superior a 1024.

    • 3D: D0 * D1 * D2 ≤ 1024; y D0 ≤ 64

    • 2D: D0 * D1 ≤ 1024

    • 1D: D0 ≤ 1024

  • La cuadrícula en mosaico proporcionada como primer parámetro a parallel_for_each debe ser divisible, a lo largo de cada uno de sus dimensiones, por la extensión correspondiente del mosaico.

Para obtener más información, vea Usar mosaicos.

El código de parallel_for_each se ejecuta en un acelerador, por lo general un dispositivo GPU.Puede pasar este acelerador explícitamente a parallel_for_each como un parámetro opcional de accelerator_view.De lo contrario, el acelerador de destino se selecciona de entre los objetos del tipo array<T,N> que se capturan en función del kernel.Si las matrices no están vinculadas al mismo acelerador, se produce una excepción.El argumento tiled_index pasa al kernel que contiene una colección de índices, incluidos los relativos al mosaico actual.

El parámetro _Kernel de la función parallel_for_each debe ser una expresión lambda o un objeto de función.Para ejecutar en un acelerador, la lambda debe incluir la cláusula de restrict(amp), aunque puede tener restricciones adicionales.La cláusula de restricción impone varias restricciones de la función del kernel.Para obtener más información, vea Cláusula de restricción (AMP de C++).

Se debe poder invocar el argumento _Kernel utilizando uno de los siguientes tipos de argumento:

  • Sin mosaico: index<N>, donde N debe ser el mismo rango que el extent<N> utilizado en parallel_for_each.

  • Con mosaico: Un objeto de tiled_index cuyas dimensiones coinciden con el objeto de tiled_extent utilizado en la llamada a parallel_for_each.

La función de kernel debe devolver void.

Como la función kernel no tiene otros argumentos, el resto de los datos con los que opera el kernel se deben capturar en el objeto lambda o la función.Todos los datos capturados se deben pasar por valor, a excepción de los objetos array<T,N>, que se deben capturar por referencia o por puntero.También se aplican varias restricciones a los tipos de objetos que se pueden capturar.Para obtener más información, vea Cláusula de restricción (AMP de C++).

Si se produce un error cuando intenta iniciar parallel_for_each, llame al runtime lanzando una excepción.Las excepciones pueden ser lanzadas por las siguientes razones:

  • Error al crear el sombreador.

  • Error al crear búferes.

  • Extensión pasada no válida.

  • Los aceleradores no coinciden.

Requisitos

Encabezado: amp.h

Espacio de nombres: Simultaneidad

Vea también

Referencia

Espacio de nombres de simultaneidad (C++ AMP)