Compartilhar via


parallel_for_each função (AMP C++)

Executa uma função através do domínio do cálculo.Para obter mais informações, consulte Visão geral do 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
    O objeto accelerator_view para executar a computação paralela.

  • _Compute_domain
    Um objeto extent que contém os dados para o cálculo.

  • _Dim0
    A dimensão do objeto tiled_extent.

  • _Dim1
    A dimensão do objeto tiled_extent.

  • _Dim2
    A dimensão do objeto tiled_extent.

  • _Kernel
    Um objeto lambda ou função que recebe um argumento do tipo "index<_Rank>" e executa o cálculo paralelo.

  • _Kernel_type
    Um lambda ou functor.

  • _Rank
    A classificação da extensão.

Comentários

A função parallel_for_each começa os cálculos de dados paralelos em dispositivos de aceleração.O comportamento básico do parallel_for_each é como o do for_each, o qual executa uma função em cada elemento que está em um contêiner.Os componentes básicos em uma chamada para parallel_for_each são um domínio de cálculo, um índice, e uma função de kernel.Quando parallel_for_each é executado, uma atividade paralela é executada para cada índice no domínio do cálculo.Você pode usar a atividade paralela para acessar os elementos em matrizes de entrada ou saída.Uma chamada para parallel_for_each se comporta como se fosse síncrona.Na prática, a chamada é assíncrona porque é executado em um dispositivo separado.Não há nenhuma garantia sobre a ordem e concorrência das atividades paralelas executadas pelo não disposto lado-a-lado parallel_for_each.Atividades somente se comunicam usando funções atômicas.

A versão lado-a-lado do parallel_for_each organiza as atividades paralelas nos tiles que têm um tamanho fixo e 1, 2 ou 3 dimensões, conforme especificado no argumento tiled_extent.Threads no mesmo bloco tem acesso a todas as variáveis declaradas com a palavra-chave tile_static.Você pode usar o método Método de tile_barrier::wait para sincronizar acesso à variáveis declaradas com a palavra-chave tile_static.As seguintes limitações se aplicam ao parallel_for_eachlado-a-lado:

  • O produto das dimensões de extensão lado a lado não pode exceder 1024.

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

    • 2D: D0 * D1 ≤ 1024

    • 1D: D0 ≤ 1024

  • A grade lado-a-lado fornecida como o primeiro parâmetro para parallel_for_each deve ser divisível, ao longo de cada uma das suas dimensões, pela extensão lado a lado correspondente.

Para obter mais informações, consulte Usando imagens.

O código parallel_for_each é executado em um acelerador, geralmente um dispositivo de GPU.Você pode passar este acelerador explicitamente para parallel_for_each como um parâmetro opcional accelerator_view.Caso contrário, o acelerador de destino é escolhido de objetos do tipo array<T,N> que são capturados na função do kernel.Se todas as matrizes não estão associadas ao mesmo acelerador, uma exceção é lançada.O argumento tiled_index passado para o kernel contém uma coleção de índices, incluindo aqueles que são relativos ao quadro atual.

O parâmetro _Kernel da função parallel_for_each deve ser um lambda ou função objeto.Para executar um acelerador, o lambda deve incluir a cláusula restrict(amp) , embora possa ter restrições adicionais.A cláusula da restrição impõe várias limitações da função do kernel.Para obter mais informações, consulte Cláusula de restrição (AMP C++).

Você deve ser capaz de chamar o argumento _Kernel usando um dos seguintes tipos de argumento:

  • Sem disposição lado-a-lado: index<N>, onde N deve ser da mesma ordem que extent<N> usado em parallel_for_each.

  • Com disposição lado-a-lado: Um objeto tiled_index cujas as dimensões correspondessem as do objeto tiled_extent usado na chamada para parallel_for_each.

A função do kernel deve retornar void.

Como a função do kernel não recebe nenhum outro argumento, quaisquer outros dados operados pelo kernel devem ser capturados no lambda ou na função objeto.Todos os dados capturados devem ser passado por valor, exceto para objetos array<T,N> , que devem ser capturados por referência ou ponteiro.Várias restrições também se aplicam nos tipos de objeto que podem ser capturados.Para obter mais informações, consulte Cláusula de restrição (AMP C++).

Se ocorrer um erro ao tentar iniciar parallel_for_each, chamar o tempo de execução gera uma exceção.Exceções podem ser lançadas pelas seguintes razões:

  • Falha ao criar o shader.

  • Falha ao criar buffers.

  • Extensão passada inválida.

  • Aceleradores incompatíveis.

Requisitos

Cabeçalho: amp.h

Namespace: Concurrency

Consulte também

Referência

Namespace de simultaneidade (AMP C++)